美文网首页
Spring注解:BeanPostProcessor

Spring注解:BeanPostProcessor

作者: 因你而在_caiyq | 来源:发表于2020-04-13 23:26 被阅读0次

    原创文章,转载请注明原文章地址,谢谢!

    BeanPostProcessor

    在Spring中为我们提供了一个扩扎接口BeanPostProcessor,该接口有两个方法:

    • postProcessBeforeInitialization:在初始化之前进行后置处理
    • postProcessAfterInitialization:在初始化之后进行后置处理
    /**
     * 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;
        }
    }
    
    自定义BeanPostProcessor
    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("postProcessBeforeInitialization----" + beanName + "----" + bean);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("postProcessAfterInitialization----" + beanName + "----" + bean);
            return bean;
        }
    }
    

    测试

    @Test
    public void testBeanPostProcessor() {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("容器创建完成");
    
        //关闭容器
        applicationContext.close();
        System.out.println("容器关闭");
    }
    
    Student 构造器
    postProcessBeforeInitialization----student----com.caiyq.spring.annotation.bean.Student@5066d65f
    Student 对象创建之后
    postProcessAfterInitialization----student----com.caiyq.spring.annotation.bean.Student@5066d65f
    容器创建完成
    ......
    Student 对象销毁之前
    容器关闭
    

    分析:Student对象是使用@PostConstruct和@PreDestroy进行标注的,在容器启动的时候,创建Student对象,那么在初始化之前,执行了postProcessBeforeInitialization方法,并打印出了具体Bean的对象实例及名称,在初始化之后,同样调用了postProcessAfterInitialization方法,然后容器创建完成。

    Spring提供的BeanPostProcessor接口,能感受到Bean的生命周期中初始化过程,可以在Bean初始化的前后进行一些处理。

    博客内容仅供自已学习以及学习过程的记录,如有侵权,请联系我删除,谢谢!

    相关文章

      网友评论

          本文标题:Spring注解:BeanPostProcessor

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