官網(wǎng)文檔地址:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop-advice
查看5.4節(jié)。Spring 參考aspectJ 的設計方式來實現(xiàn),借助aspectj注解來處理。
關鍵點:幾個注解。
@EnableAspectJAutoProxy? 這個注解需要加在配置類上。其中干了一件事,將AnnotationAwareAspectJAutoProxyCreator 注入IOC容器,本質(zhì)是個BeanPostProcessor (這個類可以在bean 注入IOC 容器中前可以調(diào)整bean 的屬性等),通過調(diào)試代碼可以發(fā)現(xiàn),其實是在postProcessAfterInitialization方法中進行proxy 類的生成。
方法調(diào)用路線:1、wrapIfNecessary 這個是對所有bean都要進行判斷是否需要進行包裝處理的
? ? ? ? ? ? ? ? ? ? ? ? ? ?2、getAdvicesAndAdvisorsForBean 方法來處理判斷當前bean 是否需要進行aop 代理類的生成,其中通過findEligibleAdvisors??方法來判斷該類的方法是否需要被通知。
? ? ? ? ? ? ? ? ? ? ? ? ? ? 3、通過?createAopProxy 方法來獲取 一個進行動態(tài)代理的AopProxy 實現(xiàn)??梢钥吹饺绻擃愂莻€接口實現(xiàn)類或者已經(jīng)是個代理類 那么 本次proxy 就選擇JdkDynamicAopProxy 否則 就選擇ObjenesisCglibAopProxy。
? ? ? ? ? ? ? ? ? ? ? ? ? ? 4、通過動態(tài)代理將對應方法進行包裝,返回warp后的bean實例,注入IOC??梢钥吹皆瓉韓ew bean 則在該過程被放棄。