一、实现示例
1. 1 Bean定义后处理器
在例子中,我们创建一个Config类型的对象。
BeanDefinintionBuilder创建一个类型为Config,且单例模式的Bean对象定义。
使用该定义创建一个名为 "config"的bean对象并注册到bean容器中。
打印名为config的Bean对象,发现config对象中并没有包含bean1对象和bean2对象。
registerAnnotationConfigProcessor对BeanFactory进行了拓展,由打印结果可知,ConfigurationAnnotataionProcessor(@Configuration注解处理器)被加到了Bean容器中,此外,
还有处理@Autowired注解的AutowiredAnnotationProcessor,处理@Resource注解的CommonAnnotationProcessor。
执行postProcessBeanFactory方法来进行后处理以解析bean对象,在下图可以发现经过了后处理器的处理后bean1和bean2对象也被放到了容器中。
由以上例子可知,BeanFactory的功能是存在不足的,需要依赖后bean定义处理器进行补充bean定义。
1.2 Bean后处理器
- 从Bean容器中获取bean1和bean2对象,可以发现成功获取了bean1对象,但没有获取bean2对象。
- bean2并没有被注入到容器中。
- 给BeanFactory添加Bean后处理器后,打印的bean对象包含了bean1和bean2。
添加后处理器时并不会实例化Bean对象,而是等到getBean方法被调用后才会实例化bean对象。
- 如果想要在getBean方法被调用之前就实例化单例对象,可以执行方法PreInstantiateSingletons
总结
beanFactory不会做的事情
(1)不会主动调用BeanFactory后处理器
(2)不会主动添加Bean后处理器
(3)不会 主动初始化单例
(4)不会解析BeanFactory,不会解析${}与#{}
而ApplicationContext将以上4件事都做好了。