文档章节

Spring在Bean的生命周期中的扩展点

 慕哲
发布于 2017/08/04 17:03
字数 1246
阅读 54
收藏 1

Spring生命周期中在启动过程中由配置文件转变为系统中能够执行的对象。这个过程中主要步骤有  创建Bean,设置属性。两个关键点将系统中的步骤分为了三个时期中的扩展点。BeanDefintion对象中记录了Bean的基础信息。

一:创建Bean之前,

        这个过程是在实例化Class之前,这个时候系统中主要是BeanFactory中信息。对象BeanFactory中还是BeanDefintion。

1.1BeanDefinitionRegistryPostProcessor:

     BeanDefintionRegitryPostProcessor是BeanFactory的子类。扩展的方法是:

     void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

        这个方法能够对系统中还未实例化的BeanDefintion进行修改,这个时候BeanDefinitionRegistry中定义的BeanDefinition还没有被处理。

1.2 BeanFactoryPostProcessor:

     类的描述是当前类能够修改当前容器中定义的属性,能够对定义的Bean中的属性进行替换,具体的可以看 PropertyResourceConfigurer。这个类是所有的BeanFactory中优先级最高的。主要的功能是对当前系统中的属性配置项进行修改。在BeanFactoryPostProcessor中系统中的Bean还没有实例化,这个过程中不要对Bean进行实例化,否者后期的BeanPostProcessor将会失效。

类中的方法:通过当前的方法能够对当前容器中定义的BeanDefiniton进行处理。

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

1.3 InstantiationAwareBeanPostProcessor:

这个对象是BeanPostProcessor的一个实例。这个类中提供了BeanPostProcessor不同的方法。在框架中对对子类中的方法进行处理,使用的方法是 instanceof 方法来判断子类,然后调用子类的方法。这个类主要在BeanPostProcessor的基础上添加了  在实例化之前处理回调,实例化之后设置属性值之前处理回调。

这个口这个要用来处理特定的目标类,例如创建特定的目标类或者实现特殊的操作。这个接口是提供给框架使用的,建议使用  BeanPostProcessor 接口或者使用  InstantiationAwareBeanPostProcessorAdapter类。

其中这个类有一个关键子类是 SmartInstantiationAwareBeanPostProcessorAdapter,这个类是提供给外部的系统来扩展使用的。

下面看下当前类中的在BeanDefinition转变为Class过程中执行的方法:

Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;

这个方法是在Bean被实例化之前进行调用。这个方法返回的Bean会代替系统中的原本生成的Bean。aop就是通过这个方法来实现的。

二:创建Bean之后,设置属性之前

这个过程中Bean对象被创建了出来,但是还没有设置属性。

这个过程可能会经历以下一些扩展点:

2.1 InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(Object bean, String beanName);

这个方法表示当前的类已经通过了构造方法或者工厂方法进行实例化。这个是一个很好的将属性注入到bean实例中的回调。其中是典型AutowiredAnnotationBeanPostProcessor的使用实例。

2.2InstantiationAwareBeanPostProcessor.postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)

这个方法在设置属性之前可以想所有的属性进行检查,同时对所有的属性进行检查或者替换。返回的结果是处理后的属性值的value。 在Spring框架在 用户对象实例化以后,还未设置属性。在这个过程中能够对当前的顺序进行校验,添加,修改。

三:设置属性之后

这个时间点是对实例中的属性进行赋值,到系统最终指向完毕。这个过程主要是对当前系统中的属性进行扩展。

3.1:Aware属性设置,这个当中主要是将系统中的各种容器属性设置到当前系统中。

3.1.1 BeanNameAware.setBeanName(String name)

Bean对象通过继承BeanNameAware中的setBeanName(String name)方法,将容器中的属性名称设置给当前的Bean。

3.1.2  BeanClassLoaderAware.setBeanClassLoader(ClassLoader classLoader)

Bean定义的Bean,系统中将对应的ClassLoader注入到当前的Bean对象当中。

3.1.3 BeanFactoryAware.setBeanFactory(BeanFactory beanFactory)

通过这个方法,容器将当前容器的BeanFactory注入到Bean对象中。

3.2 BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName);

这个方法是在这个类刚刚赋值完成,返回的结果是一个被Wrapper包装的对象。

3.3 InitializingBean.afterPropertiesSet() 

这个方法是当前Bean被实例化以后,调用这个afterProperties()这个方法。

3.4 init-method:这个方法初始化方法。

这个方法中是一个基础的方法。

3.5 BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)

这个方法会在实例属性设置完成后调用,返回的结果是一个FacotyBean。同时也能够终止后续的操作。-

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 7
码字总数 19795
作品 0
Spring Bean的生命周期,《Spring 实战》书中的官方说法

连着两天的面试 ,都问到了 Spring 的Bean的生命周期,其中还包括 昨晚一波阿里的电话面试。这里找到了Spring 实战中的官方说法。希望各位要面试的小伙伴记住,以后有可能,或者是有时间 去看...

致未来的自己
08/02
0
0
Spring核心——IOC处理器扩展

非侵入式框架 Spring一直标注自己是一个非侵入式框架。非侵入式设计的概念并不新鲜,目标就是降低使用者和框架代码的耦合,毕竟框架的开发者和使用者几乎肯定不是同一个团队。Spring最早的非...

随风溜达的向日葵
07/05
0
3
Spring_总结_02_依赖注入

一、前言 本文承接上一节:Spring总结01_Spring概述 在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。 这一节我们开始了解Spring的第二大原则中的依赖注入,...

rayner
07/27
0
0
Spring Bean的生命周期

1.当调用者通过getBean(beanName)向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在实例化Bean之前,将调用接...

我吃草莓
2014/04/10
0
0
Spring IOC知识点一网打尽!

前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工...

Java3y
05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
1
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部