官网文档地址:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop-advice
查看5.4节。Spring 参考aspectJ 的设计方式来实现,借助aspectj注解来处理。
关键点:几个注解。
@EnableAspectJAutoProxy 这个注解需要加在配置类上。其中干了一件事,将AnnotationAwareAspectJAutoProxyCreator 注入IOC容器,本质是个BeanPostProcessor (这个类可以在bean 注入IOC 容器中前可以调整bean 的属性等),通过调试代码可以发现,其实是在postProcessAfterInitialization方法中进行proxy 类的生成。
方法调用路线:1、wrapIfNecessary 这个是对所有bean都要进行判断是否需要进行包装处理的
2、getAdvicesAndAdvisorsForBean 方法来处理判断当前bean 是否需要进行aop 代理类的生成,其中通过findEligibleAdvisors 方法来判断该类的方法是否需要被通知。
3、通过 createAopProxy 方法来获取 一个进行动态代理的AopProxy 实现。可以看到如果该类是个接口实现类或者已经是个代理类 那么 本次proxy 就选择JdkDynamicAopProxy 否则 就选择ObjenesisCglibAopProxy。
4、通过动态代理将对应方法进行包装,返回warp后的bean实例,注入IOC。可以看到原来new bean 则在该过程被放弃。
网友评论