Spring BeanPostProcessor最佳实践

  • 扩展点简述

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 before 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 after any bean
     * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
     * or a custom init-method).
     * 

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最佳实践)