文档章节

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

 慕哲
发布于 2017/08/04 17:03
字数 1246
阅读 84
收藏 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 Cloud Config 规范

Spring Cloud Config 规范 首先Spring Cloud 是基于 Spring 来扩展的,Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过@Value的形式注入到业务代码中的能力。那Sprin...

中间件小哥
12/12
0
0
Spring Bean的生命周期

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

我吃草莓
2014/04/10
0
0
Spring_总结_02_依赖注入

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

rayner
07/27
0
0
Spring核心——IOC处理器扩展

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

随风溜达的向日葵
07/05
0
3

没有更多内容

加载失败,请刷新页面

加载更多

教你React Native使用fetch实现图片上传

这篇文章主要介绍了详解react关于事件绑定this的四种方式,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 在react组件中,每个方...

前端攻城老湿
6分钟前
1
0
webpack+vuex+axios 跨域请求数据的示例

本篇文章主要介绍了webpack+vuex+axios 跨域请求数据,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 使用vue-li 构建 webpack项...

前端攻城小牛
11分钟前
1
0
基础编程题目集-6-10 阶乘计算升级版

本题要求实现打印非负整数阶乘,其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。 输入格式: 每个输入包含一个测试...

niithub
11分钟前
1
0
聊聊flink的FsStateBackend

序 本文主要研究一下flink的FsStateBackend StateBackend flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/StateBackend.java @PublicEvolvingpublic interface Sta......

go4it
40分钟前
1
0
webpack配置proxyTable时pathRewrite无效的解决方法

webpack配置接口地址代理 在项目开发中,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们在本地启动服务器后,比如本地开发服务下是 http://localhost:8080 ...

前端小攻略
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部