Spring緣起-後置處理器BeanPostProcessor的簡單介紹

BeanPostProcessor官方定義爲工廠鉤子,我們也俗稱後置處理器。它允許自定義修改新的bean實例,例如檢查標記接口或用代理包裝它們。應用程序上下文可以在其bean定義中自動檢測BeanPostProcessor bean,並將它們應用於隨後創建的任何bean。我們先簡單的瞭解下它的具體用法。

BeanPostProcessor是一個接口

public interface BeanPostProcessor {
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
    @Nullable
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

既然是接口,那麼我們要使用它就必須實現它,我們創建一個SimpleBeanPostProcessor類來實習該接口

@Component
public class SimpleBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization - " + bean.getClass().getName() + " - " + beanName);
        return null;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization  - " + bean.getClass().getName() + " - " + beanName);
        return null;
    }
}

我們在實現類中只是簡單的打印下bean的信息以及beanName

想要後置處理器起作用,那就必須啓動spring容器。我們使用AnnotationConfigApplicationContext來啓動spring容器。並且在spring中注入一個自定義Bean

@ComponentScan("spring.postProcessor")
@Configuration("spring.postProcessor.run")
public class Run {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Run.class);
        applicationContext.close();
    }

    /**
     * 通過@Bean的方式可以指定initMethod
     * @return
     */
    @Bean(initMethod = "init")
    public MyBean myBean() {
        return new MyBean();
    }
}

MyBean代碼如下

@Data
public class MyBean {
    private String beanName;
    private String className;
    public MyBean() {
        System.out.println("MyBean constructor");
    }
    public void init() {
        System.out.println("MyBean is init");
    }
}

運行後結果如下

postProcessBeforeInitialization - spring.postProcessor.Run$$EnhancerBySpringCGLIB$$db1dd68 - spring.postProcessor.run
postProcessAfterInitialization  - spring.postProcessor.Run$$EnhancerBySpringCGLIB$$db1dd68 - spring.postProcessor.run
MyBean constructor
postProcessBeforeInitialization - spring.postProcessor.MyBean - myBean
MyBean is init
postProcessAfterInitialization  - spring.postProcessor.MyBean - myBean

從打打印結果可以看出,後置處理器在bean的構造方法執行之後執行。而且後置處理器的方法postProcessBeforeInitialization和postProcessAfterInitialization分別在Bean的init方法前後執行。並且後置處理器會對spring中所有的bean起作用。
在spring源碼類org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory的方法initializeBean中,我們可以看到爲什麼會這樣執行。
clipboard.png

以上就是spring的後置處理器的簡單的使用方法以及執行時機。至於具體的實際使用案例,將在下一篇文章中講解!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章