Spring 详解Bean的后置处理器

Bean的后置处理器详解:

Spring当中的后置处理器是Spring体用的一个扩展点,开发者只要去实现,Spring当中的BeanPostProcessor接口,那么就能插手SpringBean实例化的一个过程,怎么插手呢?

它是在我们bean被放到Spring Bean容器之前去做一个插手,也就是说可以对我们的bean做一个改变。

 Spring 在实例化单例Bean的过程中,会在9个地方执行5个后置处理器。       

第一个后置处理器:

BeanPostProcessor

bean工厂的bean属性处理容器,就是可以管理我们的bean工厂内所有的beandefinition(未实例化)数据,可以随心所欲的修改属性。它有下面两个方法:

方法说明
postProcessBeforeInitialization初始化之前完成一些定制的业务逻辑
postProcessAfterInitialization初始化完毕时执行的业务逻辑

 第二个后置处理器:

InstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor接口继承BeanPostProcessor接口,它内部提供了3个方法,再加上BeanPostProcessor接口内部提供的2个方法,所以实现这个接口需要实现5个方法。InstantiationAwareBeanPostProcessor接口的主要作用在于目标对象的实例化过程中需要处理的事情,包括实例化对象的前后过程以及实例的属性设置。

方法说明
postProcessBeforeInstantiation()在目标对象实例化之前调用,方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未被实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(一般是代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessorAfterIniaialization方法会调用,其他方法不再调用,否则按照正常流程走。
postProcessAfterInstantiation()方法在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。如果该方法的返回值是false,会忽略属性值的设置;如果返回true,会按照正常流程设置属性值。方法不管postProcessBeforeInstantiation()返回什么都会执行
postProcessPropertyValues()方法对属性值进行修改(这个时候属性值还未被设置,但是我们可以修改原本该设置进去的属性值)如果postProcessAfterInstantiation()返回false,该方法不会被调用

第三个后置处理器:

SmartInstantiationAwareBeanPostProcessor

智能实例化Bean后置处理器(继承InstantiationAwareBeanPostProcessor),内部提供了3个方法

方法说明
determineCandidateConstructors()监测Bean的构造器
predictBeanType()预测bean的类型
getEarlyBeanReference()循环引用的后置处理器,这个比较复杂,获取提前暴露的bean引用。主要用于解决循环引用的问题。只有单例对象才会调用此方法。

第四个后置处理器:

MergedBeanDefinitionPostProcessor

合并bean信息,或者说合并属性的后置处理器

方法说明
postProcessMergedBeanDefinition()缓存bean注入信息的后置处理器,仅仅是缓存或者说是查询,没有完成注入,注入是另外一个后置处理器的作用

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Spring Bean的生命周期可以分为以下几个阶段: 1. 实例化(Instantiation):在该阶段,Spring容器根据配置信息或注解创建Bean的实例。这可以通过构造函数或工厂方法进行实例化。 2. 属性赋值(Population):在该阶段,Spring容器为Bean的属性赋值。这可以通过依赖注入(DI)或属性注入来完成。依赖注入是指通过构造函数、Setter方法或字段注入其他Bean的引用。 3. 初始化(Initialization):在该阶段,Spring容器对Bean进行初始化。这可以通过实现InitializingBean接口或在配置文件中指定init-method方法来实现。在这个阶段,可以执行一些初始化操作,例如建立数据库连接、加载资源等。 4. 使用(In Use):在该阶段,Bean可以被正常使用。它可以被其他Bean引用,也可以执行一些业务逻辑。 5. 销毁(Destruction):在该阶段,Spring容器销毁Bean实例。这可以通过实现DisposableBean接口或在配置文件中指定destroy-method方法来实现。在这个阶段,可以执行一些清理操作,例如关闭数据库连接、释放资源等。 需要注意的是,Spring容器并不管理所有Bean的生命周期。通常情况下,Spring只管理由容器实例化的单例Bean的生命周期。原型Bean的生命周期由客户端负责管理。 另外,还可以通过Bean后置处理器BeanPostProcessor)来对Bean的生命周期进行自定义扩展。Bean后置处理器可以在Bean实例化、属性赋值、初始化等阶段进行一些额外的处理操作。例如,可以在Bean初始化之前进行一些自定义操作,或者在Bean销毁之前进行一些清理操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小tu豆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值