2.0 spring源码学习 AOP功能测试

注:原始学习资料来自于享学课堂

新建maven,引入pom


            org.springframework
            spring-context
            5.0.6.RELEASE
        
        
            org.springframework
            spring-aspects
            5.0.6.RELEASE
        

新建一个计算类calculator,我们需要在div方法上面加上前后处理

public class Calculator {
    public int div(int i,int j){
        System.out.println("-----------计算除法中--------");
        return i/j;
    }
}

新建切面类LogAspects

@Aspect//代表这是一个切面类,加上才有效
public class LogAspects {

//在方法前后执行
    @Around("execution(public int cn.enjoy.bean.Calculator.*(..))")
    public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws  Throwable{
        System.out.println("@around 之前");
        Object o = proceedingJoinPoint.proceed();
        System.out.println("@around之后")
        ;
        return o;
    }
}

新建配置类,把LogAspects和calculator都注入到配置类中,并且打开注解@EnableAspectJAutoProxy

@Configuration
@EnableAspectJAutoProxy//切面开关
public class DemoConfig {
    @Bean
    public LogAspects logAspects() {
        return new LogAspects();
    }
    @Bean
    public Calculator calculator(){
        return new Calculator();
    }
}

测试类:

注意这里不能使用 Calculator bean = new Calculator()这种方法使用bean.div()方法,一定要冲IOC容器中或去到bean

public class DemoApp {
    public static void main(String[] args){
        AnnotationConfigApplicationContext app =
 new AnnotationConfigApplicationContext(DemoConfig.class);
        System.out.println("IOC容器初始化完成");
        Calculator bean = app.getBean(Calculator.class);
        bean.div(4,2);
        app.close();
    }
}

输出结果:

IOC容器初始化完成
@around 之前
-----------计算除法中--------
@around之后

其他的一些aop注解,以及注解的简化写法

1、不使用around,可以使用 @Before、@After、@AfterReturning、@AfterThrowing

@Aspect
public class LogAspects {
    @Around("execution(public int cn.enjoy.bean.Calculator.*(..))")
    public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws  Throwable{
        System.out.println("@around 之前");
        Object o = proceedingJoinPoint.proceed();
        System.out.println("@around之后")
        ;
        return o;
    }
    @Before("execution(public int cn.enjoy.bean.Calculator.*(..))")
    public void logStart(){
        System.out.println("运行-------参数列表是:{}");
    }
    @After("execution(public int cn.enjoy.bean.Calculator.*(..))")
    public void logEnd(){
        System.out.println("运行结束-------");
    }
    @AfterReturning("execution(public int cn.enjoy.bean.Calculator.*(..))")
    public void logReturn(){
        System.out.println("运行正常-------结果是:{}");
    }
    @AfterThrowing("execution(public int cn.enjoy.bean.Calculator.*(..))")
    public void logException(){
        System.out.println("运行异常-------异常信息是:{}");
    }
}

输出结果:

IOC容器初始化完成
@around 之前
运行-------参数列表是:{}
-----------计算除法中--------
@around之后
运行结束-------
运行正常-------结果是:{}

2.方法表达式的优化

表达式中都是("execution(public int cn.enjoy.bean.Calculator.*(..))"),可以使用@PointCut优化

@Aspect
public class LogAspects {
    @Pointcut("execution(public int cn.enjoy.bean.Calculator.*(..))")
    public void pointCut(){}

    @Around("pointCut()")
    public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws  Throwable{
        System.out.println("@around 之前");
        Object o = proceedingJoinPoint.proceed();
        System.out.println("@around之后")
        ;
        return o;
    }
    @Before("pointCut()")
    public void logStart(){
        System.out.println("运行-------参数列表是:{}");
    }
    @After("pointCut()")
    public void logEnd(){
        System.out.println("运行结束-------");
    }
    @AfterReturning("pointCut()")
    public void logReturn(){
        System.out.println("运行正常-------结果是:{}");
    }
    @AfterThrowing("pointCut()")
    public void logException(){
        System.out.println("运行异常-------异常信息是:{}");
    }
}

 

你可能感兴趣的:(Spring源码学习)