Spring Bean生命周期

534 阅读3分钟

承接上文Spring框架源码分析一

image.png

在BeanDefinition和BeanFactory之间还会经过一些beanFactoryPostProcessor方法,该方法的作用是转换BeanDefinition中的属性值,

  • 使用场景1

image.png

比如把${db.name}占位符解析成具体的值。

  • 使用场景2

image.png

继承BeanFactoryPostProcessor,也可以修改自定义bean的属性信息,比如xml中定义了100个bean User(name,age),想要修改其中一个user bean的age属性值,就可以通过这种方式。

  • 使用场景3

定义component scan package,可以扫描当前目录里面包含的一些注解,把那些类读取到之后,需要做一个相关的解析,该解析的过程就是在beanFactoryPostProcessor中处理的。

按照下面这个过程查看spring源码,就可以看到解析注解的过程,

image.png

image.png

判断类上有没有@PropertySource注解,有的话,进行相应的解析和处理,进而完成一个具体的解析操作,所以这里可以进行扩展,自己需要的时候,就可以进行一些基础的相关扩展工作,但关键点是你要对它整体的执行流程和执行机制比较清楚并且可以修改源码。

Bean的生命周期

BeanFactory工厂的实现类应该支持标准的bean的生命周期接口,完整的初始化方法和标准顺序是:

image.png

第一步通过反射就完成实例化操作;

image.png

第二步叫初始化,

填充属性(populateBean方法)

填充bean的属性值,通过属性值填充对应的属性。

接下来执行Aware接口实现的方法,就是为了设置某些具体的属性值,

比如定义一个类实现了Aware接口,可以做一些扩展,

image.png

image.png

image.png

Aware接口存在的意义是方便通过spring中的bean对象获取对应容器中的相关属性值,比如bean名称或当前系统中的环境。

当执行完这些步骤,就已经有了当前对象的bean对象了,有了bean对象之后,能否对当前bean做一个修改操作?

以AOP举例说明这个问题,

image.png

AOP面向切面编程 ,根据动态代理生成一个新的代理对象,已经有了这个bean了才能生成代理对象,动态代理有两种实现技术jdk和cglib,是通过BeanPostProcessor实现的,

image.png

image.png

BeanPostProcessor接口的一个抽象实现类AbstractAutoProxyCreator(抽象的自动代理创建器)重写postProcessAfterInitialization方法,调用wrapIfNecessary,再调用image.png

再调用image.png

image.png通过工厂来获取具体的一个代理对象,

image.png这就是动态代理的2种方式 Jdk和Cglib,所以想实现动态代理的话,需要实现BeanPostProcessor接口,

image.png

想实现动态代理需要实现before和after这两个方法,所以生成bean对象之后能够进行扩展,因为生成的bean不代表是最终的bean,还可以对它进行改变。

到这里为止,创建的bean的整个生命周期就结束了。

image.png

最后是一个完整的对象了,可以拿过来直接进行一个相关的使用了。

image.png

当完整对象使用完之后,要进行一些销毁的操作,一般很少去手动关闭这里就不关注了。