谈谈Spring框架的BeanPostProcessor和BeanFactoryPostProcessor接口

##概述

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()));
            }

        }

    }
}

转载于:https://my.oschina.net/u/1392577/blog/858321

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值