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中,我們可以看到爲什麼會這樣執行。
以上就是spring的後置處理器的簡單的使用方法以及執行時機。至於具體的實際使用案例,將在下一篇文章中講解!