最近在学习Spring AOP,其中涉及到AspectJ的AOP框架。主要参考:http://howtodoinjava.com/spring/spring-aop/spring-aop-aspectj-example-tutorial-using-annotation-config/html
在编写例子以前,先熟悉几个spring AOP中专业术语:java
1. advice,通知,就是在方法以前或者以后你须要作的事情,好比日志记录,事务之类的等等。spring
2. pointCut,切入点,主要一系列表达式app
3. join points,链接点,是为了切入点而定义出来的,pointCut对应的一系列方法框架
4. aspect, 切面, advice+pointCut,能够肯定何时(before, after, around)作事情,在哪一个点(pointCut)作jvm
在spring中主要使用代理来包裹切面,把他们织入spring管理的bean中。其中有两个方法:学习
1. 和目标类实现相同的接口测试
2. 继承目标类代理
这两种方式均可以经过jvm的检查,在执行具体的功能时仍是由目标类完成,假装类能够在此以前作一些其余的事情。日志
接下来是一个AspectJ的小例子。
首先,建立一个切面,使用@Aspect注解
@Aspect public class EmployeeCRUDAspect { @Before("execution(public * howtodoinjava.com.manager.EmployeeManager.*(..))") public void logBeforeV1(JoinPoint joinPoint) { System.out.println("EmployeeCRUDAspect.logBeforeV1() : " + joinPoint.getSignature().getName()); }
而后,对aop进行配置,applicationContext.xml文件的内容是:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- aop命名空间 --> <aop:aspectj-autoproxy /> <context:component-scan base-package="howtodoinjava.com" /> <bean id="loggingAspect" class="howtodoinjava.com.aspect.EmployeeCRUDAspect" /> </beans>
其余辅助类有EmployeeDTO.java和EmployeeManager.java
---EmployeeDTO.java
package howtodoinjava.com.manager;
import java.util.ArrayList;
import java.util.List;
import howtodoinjava.com.dto.EmployeeDTO;
import org.springframework.stereotype.Component;
@Component
public class EmployeeManager
{
public EmployeeDTO getEmployeeById(Integer employeeId) {
System.out.println("Method getEmployeeById() called");
return new EmployeeDTO();
}
public List<EmployeeDTO> getAllEmployee() {
System.out.println("Method getAllEmployee() called");
return new ArrayList<EmployeeDTO>();
}
public void createEmployee(EmployeeDTO employee) {
System.out.println("Method createEmployee() called");
}
public void deleteEmployee(Integer employeeId) {
System.out.println("Method deleteEmployee() called");
}
public void updateEmployee(EmployeeDTO employee) {
System.out.println("Method updateEmployee() called");
}
}
----EmloyeeManager.java
package howtodoinjava.com.manager; import java.util.ArrayList; import java.util.List; import howtodoinjava.com.dto.EmployeeDTO; import org.springframework.stereotype.Component; @Component public class EmployeeManager { public EmployeeDTO getEmployeeById(Integer employeeId) { System.out.println("Method getEmployeeById() called"); return new EmployeeDTO(); } public List<EmployeeDTO> getAllEmployee() { System.out.println("Method getAllEmployee() called"); return new ArrayList<EmployeeDTO>(); } public void createEmployee(EmployeeDTO employee) { System.out.println("Method createEmployee() called"); } public void deleteEmployee(Integer employeeId) { System.out.println("Method deleteEmployee() called"); } public void updateEmployee(EmployeeDTO employee) { System.out.println("Method updateEmployee() called"); } }
构建完成以后,建立测试类TestAOP.java
public class TestAOP { @SuppressWarnings("resource") public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("howtodoinjava/com/aspect/applicationContext.xml"); EmployeeManager manager = context.getBean(EmployeeManager.class); manager.getEmployeeById(1); manager.createEmployee(new EmployeeDTO()); } }
执行结果以下:
EmployeeCRUDAspect.logBeforeV1() : getEmployeeByIdMethod getEmployeeById() calledEmployeeCRUDAspect.logBeforeV1() : createEmployeeMethod createEmployee() called