文档章节

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

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

没有更多内容

加载失败,请刷新页面

加载更多

kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
6
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
2
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
14
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0
Redis性能问题排查解决手册

一、性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。 nfo命令输出的数据可...

IT--小哥
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部