初始化流程的应用
上一篇简要介绍了Spring IOC初始化流程,在这个复杂的流程中,有很多可操作空间,提供给项目开发使用。
@Resource/@Autowired
@Resource和@Autowired是开发中最常用的依赖注入方式,两者注入依赖的入口都是populate()方法, 初始化流程中一个很重要的方法。
@Resource入口是CommonAnnotationBeanPostProcessor,在指定bean name或者容器中有相应name的bean时,会根据name解析依赖,这就是常说的根据name注入。
@Autowired入口是AutowiredAnnotationBeanPostProcessor,调用到DefaultListableBeanFactory的doResolveDependency()方法。方法中根据类型type来查找容器中的bean,就是常说的根据type注入。
尽管两个注解注入依赖的入口不同,但最终都会调用getBean()方法来获取依赖的实例。
ApplicationContextAware
在并没有被Spring IOC容器管理的类中,不能使用@Resource或@Autowired来注入容器中已有的bean。
这时通常使用一个工具类实现ApplicationContextAware接口,直接获取容器对象本身,然后通过容器直接获取bean。
ApplicationContextAware获取上下文对象的原理,正是前文”bean生命周期小节“中提到的BeanPostProcessor,在Initialization前置处理时进行的操作。
InitializingBean
实现InitializingBean接口的类,在初始化时会被调用自定义的afterPropertiesSet()方法,完成一些初始化的业务逻辑,这是很方便的一个扩展点。
服务启动演示
invokeBeanFactoryPostProcessors()
最重要的一个BeanFacotryPostProcessor:ConfigurationClassPostProcessor。
通过parse()方法和loadBeanDefinitions()方法获取到所有的BeanDefinition。
一些自研框架也利用这一扩展点,注册需要的BeanDefinition。
registerBeanPostProcessors()
这一步注册了系统中有的BeanPostProcessor,在后续bean生命周期中用到。
finishBeanFactoryInitialization()
实例化、初始化前面注册的BeanDefinition。
实例化一个bean前的一些准备工作,如判断是否有DependsOn对象需先创建。
实例化一个bean之前先通过InstantiationAwareBeanPostProcessor做前置处理,可以返回如代理类,AOP依赖这一点实现。
实例化bean。
bean属性注入。
利用InstantiationAwareBeanPostProcessor的postProcessProperties()完成属性注入。
初始化bean
一些自研框架自定义Processor,正是利用BeanPostProcessor的postProcessBeforeInitialization()对特定类进行前置处理。
如果实现了InitializingBean初始化时会调用afterPropertiesSet()做一些处理逻辑。