1、InitializingBean接口
InitializingBean接口中隻有一個afterPropertiesSet方法,從方法的名稱上很容易了解,這個方法是在Bean的屬性都設定值後被調用,用于完成一些初始化工作。當然,在Spring的配置檔案中init-method的配置也是在Bean的屬性都設定值後被調用,用于完成一些初始化工作,不過在執行順序上,接口的方法先于配置。值得注意的是,這兩種方式都是用于完成一些初始化工作,是以相應的方法中不要編寫一些複雜且執行時間很長的邏輯。
當需要在bean的全部屬性設定成功後做些特殊的處理,可以讓該bean實作InitializingBean接口。效果等同于bean的init-method屬性的使用或者@PostContsuct注解的使用。
三種方式的執行順序:先注解,然後執行InitializingBean接口中定義的方法,最後執行init-method屬性指定的方法。
2、DisposableBean接口
DisposableBean接口中隻有一個destroy方法,該方法會在Bean被銷毀、生命周期結束之前被調用,用于做一些銷毀的收尾工作。同樣,在Spring的配置檔案中destroy-method配置也完成同樣的工作,不過在執行順序上,接口的方法先于配置。
當需要在bean銷毀之前做些特殊的處理,可以讓該bean實作DisposableBean接口。效果等同于bean的destroy-method屬性的使用或者@PreDestory注解的使用。
三種方式的執行順序:先注解,然後執行DisposableBean接口中定義的方法,最後執行destroy-method屬性指定的方法。
3、ApplicationContextAware接口
ApplicationContextAware中隻有一個setApplicationContext方法。實作了ApplicationContextAware接口的類,可以在該Bean被加載的過程中擷取Spring的應用上下文ApplicationContext,通過ApplicationContext可以擷取Spring容器内的很多資訊。
當一個類需要擷取ApplicationContext執行個體時,可以讓該類實作ApplicationContextAware接口。代碼展示如下:
public class Animal implements ApplicationContextAware, BeanNameAware{
private String beanName;
private ApplicationContext applicationContext;
public void setBeanName(String name) {
this.beanName = name;
}
/**
* @param applicationContext 該參數将由Spring容器自動指派
*/
public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
this.applicationContext = applicationContext;
}
public void run(){
System.out.println(beanName);
//釋出自定義事件
AnimalEvent event = new AnimalEvent(this, "老虎");
applicationContext.publishEvent(event);
}
}
通過@Autowired注解可以自動裝配一些常用對象執行個體:
@Autowired
private MessageSource messageSource;
@Autowired
private ResourceLoader resourceLoader;
@Autowired
private ApplicationContext applicationContext;
4、BeanFactoryAware接口
BeanFactoryAware接口中隻有一個setBeanFactory方法。實作了BeanFactoryAware接口的類,可以在該Bean被加載的過程中擷取加載該Bean的BeanFactory,同時也可以擷取這個BeanFactory中加載的其它Bean。
5、FactoryBean接口
FactoryBean接口可以實作Bean執行個體化的個性定制,讓Spring容器加載我們想要的Bean。實作了FactoryBean接口的類,可以通過實作getObject方法,實作加載我們想要的Bean。
6、BeanPostProcessor接口
BeanPostProcessor接口中有兩個方法,分别為postProcessBeforeInitialization和postProcessAfterInitialization。實作了BeanPostProcessor接口的類,會在每個Bean初始化(即調用setter)之前和之後,分别調用這個類中的postProcessBeforeInitialization方法和postProcessAfterInitialization方法,實作初始化的邏輯控制。
7、InstantiationAwareBeanPostProcessor接口
InstantiationAwareBeanPostProcessor接口中,常用的方法是postProcessBeforeInstantiation和postProcessAfterInstantiation。每個Bean的執行個體化(即調用構造函數)之前和之後,會分别調用實作了該接口的類中的postProcessBeforeInstantiation和postProcessAfterInstantiation方法。
8、BeanFactoryPostProcessor接口
BeanFactoryPostProcessor接口中隻有postProcessBeanFactory方法。實作了該接口的類,可以在Bean被建立之前,擷取容器中Bean的定義資訊,并且可以進行修改。實作類中的postProcessBeanFactory方法隻會被執行一次,且先于BeanPostProcessor接口的方法。
9、當需要監聽自定義事件時,可以建立一個實作ApplicationListener接口的類,并将該類配置到Spring容器中。代碼展示如下:
/**
* 自定義事件監聽器
*/
public class CustomEventListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof AnimalEvent){
AnimalEvent animalEvent = (AnimalEvent)event;
System.out.println("觸發自定義事件:Animal name is " + animalEvent.getName());
}
}
}
<!-- 自定義事件監聽器:Spring容器自動注冊它 -->
<bean id="customEventListener" class="com.cjm.spring.CustomEventListener"/>
要釋出自定義事件,需要調用ApplicationContext的publishEvent方法
10、ApplicationEvent抽象類
當需要建立自定義事件時,可以建立一個繼承自ApplicationEvent抽象類的類。代碼展示如下:
/**
* 自定義事件
*/
public class AnimalEvent extends ApplicationEvent {
private String name;
public String getName() {
return name;
}
/**
* @param source 事件源對象
*/
public AnimalEvent(Object source){
super(source);
}
public AnimalEvent(Object source, String name){
super(source);
this.name = name;
}
}
本文作者: java樂園
本文來自雲栖社群合作夥伴“
JAVA樂園”,了解相關資訊可以關注“
”