1. 程式人生 > >?spring中afterPropertiesSet方法與init-method配置描述

?spring中afterPropertiesSet方法與init-method配置描述

.post -m sse vax 註解 ota troy 一次 exc

spring中afterPropertiesSet方法與init-method配置描述

1. InitializingBean.afterPropertiesSet()
Spring中InitializingBean接口類為bean提供了定義初始化方法的方式,它僅僅包含一個方法:afterPropertiesSet()。
Bean實現這個接口,在afterPropertiesSet()中編寫初始化代碼:
在xml配置文件中並不需要對bean進行特殊的配置,Spring在在配置文件完成該bean的所有賦值後,會檢查該bean是否實現了InitializingBean接口,如果實現就調用bean的afterPropertiesSet方法。

2. init-method配置
Spring雖然可以通過InitializingBean完成一個bean初始化後調用這個bean自定義方法,但是這種方式要求bean實現InitializingBean接口。一但bean實現了InitializingBean接口,那麽這個bean的代碼就和Spring耦合到一起了。可以使用Spring提供的init-method的功能來執行一個bean自定義的初始化方法。
以下代碼中,類MonitorKafka不實現任何Spring的接口,定義一個沒有參數的方法monitorKafkaMsg()。

註:destroy-method是該bean銷毀前調用指定的方法。


init-method配置中的monitorKafkaMsg()方法將會在該bean初始化完成後被調用,Spring要求init-method是一個無參數的方法,否則會拋出異常,Spring將中止這個Bean的後續處理,並且拋出一個 org.springframework.beans.factory.BeanCreationException異常。

總結:
1. InitializingBean和init-method可以一起使用,Spring會先處理InitializingBean再處理init-method。init-method是通過反射執行的,而afterPropertiesSet是直接執行的,所以 afterPropertiesSet的執行效率比init-method要高,不過init-method消除了bean對Spring依賴,推薦使用init-method。


2. 如果一個bean被定義為非單例的,那麽afterPropertiesSet和init-method在bean的每一個實例被創建時都會執行。單例bean的afterPropertiesSet和init-method只在bean第一次被實例時調用一次。一般情況下afterPropertiesSet和init-method都應用在單例的bean上。
3. @PostConstruct和@PreDestory可以通過在類方法上註解方式實現類似的功能。

package com.wiley.beginningspring.exercises.ch2;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.InitializingBean;

public class Foo implements InitializingBean {

@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet method is called");
}

@PostConstruct
public void init() {
System.out.println("init method is called");
}

public void initialize() {
System.out.println("initialize method is called");
}

}

?spring中afterPropertiesSet方法與init-method配置描述