美文网首页
Spring之BeanPostProcessor接口

Spring之BeanPostProcessor接口

作者: zhglance | 来源:发表于2020-02-07 15:03 被阅读0次

    BeanPostProcessor接口是Spring IOC容器给我们提供的一个扩展接口,接口定义如下:

    /*
      
    package org.springframework.beans.factory.config;
    
    import org.springframework.beans.BeansException;
    import org.springframework.lang.Nullable;
    
    /**
     * Factory hook that allows for custom modification of new bean instances —
     * for example, checking for marker interfaces or wrapping beans with proxies.
     *
     * <p>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}.
     *
     * <h3>Registration</h3>
     * <p>An {@code ApplicationContext} can autodetect {@code BeanPostProcessor} beans
     * in its bean definitions and apply those post-processors to any beans subsequently
     * created. A plain {@code BeanFactory} allows for programmatic registration of
     * post-processors, applying them to all beans created through the bean factory.
     *
     * <h3>Ordering</h3>
     * <p>{@code BeanPostProcessor} beans that are autodetected in an
     * {@code ApplicationContext} will be ordered according to
     * {@link org.springframework.core.PriorityOrdered} and
     * {@link org.springframework.core.Ordered} semantics. In contrast,
     * {@code BeanPostProcessor} beans that are registered programmatically with a
     * {@code BeanFactory} will be applied in the order of registration; any ordering
     * semantics expressed through implementing the
     * {@code PriorityOrdered} or {@code Ordered} interface will be ignored for
     * programmatically registered post-processors. Furthermore, the
     * {@link org.springframework.core.annotation.Order @Order} annotation is not
     * taken into account for {@code BeanPostProcessor} beans.
     *
     * @author Juergen Hoeller
     * @author Sam Brannen
     * @since 10.10.2003
     * @see InstantiationAwareBeanPostProcessor
     * @see DestructionAwareBeanPostProcessor
     * @see ConfigurableBeanFactory#addBeanPostProcessor
     * @see BeanFactoryPostProcessor
     */
    public interface 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). The bean will already be populated with property values.
         * The returned bean instance may be a wrapper around the original.
         * <p>The default implementation returns the given {@code bean} as-is.
         * @param bean the new bean instance
         * @param beanName the name of the bean
         * @return the bean instance to use, either the original or a wrapped one;
         * if {@code null}, no subsequent BeanPostProcessors will be invoked
         * @throws org.springframework.beans.BeansException in case of errors
         * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet
         */
        @Nullable
        default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            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). The bean will already be populated with property values.
         * The returned bean instance may be a wrapper around the original.
         * <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). The
         * post-processor can decide whether to apply to either the FactoryBean or created
         * objects or both through corresponding {@code bean instanceof FactoryBean} checks.
         * <p>This callback will also be invoked after a short-circuiting triggered by a
         * {@link InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation} method,
         * in contrast to all other {@code BeanPostProcessor} callbacks.
         * <p>The default implementation returns the given {@code bean} as-is.
         * @param bean the new bean instance
         * @param beanName the name of the bean
         * @return the bean instance to use, either the original or a wrapped one;
         * if {@code null}, no subsequent BeanPostProcessors will be invoked
         * @throws org.springframework.beans.BeansException in case of errors
         * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet
         * @see org.springframework.beans.factory.FactoryBean
         */
        @Nullable
        default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    
    }
    
    

    在Spring启动过程中,当BeanPostProcessor的接口实现类(如AbstractAutoProxyCreator、DefaultAdvisorAutoProxyCreator等)注册到Spring IOC容器后进行如下操作:
    a.对于IOC容器所创建的每个bean实例在初始化方法(如afterPropertiesSet和init方法)调用前,将会调用BeanPostProcessor中的

    Object postProcessBeforeInitialization(Object bean, String beanName) ;
    

    方法;
    b.在bean实例初始化方法(如afterPropertiesSet和init方法)调用完成后,则会调用BeanPostProcessor中的

    Object postProcessAfterInitialization(Object bean, String beanName);
    

    方法。

    具体过程如下:

    1.Spring IOC容器实例化Bean;
    2.调用BeanPostProcessor接口实现类中的postProcessBeforeInitialization方法;
    3.调用bean实例的初始化方法(afterPropertiesSet()和init()方法);
    4.调用BeanPostProcessor的postProcessAfterInitialization方法。
    

    在实际项目开发中,Spring IOC容器中会配置多个BeanPostProcessor接口实现类,在默认情况下Spring IOC容器会根据BeanPostProcessor接口实现类的定义顺序来依次调用。

    相关文章

      网友评论

          本文标题:Spring之BeanPostProcessor接口

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