Spring AOP

AOP:指在程序运行期间,动态的将某段代码切入到指定方法指定位置进行运行的编程方式。
1.导入AOP模块:spring-aspects

        
            org.springframework
            spring-aspects
            4.3.12.RELEASE
        

2.定义业务逻辑类MathCaculator

package com.ljessie.aop;

public class MathCaculator {

    public int div(int i,int j){
        System.out.println("div被调用。。。。。");
        return i/j;
    }
}

3.定义一个日志切面类LogAspects,切面类里面的方法,需要动态感知MathCaculator.div()方法运行到哪里,然后执行。给切面类的目标方法,标注何时何地运行(通知注解)。给切面类上添加@Aspect。
通知方法:
前置通知(@Before):logStart,在目标方法运行之前运行。
后置通知(@After):logEnd,在目标方法运行之后运行,无论方法正常结束还是异常结束
返回通知(@AfterReturning):logReturn,在目标方法正常返回之后运行。
异常通知(@AfterThrowing):logException,在目标方法出现异常之后运行。
环绕通知(@Arround):动态代理,手动推进目标方法运行(joinPoint.procced())

package com.ljessie.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

/**
 * 告诉Spring,当前类是一个切面类
 */
@Aspect
public class LogAspects {

    /**
     * 抽取公共的切入点表达式
     * 1.若在本类引用
     * 2.其他切面引用
     */
    @Pointcut("execution(public int com.ljessie.aop.MathCaculator.*(..))")
    public void pointCut(){}

    //在目标方法之前切入
//    @Before("public int com.ljessie.aop.MathCaculator.div(int,int)")
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        System.out.println(joinPoint.getSignature().getName()+"运行。。。参数列表是:{"+ Arrays.asList(args) +"}");
    }

    //模拟外部类引用
    @After("com.ljessie.aop.LogAspects.pointCut()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println(joinPoint.getSignature().getName()+"运行结束。。。");
    }


    /**
     *
     * @param joinPoint,一定要出现在参数列表中的第一位
     * @param result
     */
    @AfterReturning(value = "pointCut()",returning = "result")
    public void logReturn(JoinPoint joinPoint,Object result){
        System.out.println(joinPoint.getSignature().getName()+"正常返回。。。运行结果:{"+result+"}");
    }

    @AfterThrowing(value = "pointCut()",throwing = "exception")
    public void logException(JoinPoint joinPoint,Exception exception){
        System.out.println(joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
    }
}

4.将切面类和业务逻辑类(目标方法所在类)都加入到容器中。给配置类中添加@EnableAspectJAutoProxy,开启基于注解的AOP模式。

package com.ljessie.config;

import com.ljessie.aop.LogAspects;
import com.ljessie.aop.MathCaculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {

    @Bean
    public MathCaculator mathCaculator(){
        return new MathCaculator();
    }

    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }
}

5.定义测试类,添加测试方法

package com.ljessie.test;

import com.ljessie.aop.MathCaculator;
import com.ljessie.bean.Boss;
import com.ljessie.bean.Car;
import com.ljessie.config.MainConfigOfAOP;
import com.ljessie.config.MainConfigOfAutowired;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class IOCTest_AOP {

    @Test
    public void test01(){
        //创建IOC容器
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);
        System.out.println("容器创建完成");
        MathCaculator mathCaculator = annotationConfigApplicationContext.getBean(MathCaculator.class);
        mathCaculator.div(1,1);

        System.out.println(annotationConfigApplicationContext);
        //关闭容器
        annotationConfigApplicationContext.close();
    }
}

6.运行test01()

一月 28, 2020 2:09:26 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3abfe836: startup date [Tue Jan 28 14:09:26 CST 2020]; root of context hierarchy
一月 28, 2020 2:09:26 下午 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor 
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
容器创建完成
div运行。。。参数列表是:{[1, 1]}
div被调用。。。。。
div运行结束。。。
div正常返回。。。运行结果:{1}
org.springframework.context.annotation.AnnotationConfigApplicationContext@3abfe836: startup date [Tue Jan 28 14:09:26 CST 2020]; root of context hierarchy
一月 28, 2020 2:09:26 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3abfe836: startup date [Tue Jan 28 14:09:26 CST 2020]; root of context hierarchy

你可能感兴趣的:(Spring AOP)