spring 部分,视频丢失

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就是通过该接口实现的代理功能。

猜你喜欢

转载自blog.csdn.net/awodwde/article/details/121214509