Spring記錄之Bean屬性配置、依賴關係及生命週期
Spring配置Bean的屬性和依賴關係
Spring的IOC容器負責管理所有的應用系統元件,並協助元件之間建立關聯。
Spring支援Properties檔案格式,和XML檔案配置,XML是常用的。
設定普通屬性值(設值注入)
當bean例項建立以後,Spring會遍歷配置檔案的<bean>
元素中所有的<property>
子元素,每發現一個<property>
,就根據name屬性呼叫相應的setter方法
用反射來理解的話,程式碼如下:
容器初始化時
//反射建立例項
Class target = Class.forName("com.spring.bean.Animal" );
Object bean = target.newInstance();
//初始化容器時,呼叫setter注入
String _setName = "set" + name屬性值;
Method setMethod = target.getMethod(setName,Arthur.getClass());
setMethod.invoke(bean,Arthur);
用內省理解的話,差別在於獲取setter方法
//反射建立例項
Class target = Class.forName("com.spring.bean.Animal");
Object bean = target.newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Method setter = null ;
if(pds!=null){
for(PropertyDescriptor pd : pds) {
String fieldName = pd.getName();
if(fieldName.equals('<property>的name屬性值')){
setter = fieldName.getMethodDescriptor();
}
}
}
setter.invoke(bean,'ref的物件');
設定合作Bean
注入集合
Spring通過<list><map><set>或<props>
<property>
標籤配置屬性一樣
- List和陣列型別,用
<list>
- 保持集合資料唯一,不重複,用Set集合
Map型別,用
Properties集合用
<prop>
元素配置,Properties的key和value只能是String型別。<property><props><prop key="aa">bb</prop></props></property>
Spring管理Bean的生命週期
Spring 3.0之後又5種作用域
- Singleton: 單例,不解釋
- Prototype: 原型模式,每次從容器獲取Bean時,建立一個新的例項
- Request: 針對每次Http請求,產生一個新的Bean例項,其僅當前request有效
- Session: 同上,僅當前session有效
- Global session: 類似上述Session,但僅僅基於portlet的web應用才有效
scope為singleton
Spring可以管理scope為singleton的Bean的生命週期,Spring可以精確知道Bean何時建立,何時初始化完成,何時被銷燬。scope為prototype
Spring僅僅負責建立,scope為prototype的Bean不會注入容器,例項建立後,例項完全交給客戶端程式碼管理。
有兩個生命週期時間點與Bean關係尤為重要
- psotinitiation 初始化後
- predestruciton 銷燬前
Spring提供兩種機制,並執行一些附加的基於interface或method的處理
基於介面
- Spring廣泛運用基於介面的機制。
- 如果不太關注移植性,或者定義了許多需要用到生命週期通知的同類型Bean,使用介面可確保Bean總能收到通知,程式碼更簡潔
基於方法
- 如果注重移植性,或指定一兩個需要回調的特定型別的Bean,使用基於方法機制
這當中有些重要的介面可以讓Bean繼承或實現
- BeanNameAware,setBeanName(String id)方法獲得Bean自己的名字
- BeanFactoryAware,setBeanFactoryAware()獲取容器引用
- ApplicationContextAware,setApplicationContext()獲取容器引用
- BeanPostProcessor,postProcessAfterInitialization()
- InitializingBean,afterPropertiesSet()Bean初始化後執行,但該介面是侵入式設計
- init-method屬性指定初始化方法
- BeanPostProcessor,postProcessAfterInitialization()
- DisposableBean,destory()方法
- destory-method屬性指定銷燬Bean的方法