文档章节

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

 慕哲
发布于 2017/08/04 17:03
字数 1246
阅读 38
收藏 1
点赞 0
评论 0

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 IOC知识点一网打尽!

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

Java3y ⋅ 05/22 ⋅ 0

Spring中涉及的设计模式总结

Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式:BeanFactory。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是...

caoxiaohong1005 ⋅ 04/22 ⋅ 0

Spring中关于bean的作用域与生命周期

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什...

忻胜霄 ⋅ 06/07 ⋅ 0

Spring中Bean的生命周期及其扩展点

Spring中Bean的管理是其最基本的功能,根据下面的图来了解Spring中Bean的生命周期: 解说: (1)BeanFactoryPostProcessor的postProcessorBeanFactory()方法:若某个IoC容器内添加了实现了B...

超人归来007 ⋅ 06/10 ⋅ 0

spring4.0之二:@Configuration的使用

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfi...

文文1 ⋅ 06/01 ⋅ 0

spring梳理(二) 基于注解的方式注册bean

我们知道,如果想要将bean交由spring容器管理,就需要首先将bean注册在spring容器中,而bean可以通过xml或者注解的方式进行注册,基于xml的配置一般是通过、等xml标签进行配置,然后由sprin...

wyn_lin ⋅ 05/25 ⋅ 0

说说 Spring Bean 的作用域

配置文件中定义 Bean 时,我们不但可以配置 Bean 的属性值以及相互之间的依赖关系,还可以定义 Bean 的作用域 。作用域会对 Bean 的生命周期和创建方式产生影响 。 Bean 的作用域类型: 低版...

deniro ⋅ 05/07 ⋅ 0

Spring与SpringMVC的容器关系分析

Spring与SpringMVC的容器关系分析 结论: Spring(springContext.xml)容器配置,排除所有@controller 的Bean <context:component-scan base-package="com.service,com.util,com.dao" > Spri......

LYQ1990 ⋅ 2016/05/24 ⋅ 0

Spring Bean 生命周期回调

Spring生命周期回调说明 如果只是简单的对象初始化,我们可以将其放到构造器中处理;如果是对注入的类或者帮助类做一些初始化处理,可以考虑使用初始化方法。 Spring提供了很多的扩展点,其中...

花_现 ⋅ 2016/11/13 ⋅ 0

说说在 Spring 中如何基于 Java 类进行配置

JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能 。 1 定义 Bean 普通的 POJO 只要标注...

deniro ⋅ 05/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx服务架构初探(四):nginx服务器的rewrite功能

nginx服务器的rewrite功能 1.nginx后端服务器组的配置 1>upstream name {…} name是给服务器组限的组名 2>server address [parameters]; address为服务器地址 parame......

余温灬未存 ⋅ 今天 ⋅ 0

layer.prompt使文本框为空的情况下也能点击确定

最近一直在使用layui,但是用到弹出层layer.prompt时,如果文本框是空的话点击确定没有反应,不能向下执行。 但是我又需要空值,看看我原来的代码。 123456789 layer.prompt...

孟飞阳 ⋅ 今天 ⋅ 0

Linux普通文件压缩工具gzip、Bzip2、xz

第六章 文件压缩和打包 6.1 压缩打包介绍 Linux环境常见压缩文件类型: .zip,.gz,.bz2,.xz, .tar.gz,.tar.bz2,.tar.xz 压缩打包的目的 方便文件传输 节省磁盘空间 减少传输花费的时间 ...

弓正 ⋅ 今天 ⋅ 0

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

阿里云云栖社区 ⋅ 今天 ⋅ 0

zabbix短信报警统计以及报表展示

一、需求 由于我们的业务报警比较频繁,之前是针对每个报警进行具体处理,但是有时还会重复出现,或者后续处理有时忘记跟进等,因此进行报警短信的统计,可以针对一些问题与业务跟进,明确后...

o翡翠谷o ⋅ 今天 ⋅ 0

JNI 输出LOG

1、导入log头文件。在你使用的 .c/ .cpp 文件中,导入 log.h 头文件。 #include<android/log.h> 2、在android.mk 加上 LOCAL_LDLIBS := -llog 或 LOCAL_SHARED_LIBRARIES := liblog 3、定义L......

国仔饼 ⋅ 今天 ⋅ 0

主线程pthread_exit 作用

#include <iostream>#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 10void* say_hello(void* args){ int i = *((int*)args);/......

xxdd ⋅ 今天 ⋅ 0

崛起于Springboot2.X之Mybatis-xml方式操作mysql数据库(3)

序言:当第一篇讲道Mybatis的时候,只要使用过mybatis的java程序员100%都会知道这种方式,因为这是最广泛最全面的编写sql操作mysql数据库的方式,高级sql的编写往往通过xml方式,接下来进入正...

木九天 ⋅ 今天 ⋅ 1

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

猫耳m ⋅ 今天 ⋅ 0

spring elasticsearch 2.4 date 日期

1.mappingPUT user_behavior { "mappings": { "user_behavior": { "properties": { "date": { "type": "createDate", ......

xiaomin0322 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部