SpringAop入门

Aop面向切面编程,在方法执行的前中后等加入指定的操作。底层动态代理

SpringAop入门_第1张图片
代码

三部曲

  • 将业务逻辑组件和切面类都加入到容器中,告诉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);
    }

}

在这里插入图片描述

你可能感兴趣的:(spring,aop,java)