基本使用步骤
配置类
package com.ysy.config;
import com.ysy.aop.LogAspect;
import com.ysy.aop.MathCalculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* @author shanyangyang
* @date 2020/6/11
* AOP[动态代理]
* 指能在程序运行期间动态的将某段代码切入到指定到指定方法指定位置的变成方式;
* 1、导入AOP模块 :Spring AOP (spring-aspect)
* 2、定义一个业务逻辑类,比如数学运算,在方法运行前、后,异常/返回的情况下打印
* 3、定义一个日志切面类,切面类里面的方法,感知运算方法运行到哪里,然后执行
* 通知方法:
* 前置通知(@Before)
* 后置通知(@After):无论方法是正常结束,还是异常结束
* 返回通知(@AfterReturning)
* 异常通知(@AfterThrowing)
* 环绕通知:(@Around)动态代理,手动推进方法的执行(joinPoint.procced)
*
* 4、给切面类标注何时何地执行
* 5、将业务代码和切面类都添加到容器中
* 6、必须告诉spring哪个类是切面类(给切面类添加注解@Aspect)
* 7、给配置类添加@EnableAspectJAutoProxy:开启基于注解的AOP模式
*/
@Configuration
@EnableAspectJAutoProxy
public class MainConfigOfAOP {
@Bean
public MathCalculator mathCalculator(){
return new MathCalculator();
}
@Bean
public LogAspect logAspect(){
return new LogAspect();
}
}
业务类
package com.ysy.aop;
/**
* @author shanyangyang
* @date 2020/6/11
*/
public class MathCalculator {
public int div(int i,int j){
return i/j;
}
}
切面类
package com.ysy.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import java.util.Arrays;
/**
* @author shanyangyang
* @date 2020/6/11
* 切面类
*/
@Aspect
public class LogAspect {
//抽取公共的切入点表达式
//1、本类引用
//2、其他的切面引用
@Pointcut("execution(public int com.ysy.aop.MathCalculator.*(..))")
public void pointCut(){}
//切入点表达式,指定在哪个方法切入
//JoinPoint必须出现在参数的第一位
@Before("pointCut()")
public void logStart(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
System.out.println(""+joinPoint.getSignature().getName()+"除法运行。。。参数列表是:{"+ Arrays.asList(args)+"}");
}
@After("pointCut()")
public void logEnd(){
System.out.println("除法结束。。。。。。");
}
@AfterReturning(value = "pointCut()",returning = "result")
public void logReturn(Object result){
System.out.println("除法正常返回。。。运行个结果:{}"+result);
}
@AfterThrowing(value = "pointCut()",throwing = "exception")
public void logException(Exception exception){
System.out.println("除法出现异常。。。。。异常信息是:{}"+exception);
}
}
测试方法
package com.ysy.test;
import com.ysy.aop.MathCalculator;
import com.ysy.bean.Boss;
import com.ysy.bean.Car;
import com.ysy.config.MainConfigOfAOP;
import com.ysy.config.MainConfigOfAutowired;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author shanyangyang
* @date 2020/6/4
*/
public class IOCTestOfAOP {
@Test
public void test01(){
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(MainConfigOfAOP.class);
MathCalculator mathCalculator = context.getBean(MathCalculator.class);
mathCalculator.div(1,1);
context.close();
}
}
重点三步走
1、编写业务类和测试类,告诉容器哪个是切面类
2、在切面中通过表达式,让切面方法明白何时何地执行
3、不要忘记开启基于注解的切面功能;@EnableAspectJAutoProxy