Spring源码窥探之:BeanPostProcessor

Spring的Bean后置处理器

1. 实体类

/**
 * @author 70KG
 * @Title: Train
 * @Description:
 * @date 2018/7/23下午11:31
 * @From www.nmyswls.com
 */
public class Train {

    public Train() {
        System.out.println("Train构造方法执行。。。。。。");
    }


    public void init() {
        System.out.println("Train的init方法执行。。。。。。");
    }

    public void destroy() {
        System.out.println("Train的destroy方法执行。。。。。。");
    }

}

2. 配置类

⚠️加上对实现类的扫描

/**
 * @author 70KG
 * @Title: config
 * @Description:
 * @date 2018/7/23下午11:31
 * @From www.nmyswls.com
 */
@Configuration
@ComponentScan("com.nmys.story.springCore.springioc.beanpostprocessor_")
public class Config01 {

    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Train train(){
        return new Train();
    }

}

3. BeanPostProcessor的实现类

⚠️加上@Component注解,目的为了让spring来管理这个实现类

/**
 * @author 70KG
 * @Title: BeanPostProcessorImpl
 * @Description: bean的后置处理器
 * @date 2018/7/23下午11:31
 * @From www.nmyswls.com
 */
@Component
public class BeanPostProcessorImpl implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 返回一个传过来的对象
        // 在初始化方法调用之前进行后置处理工作
        // 什么时候调用呢?在init-method方法之前就调用了
        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;
    }

}

4. 测试

/**
 * @author 70KG
 * @Title: FutureTaskTest
 * @Description:
 * @date 2018/7/23下午11:31
 * @From www.nmyswls.com
 */
public class Test01 {

    @Test
    public void test() {

        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(Config01.class);

        ac.close();

    }

}

5. 结果

Train构造方法执行。。。。。。
postProcessBeforeInitialization======train======com.nmys.story.springCore.springioc.beanpostprocessor_.Train@3b69e7d1
Train的init方法执行。。。。。。
postProcessAfterInitialization======train======com.nmys.story.springCore.springioc.beanpostprocessor_.Train@3b69e7d1
Train的destroy方法执行。。。。。。

BeanPostProcessor主要是在类初始化之前,跟之后处理相应的事。

原文地址:https://www.cnblogs.com/zhangjianbing/p/9823244.html