1. 程式人生 > >Spring記錄之Bean屬性配置、依賴關係及生命週期

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>

分別表示List,Map,Set,Properties物件,然後,向其傳入任何可用於注入的其他型別的獨立元素,向給普通的<property>標籤配置屬性一樣

  • List和陣列型別,用<list>
  • 保持集合資料唯一,不重複,用Set集合
  • Map型別,用,子元素用<entry>,子元素包括<key>和<value><entry>的<value>子元素根上述兩種一樣,<key>只能是String

  • 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的方法