关键技术:代理
所以其实使用aop的时候,已经使用的是target的代理类了,不是target了。
❓所以aop的功能也是BeanPostProcessor实现的?
答:是的✔️。反正aop是在finishbeanfactoryinitializer()中实现的。是的,后面有解答。BeanPostProcessor实现的aop代理。
aspectj
Spring就是使用了aspectj的语法风格 (其实就是用了它的注解) 。Spring aop是基于jdk动态代理或gclib的,是动态织入。aspectj好像不是?❔
aop源码/原理
知识点:后置处理器、aop原理、jdk动态代理
注意⚠️:这里讨论的aop原理、aop处理,其实就是ioc的结尾,bean初始化部分的微观过程。也就是refresh()函数中finish…()里面的微观过程。如下:
BeanDefinition ——> 普通java对象 ——> 真正的bean
关键技术:后处理器 + 代理 (jdk动态代理、GClib、aspectj)
- ioc和aop的关系?
ioc和aop都是一个技术目标,和Spring无关。Spring只是用di实现了ioc、
- 单纯使用ioc,得到的bean
- 使用了aspectj aop或者在BeanPostProcessor中使用了动态代理
已经是代理对象了,原来的对象丢了。名存实亡了
⚠️ ac.getbean(bean) 封装了半天其实就是一个map.get(bean),这个map就是DefaultSingletonBeanRegistry的单例池SingletonObjects是一个ConCurrentHashMap。
⚠️第一句applicationContext初始化的代码中,就调用了getBean(),印证了《spring4》书中“applicationContext启动就实例化所以bean,勤奋加载”。他意思是在applicationContext初始化过程中,看单例池bean有没有初始化,没有就帮他初始化。
⚠️所以下面第二句getBean()和第一句里面的getBean()是一同一个方法。
生成bean + proxy的核心代码
AbstractAutowireCapableBeanFactory
- doCreateBean()
- createBeanInstance():生成原生bean
(执行9次后置处理器) - initializeBean():原生bean变成了代理对象proxy
- applyBeanPostProcessorsAfterInitialization:原生bean变成了代理对象proxy
可以看出,aop是其实ioc(bean生命周期)的其中一段。
⚠️⚠️同时,完美印证了,aop的实现,就是在bean的生命周期初始化阶段,调用了后置处理器,把普通bean——>proxy。