文档章节

Spring中的BeanPostProcessor接口

 真爱2015
发布于 2015/12/24 10:28
字数 714
阅读 58
收藏 2

Spring提供了很多扩展接口,BeanPostProcessor接口和InstantiationAwareBeanPostProcessor接口就是其中两个。


BeanPostProcessor

BeanPostProcessor接口作用是:如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现,然后注册到容器中。

Spring中Bean的实例化过程图示:


由上图可以看到,Spring中的BeanPostProcessor在实例化过程处于的位置,BeanPostProcessor接口有两个方法需要实 现:postProcessBeforeInitialization和 postProcessAfterInitialization,BeanPostProcessor接口定义如下:

[javascript] view plaincopy

  1. package org.springframework.beans.factory.config;  

  2.   

  3. import org.springframework.beans.BeansException;  

  4.   

  5. public interface BeanPostProcessor {  

  6.   

  7.     Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;  

  8.   

  9.     Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;  

  10. }  


由方法名字也可以看出,前者在实例化及依赖注入完成后、在任何初始化代码(比如配置文件中的init-method)调用之前调用;后者在初始化代码调用之后调用。

注意:

1、接口中的两个方法都要将传入的bean返回,而不能返回null,如果返回的是null那么我们通过getBean方法将得不到目标。

2、BeanFactory和ApplicationContext对待bean后置处理器稍有不同。ApplicationContext会自动检测在 配置文件中实现了BeanPostProcessor接口的所有bean,并把它们注册为后置处理器,然后在容器创建bean的适当时候调用它,因此部署 一个后置处理器同部署其他的bean并没有什么区别。而使用BeanFactory实现的时候,bean 后置处理器必须通过代码显式地去注册,在IoC容器继承体系中的ConfigurableBeanFactory接口中定义了注册方法:

[java] view plaincopy

  1. /** 
     * Add a new BeanPostProcessor that will get applied to beans created 
     * by this factory. To be invoked during factory configuration. 
     * <p>Note: Post-processors submitted here will be applied in the order of 
     * registration; any ordering semantics expressed through implementing the 
     * {@link org.springframework.core.Ordered} interface will be ignored. Note 
     * that autodetected post-processors (e.g. as beans in an ApplicationContext) 
     * will always be applied after programmatically registered ones. 
     * @param beanPostProcessor the post-processor to register 
     */  
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

另外,不要将BeanPostProcessor标记为延迟初始化。因为如果这样做,Spring容器将不会注册它们,自定义逻辑也就无法得到应用。假如 你在<beans />元素的定义中使用了'default-lazy-init'属性,请确信你的各个BeanPostProcessor标记为'lazy- init="false"'。


InstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口,可以在Bean生命周期的另外 两个时期提供扩展的回调接口,即实例化Bean之前(调用postProcessBeforeInstantiation方法)和实例化Bean之后(调 用postProcessAfterInstantiation方法),该接口定义如下:

[java] view plaincopy

  1. package org.springframework.beans.factory.config;  
      
    import java.beans.PropertyDescriptor;  
      
    import org.springframework.beans.BeansException;  
    import org.springframework.beans.PropertyValues;  
      
    public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {  
      
        Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;  
      
        boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;  
      
        PropertyValues postProcessPropertyValues(  
                PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)  
                throws BeansException;  
      
    }


其使用方法与上面介绍的BeanPostProcessor接口类似,只时回调时机不同。


本文转载自:http://blog.csdn.net/wyabc1986/article/details/9415463

粉丝 20
博文 103
码字总数 30911
作品 0
东城
私信 提问
spring--BeanPostProcesstor

beanFactoryPostProcesstor和BeanPostProcessor是spring的钩子函数,是spring的bean初始化对外暴露的扩展点。 BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口。 如图,我们可以...

卢先生程序员
09/03
21
0
再谈Spring BeanPostProcessor

之前已经就spring中的BeanPostProcessor使用方法以及其实现细节谈论过,现在从更加宏观、抽象的角度去理解spring的bpp具体是如何工作的,现在spring自身有多少bpp,如果我们有自定义的bpp需求...

jwfy
2018/07/03
0
0
Spring Container的扩展点

Spring在解析完配置文件后,会调用一些callback方法,使用Spring的开发者可以通过提供这些callback方法达到对Spring Container的扩展. 1,通过实现BeanPostProcessor来完成对某些Bean的一些'定制...

晨曦之光
2012/04/25
488
0
spring4.1.8扩展实战之七:控制bean(BeanPostProcessor接口)

版权声明:欢迎转载,请注明出处,谢谢。 https://blog.csdn.net/boling_cavalry/article/details/82250986 本章是《spring4.1.8扩展实战》的第七篇,我们来尝试在容器初始化的时候对bean实例...

博陵精骑
2018/09/02
0
0
Spring探秘|妙用BeanPostProcessor

最近,在给项目组使用Spring搭建Java项目基础框架时,发现使用Spring提供的BeanPostProcessor可以很简单方便地解决很多看起来有点难解决的问题。本文将会通过一个真实案例来阐述BeanPostPro...

圆圆仙人球
2017/08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么?老程序员申请加薪至30K遭拒愤然辞职,公司转眼花35K招新

身在职场,经常会暗自打听同事工资,尤其是得知身边新入职同事的工资居然比自己高,还高出一大截时,心里自然很不平衡,一心想要离职。 那么,为什么公司宁愿花高价招聘新员工也不愿意给老员...

Java技术剑
30分钟前
9
0
云桌面到底是什么,企业该用云桌面吗

随着云计算和大数据时代的到来,当前企业里讨论最多的话题之一就是:企业到底要不要用云桌面这个话题的,有的人说企业应该使用云桌面的,因为可以降低使用成本和简化运维管理,同时也有的人说...

GZASD
34分钟前
5
0
技术分享 | gh-ost 原理剖析

作者简介: 杨奇龙,网名“北在南方”,7年DBA老兵,目前任职于杭州有赞科技DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。 一、简介 上一篇文章(gh-ost ...

爱可生
38分钟前
5
0
手机短信删除了怎么恢复?几个方法就能恢复

  手机短信删除了怎么恢复?前几天有个小伙伴收到了一条来着面试的通知,这个面试对他很重要,但是可气的是刚好在清理手机里面的垃圾短信,然后收到了短信之后又被删除了,却又不知道该怎么...

科技第六人
52分钟前
6
0
浅谈Builder建造者模式

一、前言 Builder建造者模式和模板模式非常像,但是也有区别,模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在Builder模式之中,父类和子类都不用关心怎么处理...

青衣霓裳
57分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部