spring是一个容器,在刚开始的时候我们就已经告知spring需要创建哪些Bean,启动之后再去spring中获取。
创建Bean一般有XML和注解的方式创建,使用xml的方式会以文件流的方式读取成为Bean的定义信息,简称BD。
有了Bean的定义信息之后,spring就会进行实例化,spring是采用new的方式还是反射的方式,对。采用的是反射的方式。
上图中在xml中定义了一个Bean的信息,采用的的赋值方式是使用${}的方式赋值,是在实例化Bean之前还是之后呢?是如何进行取值的呢?
这其实就是用到的是PostProcessor,中文名是后置处理器,也可以叫做增强器。
spring的二开提供给外部使用的接口是 BeanFactoryPostProcessor 和 BeanPostProcessor,
其一是为BeanFactory提供使用的,另外一个是为Bean提供使用的。BeanFactory是什么意思呢?
由源码的解读可以知道,BeanFactory是spring容器的根接口,还记得最开始学习spring时,获取容器对象从哪里获取的吗?对,是在ApplicationContext中获取的,查看Diagrams可以知道,最终实现的接口就是BeanFactory,所以才是spring容器的根接口
通过BeanFactory这个spring容器的根接口从spring容器中获取到Bean对象,就可以把BeanFactory当成spring容器,BD就是在容器中。
我们接着解决上面提出的问题,${}是如何进行取值的,查看BeanFactoryPostProcessor源码,
点击接口的实现类,找到 PlaceholderConfigurerSupport
PlaceholderConfigurerSupport其实就是解析bean定义属性值中的占位符的抽象类
BD需要经过多个BeanFactoryPostProcessor,将其中的数据填充完整,这时就从一个BD成为一个完整的BD对象,此时就可以根据反射实例化了
其中执行多个BeanFactoryPostProcessor的方法是invokeBeanFactoryPostProcessor,该方法会将所有的BeanFactoryPostProcessor全部执行完。
AOP和IOC的关系
查看IOC的非常重要的两个接口之一的BeanPostProcessor,可以通过查看它的实现类,发现AOP就是通过该接口实现的代理功能。