AspectJ AOP例子

最近在学习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

相关文章
相关标签/搜索