Spring的可扩展性很强,这样有以下扩展接口:
BeanFactory构造阶段
NamespaceHandler
通过自定义的NamespaceHandler,配合BeanDefinitionParser,可以完成自定义Bean的组装操作,对于BeanDefinition的数据结构,进行个性化创建。
还有目前常用的component-scan,也是利用ComponentScanBeanDefinitionParser完成了指定包下所有类的扫描,BeanDefinition创建的过程。
ApplicationContext构造阶段
有两个可扩展的地方:BeanFactoryPostProcessor,BeanPostProcessor。
BeanFactoryPostProcessor
实现BeanFactoryPostProcessor的Bean,可以对BeanFactory中的BeanDefinition进行变化修改,或者创建BeanDefinition到BeanFactory中。
比如PropertyPlaceholderConfigurer可将property-placeholder中的配置文件信息替换到BeanDefinition中。
比如ConfigurationClassPostProcessor发现BeanFactory中使用了@Configuration注解的Bean,并根据此Bean在BeanFactory中增加Bean。
比如MyBatis中使用的MapperScannerConfigurer,扫描basePackage配置下的接口,生成多个Bean并注册到BeanFactory中。
BeanFactoryPostProcessor还有一个子接口BeanDefinitionRegistryPostProcessor,它可以配合PriorityOrdered、Ordered设置执行的先后顺序。
BeanPostProcessor
BeanPostProcessor在Bean实例初始化之前和之后执行,可自定义修改Bean实例,甚至替换Bean实例为自定义实例。
它有以下几个子接口:
DestructionAwareBeanPostProcessor
在实例销毁前使用。
InstantiationAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor
接口有三个方法,在实例创建前智能判断实例类型,智能判断构造函数,获取预创建实例,防止循环依赖。
MergedBeanDefinitionPostProcessor
以下是它们在spring启动过程中的执行顺序:
<bean id="student" class="com.ziguan.test.Student" init-method="initMethod" destroy-method="destroyMethod">
<property name="name" value="peter0"/>
<property name="school" value="shuanghe"/>
</bean>
BeanDefinitionRegistryPostProcessor,PriorityOrdered=0 postProcessBeanDefinitionRegistry()
BeanDefinitionRegistryPostProcessor,PriorityOrdered=1 postProcessBeanDefinitionRegistry()
BeanDefinitionRegistryPostProcessor,Ordered=0 postProcessBeanDefinitionRegistry()
BeanDefinitionRegistryPostProcessor,Ordered=1 postProcessBeanDefinitionRegistry()
BeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry()
BeanDefinitionRegistryPostProcessor,PriorityOrdered=0 postProcessBeanFactory()
BeanDefinitionRegistryPostProcessor,PriorityOrdered=1 postProcessBeanFactory()
BeanDefinitionRegistryPostProcessor,Ordered=0 postProcessBeanFactory()
BeanDefinitionRegistryPostProcessor,Ordered=1 postProcessBeanFactory()
BeanDefinitionRegistryPostProcessor postProcessBeanFactory()
BeanFactoryPostProcessor postProcessBeanFactory()
InstantiationAwareBeanPostProcessor postProcessBeforeInstantiation()//如果返回null,
//继续执行bean的初始化工作;如果返回非空Object会跳过后面的初始化,使用该Object作为bean的对象。
>>>>>Student.Student() //调用构造方法
MergedBeanDefinitionPostProcessor postProcessMergedBeanDefinition()
InstantiationAwareBeanPostProcessor postProcessAfterInstantiation()//返回ture,
//使用PropertyValues为bean的属性赋值;返回false,不为bean赋值,并且跳过后面的InstantiationAwareBeanPostProcessor在此bean上的调用
InstantiationAwareBeanPostProcessor postProcessPropertyValues() //最后一次修改PropertyValues
>>>>>Student.setName(), name=peter0 //访问PropertyValues为属性赋值
>>>>>Student.setSchool(), school=shuanghe
BeanNameAware.setBeanName() beanName=student
BeanFactoryAware.setBeanFactory() beanFactory=DefaultListableBeanFactory
ApplicationContextAware.setApplicationContext() applicationContext=GenericApplicationContext
BeanPostProcessor,PriorityOrdered=0 postProcessBeforeInitialization()
BeanPostProcessor,PriorityOrdered=1 postProcessBeforeInitialization()
BeanPostProcessor,Ordered=0 postProcessBeforeInitialization()
BeanPostProcessor,Ordered=1 postProcessBeforeInitialization()
BeanPostProcessor postProcessBeforeInitialization()
DestructionAwareBeanPostProcessor postProcessBeforeInitialization()
InstantiationAwareBeanPostProcessor postProcessBeforeInitialization()
MergedBeanDefinitionPostProcessor postProcessBeforeInitialization()
InitializingBean.afterPropertiesSet()
>>>>>init-method
BeanPostProcessor,PriorityOrdered=0 postProcessAfterInitialization()
BeanPostProcessor,PriorityOrdered=1 postProcessAfterInitialization()
BeanPostProcessor,Ordered=0 postProcessAfterInitialization()
BeanPostProcessor,Ordered=1 postProcessAfterInitialization()
BeanPostProcessor postProcessAfterInitialization() //如果xml中配置了aop:config,
//AopNamespaceHandler会注册AspectJAwareAdvisorAutoProxyCreator.class,
//它实现了BeanPostProcessor接口, 由此进入AOP
DestructionAwareBeanPostProcessor postProcessAfterInitialization()
InstantiationAwareBeanPostProcessor postProcessAfterInitialization()
MergedBeanDefinitionPostProcessor postProcessAfterInitialization()
DestructionAwareBeanPostProcessor requiresDestruction()//返回false不会销毁bean
[Student: name=peter0, school=shuanghe] //spring 启动完成,打印student
[2018-03-26 14:50:59,561][Thread-0]Closing / org.springframework.context.support.GenericApplicationContext@2667f029: /
startup date [Mon Mar 26 14:48:58 CST 2018]; root of context hierarchy
DestructionAwareBeanPostProcessor postProcessBeforeDestruction()
DisposableBean.destroy()
>>>>>destroy-method