框架就是復雜的留給自己,簡單的留給碼農,像寫hello world一樣簡單
早年開發Spring AOP程序時,都是xml文件配置aop(現在不流行xml了,注解@EnableAspectJAutoProxy大行其道),然后框架解析,
例如:
看下文,可以先參考我的博文bean創建過程一個Spring Bean從無到有的過程,
xml元素解析就不具體說了,感興趣自己研究
由於我用的tag是<aop:config>,那么解析類就是ConfigBeanDefinitionParser,解析時會注冊一個AspectJAwareAdvisorAutoProxyCreator,一個高高高級的BeanPostProcessor
然后解析aop:config子元素,由於方法眾多,我只寫了大塊
參照https://blog.csdn.net/dong19891210/article/details/105697175創建bean的createBeanInstance(產出原生對象)和initializeBean階段,對應文件org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.java
在for之前輸出:
獲取所有的BeanPostProcessor,
進入for階段后,留意一個org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator 的處理
處理方式可以細看,由於代碼超多,只展示大方面的代碼
還記得上面說過的注冊的一個bean:AspectJAwareAdvisorAutoProxyCreator,它繼承自org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(Object bean, String beanName) throws BeansException
在創建代理對象前,會拿到通知或攔截方法
1. 拿攔截方式org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource targetSource)
2. 創建代理 Object org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(Class<?> beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource)
文件org.springframework.aop.framework.proxyFactory.java
由於我用的是接口,那么代理實現類是JdkDynamicAopProxy.java
此時已是代理對象
然后一層層返回:
代理對象執行業務方法,順便加些其他操作
總結:Spring AOP的處理由它AspectJAwareAdvisorAutoProxyCreator對bean的處理,還是對bean的生命周期的把控,在哪個階段生成,initializeBean階段,然后再去看怎么生成的代理對象,需要什么原材料(攔截器,通知,切面,切入點等),哪種方式(兩種方式)
好了,細節慢慢深入,相信嗎,Spring aop為創建代理對象,方法嵌套調用上百個,還有不少新概念,不過還好,對於開發人員用起aop來像helloword一樣簡單。
附圖兩張:
參考:
0. https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#xsd-schemas-aop
1. https://www.springframework.org/schema/aop/spring-aop.xsd
3. https://github.com/seaswalker/spring-analysis/blob/master/note/spring-aop.md
4. Spring 框架的設計理念與設計模式分析 https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/index.html
5. Understanding Spring AOP https://www.codejava.net/frameworks/spring/understanding-spring-aop
6. Spring 源碼學習(八) AOP 使用和實現原理
http://www.justdojava.com/2019/07/17/spring-analysis-note-8/
7. Spring AOP 源碼初窺(三)掃描Advice與Bean匹配 https://segmentfault.com/a/1190000016054658
8. Spring AOP 使用介紹,從前世到今生 https://www.javadoop.com/post/spring-aop-intro
9. spring源碼解析之AOP原理 https://www.cnblogs.com/liuyk-code/p/9886033.html