spring-boot aop运行原理

一、基本使用
  1. pom引入依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
	<version>2.2.2.RELEASE</version>
</dependency>
  1. 定义切面
//定义切面
@Component
@Aspect
public class testAspect {

   //定义切点
    @Pointcut("execution(* test.*.*(..))")
    public void testPointCut(){}

   //指定通知以及通知的范围
    @Before("testPointCut()")
    public void beforeMethod(){
        System.out.println("前置通知。。。");
    }
   
    @Around("testPointCut()")
    public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("环绕通知上。。。");
        Object obj=pjp.proceed();
        System.out.println("环绕通知下。。。");
        return obj;
    }
   
    @After("testPointCut()")
    public void afterMethod(){
        System.out.println("后置通知。。。");
      
    }   
}

  1. 启动类上增加@EnableAspectJAutoProxy
@SpringBootApplication
@EnableAspectJAutoProxy
public class ZhenChannelApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZhenChannelApplication.class, args);
    }

}
二、实现步骤
  1. 获取bean
    spring是bean的容器,要想拦截(代理)某个bean,要先获取bean,spring定义了bean的生命周期事件,开发者可以拦截这些事件从而获取到所有bean。
  2. 过滤bean,验证bean是不是需要被代理
    aop中切点定义要拦截的bean方法,所以用切点表达式可以验证bean需不需要被拦截
  3. 将@Before等注解生成拦截方法对象,待后面调用目标方法时调用
三、每一步是如何实现的
  1. 获取bean
    • BeanPostProcessor接口的实现类AnnotationAwareAspectJAutoProxyCreator对象,在postProcessAfterInitialization方法中获取bean生成代理方法。
    • @EnableAspectJAutoProxy 将AnnotationAwareAspectJAutoProxyCreator对象加入spring容器
被注解
引入
调用
向容器注册
@EnableAspectJAutoProxy
@Import(AspectJAutoProxyRegistrar.class)
AspectJAutoProxyRegistrar.class
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessar
AnnotationAwareAspectJAutoProxyCreator
  1. 过滤bean,验证bean是不是需要被代理
    在AnnotationAwareAspectJAutoProxyCreator.postProcessAfterInitialization中完成
调用
调用
调用
调用
调用
调用
postProcessAfterInitialization
wrapIfNecessary
getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator)
findEligibleAdvisors
findAdvisorsThatCanApply
AopUtils.findAdvisorsThatCanApply
canApply
  1. 将@Before等注解生成拦截方法对象,待后面调用目标方法时调用

    • spring会将@Before等注解方法和切入点封装成PointcutAdvisor对象
    调用
    调用
    调用
    调用
    调用
    postProcessAfterInitialization
    wrapIfNecessary
    getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator)
    findEligibleAdvisors
    findCandidateAdvisors(AnnotationAwareAspectJAutoProxyCreator)
    BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors
    • 实际上每个切面是一个List的集合
    • @Before等注解方法被封装成Advice对象(实际上是MethodInterceptor),切入点被封装成Pointcut对象
    • PointcutAdvisor,MethodInterceptor,Pointcut关系如下
聚合
聚合
PointcutAdvisor
MethodInterceptor
Pointcut
四、总结
  1. BeanPostProcessor接口的实现对象AnnotationAwareAspectJAutoProxyCreator完成了aop
  2. @EnableAspectJAutoProxy注解引入了AnnotationAwareAspectJAutoProxyCreator
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值