Spring详解(二):初始化流程2

71 阅读2分钟

初始化流程的应用

上一篇简要介绍了Spring IOC初始化流程,在这个复杂的流程中,有很多可操作空间,提供给项目开发使用。

@Resource/@Autowired

@Resource和@Autowired是开发中最常用的依赖注入方式,两者注入依赖的入口都是populate()方法, 初始化流程中一个很重要的方法。 image.png image.png image.png

@Resource入口是CommonAnnotationBeanPostProcessor,在指定bean name或者容器中有相应name的bean时,会根据name解析依赖,这就是常说的根据name注入。 image.png

@Autowired入口是AutowiredAnnotationBeanPostProcessor,调用到DefaultListableBeanFactory的doResolveDependency()方法。方法中根据类型type来查找容器中的bean,就是常说的根据type注入。 image.png

尽管两个注解注入依赖的入口不同,但最终都会调用getBean()方法来获取依赖的实例。 image.png

ApplicationContextAware

在并没有被Spring IOC容器管理的类中,不能使用@Resource或@Autowired来注入容器中已有的bean。

这时通常使用一个工具类实现ApplicationContextAware接口,直接获取容器对象本身,然后通过容器直接获取bean。 image.png

ApplicationContextAware获取上下文对象的原理,正是前文”bean生命周期小节“中提到的BeanPostProcessor,在Initialization前置处理时进行的操作。 image.png image.png image.png

InitializingBean

实现InitializingBean接口的类,在初始化时会被调用自定义的afterPropertiesSet()方法,完成一些初始化的业务逻辑,这是很方便的一个扩展点。 image.png image.png

服务启动演示

invokeBeanFactoryPostProcessors()

image.png

最重要的一个BeanFacotryPostProcessor:ConfigurationClassPostProcessor。 image.png

通过parse()方法和loadBeanDefinitions()方法获取到所有的BeanDefinition。 image.png

一些自研框架也利用这一扩展点,注册需要的BeanDefinition。 image.png

registerBeanPostProcessors()

image.png

这一步注册了系统中有的BeanPostProcessor,在后续bean生命周期中用到。 image.png

finishBeanFactoryInitialization()

image.png

实例化、初始化前面注册的BeanDefinition。 image.png

实例化一个bean前的一些准备工作,如判断是否有DependsOn对象需先创建。 image.png

实例化一个bean之前先通过InstantiationAwareBeanPostProcessor做前置处理,可以返回如代理类,AOP依赖这一点实现。 image.png image.png

实例化bean。 image.png

bean属性注入。 image.png

利用InstantiationAwareBeanPostProcessor的postProcessProperties()完成属性注入。 image.png image.png

初始化bean image.png image.png

一些自研框架自定义Processor,正是利用BeanPostProcessor的postProcessBeforeInitialization()对特定类进行前置处理。 image.png image.png

如果实现了InitializingBean初始化时会调用afterPropertiesSet()做一些处理逻辑。 image.png