承接上文Spring框架源码分析一
在BeanDefinition和BeanFactory之间还会经过一些beanFactoryPostProcessor方法,该方法的作用是转换BeanDefinition中的属性值,
使用场景1
比如把${db.name}占位符解析成具体的值。
使用场景2
继承BeanFactoryPostProcessor,也可以修改自定义bean的属性信息,比如xml中定义了100个bean User(name,age),想要修改其中一个user bean的age属性值,就可以通过这种方式。
使用场景3
定义component scan package,可以扫描当前目录里面包含的一些注解,把那些类读取到之后,需要做一个相关的解析,该解析的过程就是在beanFactoryPostProcessor中处理的。
按照下面这个过程查看spring源码,就可以看到解析注解的过程,
判断类上有没有@PropertySource注解,有的话,进行相应的解析和处理,进而完成一个具体的解析操作,所以这里可以进行扩展,自己需要的时候,就可以进行一些基础的相关扩展工作,但关键点是你要对它整体的执行流程和执行机制比较清楚并且可以修改源码。
Bean的生命周期
BeanFactory工厂的实现类应该支持标准的bean的生命周期接口,完整的初始化方法和标准顺序是:
第一步通过反射就完成实例化操作;
第二步叫初始化,
填充属性(populateBean方法)
填充bean的属性值,通过属性值填充对应的属性。
接下来执行Aware接口实现的方法,就是为了设置某些具体的属性值,
比如定义一个类实现了Aware接口,可以做一些扩展,
Aware接口存在的意义是方便通过spring中的bean对象获取对应容器中的相关属性值,比如bean名称或当前系统中的环境。
当执行完这些步骤,就已经有了当前对象的bean对象了,有了bean对象之后,能否对当前bean做一个修改操作?
以AOP举例说明这个问题,
AOP面向切面编程 ,根据动态代理生成一个新的代理对象,已经有了这个bean了才能生成代理对象,动态代理有两种实现技术jdk和cglib,是通过BeanPostProcessor实现的,
BeanPostProcessor接口的一个抽象实现类AbstractAutoProxyCreator(抽象的自动代理创建器)重写postProcessAfterInitialization方法,调用wrapIfNecessary,再调用
再调用
通过工厂来获取具体的一个代理对象,
这就是动态代理的2种方式 Jdk和Cglib,所以想实现动态代理的话,需要实现BeanPostProcessor接口,
想实现动态代理需要实现before和after这两个方法,所以生成bean对象之后能够进行扩展,因为生成的bean不代表是最终的bean,还可以对它进行改变。
到这里为止,创建的bean的整个生命周期就结束了。
最后是一个完整的对象了,可以拿过来直接进行一个相关的使用了。
当完整对象使用完之后,要进行一些销毁的操作,一般很少去手动关闭这里就不关注了。