美文网首页
Spring BeanPostProcessor最佳实践

Spring BeanPostProcessor最佳实践

作者: 单名一个冲 | 来源:发表于2021-03-08 10:03 被阅读0次
  • 扩展点简述

Factory hook that allows for custom modification of new bean instances — for example, checking for marker interfaces or wrapping beans with proxies. Typically, post-processors that populate beans via marker interfaces or the like will implement {@link #postProcessBeforeInitialization}, while post-processors that wrap beans with proxies will normally implement {@link #postProcessAfterInitialization}.

  • 扩展点的生命周期及扩展点的执行时机

属于Bean的实例化阶段扩展,针对于任何Bean的实例化。
执行时机分别位于InitializingBean's afterPropertiesSet方法或者init-method之前和之后,
此时Bean以及实例化完成,对象属性已经注入。

  • 扩展点的作用

对实例化Bean做进一步的处理,在扩展时机前后调用,把控好时机扩展就好。
比如做一些注解配置的处理等,其他的博主暂时想不到有好的玩法/(ㄒoㄒ)/~~

  • 扩展点实战

/**
 * BeanPostProcessor接口默认实现了postProcessBeforeInitialization和postProcessAfterInitialization两个方法,
 * 作用范围:任何Bean实例化对象
 * 方法执行时机:参照各方法注释
 */
@Component
public class TestBeanPostProcess implements BeanPostProcessor {

    /**
     * Apply this {@code BeanPostProcessor} to the given new bean instance <i>before</i> any bean
     * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
     * or a custom init-method).
     *
     * 执行时机:InitializingBean's afterPropertiesSet方法或者init-method之前执行。
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor-Before: " + beanName);
        return bean;
    }

    /**
     * Apply this {@code BeanPostProcessor} to the given new bean instance <i>after</i> any bean
     * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
     * or a custom init-method).
     * <p>In case of a FactoryBean, this callback will be invoked for both the FactoryBean
     * instance and the objects created by the FactoryBean (as of Spring 2.0).
     *
     * 执行时机:InitializingBean's afterPropertiesSet方法或者init-method之后。
     *
     * 注意:Spring2.0后,FactoryBean也要走这个方法。
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor-After: " + beanName);
        return bean;
    }
}
  • BeanPostProcessor的扩展资料

不仅可以实现BeanPostProcessor扩展,Spring还有一些他的子类也提供了扩展:

  • DestructionAwareBeanPostProcessor
    在销毁该BeanPostProcessor之前,将其应用于给定的bean实例。
    例如,调用自定义销毁回调。像DisposableBean的destroy和自定义destroy方法一样,
    此回调仅适用于生命周期完全被容器管理的Bean。 单例和作用域bean通常是这种情况。

  • InstantiationAwareBeanPostProcessor
    添加了实例化之前的回调,以及在实例化之后但设置了显式属性或发生自动装配之前的回调。
    通常用于抑制特定目标Bean的默认实例化,例如创建具有特殊TargetSource的代理(池目标,延迟初始化目标等),或实现其他注入策略,例如字段注入。
    但官方说这个一般应用于内部代码,所以扩展须掌握会具体影响到哪些Bean。

更多Spring扩展请查看专题Spring开发笔记

相关文章

网友评论

      本文标题:Spring BeanPostProcessor最佳实践

      本文链接:https://www.haomeiwen.com/subject/vcsyqltx.html