Aop面向切面编程,在方法执行的前中后等加入指定的操作。底层动态代理
代码
三部曲
- 将业务逻辑组件和切面类都加入到容器中,告诉Spring哪个是切面类(@Aspect)
- 在切面类的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式)
- 开启基于注解的Aop模式(@Enable…)
MyCalculator方法类
public class MyCalculator {
public int div(int i,int j){
return i/j;
}
}
切面类AspectJ
@Aspect
public class AspectJTest {
// 切入点表达式
@Pointcut("execution(public int com.spirng.aop.MyCalculator.div(..))")
public void pointCut(){};
@Before("pointCut()")
public void beforeDiv(){
System.out.println("@Before的方法");
}
@After("pointCut()")
public void AfterDiv(){
System.out.println("@After的方法");
}
@AfterReturning("pointCut()")
public void AfterReturnDiv(){
System.out.println("@AfterReturn的方法");
}
@AfterThrowing("pointCut()")
public void AfterThrowingDiv(){
System.out.println("@AfterThrowing的方法");
}
}
配置类
MainConfig_Aop
@Configuration
@EnableAspectJAutoProxy
public class MainConfig_Aop {
@Bean
public MyCalculator myCalculator(){
return new MyCalculator();
}
@Bean
public AspectJTest aspectJTest(){
return new AspectJTest();
}
}
测试
Test
public class TestAll {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig_Aop.class);
@Test
public void test06(){
MyCalculator myCalculator = applicationContext.getBean(MyCalculator.class);
myCalculator.div(1,1);
}
}
输出
注意点:
1、需要在切面类上添加@Aspect,证明该类是一个切面类
2、需要在配置类上面添加@EnableAspectJProxy,开启切面代理
我们也可以在切入方法内获取方法的信息
@Aspect
public class AspectJTest {
@Pointcut("execution(public int com.spirng.aop.MyCalculator.div(..))")
public void pointCut(){};
@Before("pointCut()")
public void beforeDiv(JoinPoint joinPoint){
System.out.println(""+joinPoint.getSignature().getName()+"@Before的方法");
}
@After("pointCut()")
public void AfterDiv(JoinPoint joinPoint){
System.out.println("@After的方法"+joinPoint);
}
//这里注意,JoinPoint参数一定要出现在参数列表的第一位,不然会报错
@AfterReturning(value = "pointCut()",returning = "result")
public void AfterReturnDiv(JoinPoint joinPoint,Object result){
System.out.println("@AfterReturn的方法"+result.toString());
}
@AfterThrowing(value = "pointCut()",throwing = "exception")
public void AfterThrowingDiv(Exception exception){
System.out.println("@AfterThrowing的方法"+exception);
}
}