refresh():重要,里面有13个方法
spring配置文件的加载过程
用一个能够读取各种格式文件的解析器去读 文件,并把文件里的
比如这里是xml文件。 里面的内容想转成bean定义信息要经过:加载、解析。
容器就是用来存放bean的。那么容器用什么数据结构比较好?用map。 使用map
spring框架为了保证自己的扩展性(主要为其生态化考虑),开放了可以操作bean的接口。
比如下图的beanFactoryPostProcessor()。 经过后置处理器之后,就可以用Class.newInstance()进行实例化了
bean的创建过程(生命周期)
bean的声明周期:整体分成实例化和初始化。 初始化又包含填充属性和执行init-method等方法。即如下
- 实例化
- 初始化
- 填充属性
- 执行方法
- 实现aware接口的类里的方法
- 实现beanPostProcessor接口的类实现的方法
- init-method
- 完成对象
- 销毁流程
监听器和多播器
PostProcessor:后置处理器/增强器
顾名思义。有点类似代理方法这种。 就是在方法正式执行之前给方法做个增强,或者对传入目标方法的参数做些手脚。 比较扎眼的有这两个:beanFactoryPostProcessor和beanPostProcessor
beanFactoryPostProcessor
作用:对生成beanFactory做些操作。(对生成bean工厂进行进行一些增强)
beanPostProcessor:在bean填充完属性之后,对bean进行一些操作,比如添加动态代理
这个方法在bean组件填充属性代码之后(通过set方法填充的属性,而不是构造方法填充)。
可以进行什么操作呢?比如添加动态代理。
首先知道aop的实现原理是通过动态代理给bean生成代理类。而且动态代理有两种方式:jdk和cglib动态代理
接下来看看这个:找到BeanPostProcessor的一个实现类 ->AbstractAutoProxyCreator,看他实现的postProcessBeforeInitialization() -> createProxy() -> getProxy() -> 顺利找到 jdk和cglib
aware接口
aware接口的功能:就是为了让我自己的组件可以调用spring容器里的底层组件。