Spring IOC(1) Bean创建的整体流程
Spring IOC
中涉及的重要接口
BeanDefinition
Bean
的描述信息,实现类包括RootBeanDefinition
和GenericBeanDefinition
,Bean的描述信息中定义了一系列Bean的信息,比如:beanClassName
、scope
、lazyinit
、dependsOn
、primary
、initMethodName
、destroyMethodName
、isSington
、isAbstract
等信息。BeanDefinitionReader
用于解析
Bean
的资源阅读器,比如针对于XML
文件的配置的Bean
,实现类XmlBeanDefinitionReader
,针对properties
文件的配置的Bean
,实现类为PropertiesBeanDefinitionReader
,Spring
在启动时会将xml
文件通过loadBeanDefinitions
方法进行解析。BeanFactory
是IOC
容器实现的顶层接口,默认的实现为DefaultListableBeanFactory
,Spring Bean
的整个生命周期都是由DefaultListableBeanFactory
去管理的,这个类非常的重要。BeanFactoryPostProcessor
这个接口是
BeanFactory
的增强处理器,用于在Bean
加载为BeanDefinition
之后的扩展,比如实现类PlaceHolderConfigurerSupport
就是用来处理占位符解析的,当我在xml
文件中配置jdbc
信息的时候,通过是用${xxx.jdbUrl}
这种方式配置数据库连接的时候,就是通过这个类来处理和解析的。Aware
这个接口,他下面有一堆的子接口,比如
BeanNameAware
、ApplicationContextAware
、BeanFactoryAware
、EnvironmentAware
等,可以通过实现这些接口完成ioc
容器中特定信息的设置,比如EnvironmentAware
,可以在Bean
创建过程中设置环境信息到对应的Bean
对象中,后期通过bean
对象获取环境信息数据。BeanPostProcessor
这个接口是
Bean
的增强处理器,用于在Bean
进行初始化时调用init-method
方法的前后进行增强,他有两个方法:postProcessBeforeInitialization
和postProcessAfterInitialization
,分别用于bean
初始化方法init-method
之前和之后调用,当然还可以进行很多扩展,比如aop
就是通过postProcessAfterInitialization
方法中去创建动态代理对象。
Spring Bean
的生命周期
首先通过
BeanDefinitionReader
将xml中的Bean配置加载到BeanDefinition
中然后将
BeanDefinition
放入DefaultListableBeanFacotry
的beanDefinitionMap
和beanDefinitionNames
集合中然后调用
BeanFactoryPostProcessor
@postProcessorBeanFactory
对容器中的BeanDefinition
的属性进行增强解析然后通过反射调用对象的构造函数进行对象的实例化
然后调用
populateBean
进行属性填充然后调用初始化方法
initializeBean
,初始化时又会先调用invokeAwareMethods
方法执行一堆的Aware方法然后
BeanPostProcessor
@postProcessBeforeInitialization
方法执行bean增强器的前置处理然后调用
InitializingBean
@afterPropertiesSet
方法或者是调用自定义的init-method方法然后调用
BeanPostProcessor
@postProcessAfterInitialization
方法执行bean增强的后置处理最后完成Bean的创建,最终放入一级缓存
singletonObjects
中
Spring创建bean
在我们使用Spring时一般通过下的方法:
1 |
|
上面代码中的AnnotationConfigApplicationContext
是ApplicationContext
的一个实现类。这个类是用来解析注解的,其他的还有解析xml
的,解析classpath
的,但这些类中最核心的方法refresh
来自它们一个父类的AbstractApplicationContext
。下面是这类的构造方法:
1 | public AnnotationConfigApplicationContext(Class<?>... componentClasses) { |
refresh方法
AbstractApplicationContext
#refresh
,这个方法中总共有15个方法,Spring源码的精髓就是这15个方法中。
1 | public void refresh() throws BeansException, IllegalStateException { |