Spring 扩展接口的调用顺序

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_26182553

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值