文档章节

谈谈Spring框架的BeanPostProcessor和BeanFactoryPostProcessor接口

鹜好逑
 鹜好逑
发布于 2017/03/14 14:31
字数 526
阅读 251
收藏 0

##概述

Spring作为Java项目中使用最广泛的框架,它的扩展性毋庸置疑,核心的容器功能从13年前的第一版到现在没变动过,只是在原先基础中不断添加新的能力,那新的功能是如何添加,这要说到Spring留给框架自身和使用者的两个接口BeanPostProcessorBeanFactoryPostProcessor (另外FactoryBean也是很重要的扩展接口)

##Bean初始化回调接口- BeanPostProcessor BeanPostProessor是Spring工厂的一个“钩子”接口,允许Bean实例化前后对Bean进行修改和增强 BeanPostProcessor接口定义如下:

//Bean实例的初始化回调接口 包括初始化前后初始化后 类似InitializingBean
//接口的afterPropertiesSet方法
// bean:Bean对象,beanName:Bean定义名称
public interface BeanPostProcessor{
    
       //Bean实例初始化之前调用 
        Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
        
       //Bean实例初始化之后调用
        Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

Spring框架很多功能通过继承BeanPostProcessor接口的来实现:

比如

  1. AutowiredAnnotationBeanPostProcessor实现@Autowired注解实现属性自动注入
  2. BeanValidationPostProcessor实现JavaBean属性校验(当然具体校验实现是JSR-303校验框架来做)
  3. 很多Spring AOP功能实现,比如BeanNameAutoProxyCreator

ApplicationContext会自动检测实现BeanPostProcessor类,并应用在Bean初始化上,而BeanFactory

Bean工厂初始化后修改Bean配置接口-BeanFactoryPostProcessor

除了BeanPostProcessor另外一大扩展接口就是BeanFactoryPostProcessor BeanFactoryPostProcessor可以修改ApplicationContext中的bean definitions,实现Bean功能近一步扩展

  1. 属性占位符配置 (context:property-placeholder PropertySourcesPlaceholderConfigurer)
  2. bean的自动扫描配置(context:component-scan ConfigurationClassPostProcessor)
  3. 属性类型转换处理(CustomEditorConfigurer)

BeanFactoryPostProcessor接口定义

public interface BeanFactoryPostProcessor{
     //beanFactory初始化完成后修改ApplicationContext的内部BeanFactory
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
        
}

例子 比如我们项目中所有实体类继承BaseModel,Model创建时候统一进行一些公共属性(createTime,updateTime)初始化

@Service
public class BaseModelBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("BaseModelBeanFactoryPostProcessor.postProcessBeanFactory");
        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
        for (String def : beanDefinitionNames) {
            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(def);
            MutablePropertyValues mpv = beanDefinition.getPropertyValues();

            if (beanDefinition.getBeanClassName().endsWith("Model")) {
                beanDefinition.getPropertyValues().add("createTime", new Timestamp(System.currentTimeMillis()));
                beanDefinition.getPropertyValues().add("updateTime", new Timestamp(System.currentTimeMillis()));
            }

        }

    }
}

© 著作权归作者所有

鹜好逑
粉丝 0
博文 8
码字总数 2611
作品 0
杭州
私信 提问
Spring Container的扩展点

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

晨曦之光
2012/04/25
491
0
Spring核心——IOC功能扩展点

上一篇文章介绍了非侵入式的框架的概念以及IOC的功能扩展点之一——BeanPostProcessor,我们接下来的内容继续说明IoC更多的扩展方法。 BeanFactoryPostProcessor BeanFactoryPostProcessor是...

随风溜达的向日葵
2018/07/11
209
0
Spring核心——IOC功能扩展点(二)

全文共 1685 个字 上一篇文章介绍了非侵入式的框架的概念以及IOC的功能扩展点之一——BeanPostProcessor,我们接下来的内容继续说明IoC更多的扩展方法。 BeanFactoryPostProcessor BeanFacto...

孟飞阳
2018/08/01
35
0
Spring中Bean的生命周期及其扩展点

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

超人归来007
2018/06/10
0
0
spring4.1.8扩展实战之七:控制bean(BeanPostProcessor接口)

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

博陵精骑
2018/09/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部