學習Spring 開發指南------基礎語義

abcbbc發表於2007-05-10

Dependency Injection
依賴注入的幾種實現型別

Type1 介面注入
Type2 構造子注入
Type3 設值注入
幾種依賴注入模式的對比總結

Spring Bean封裝機制
Bean Wrapper
Bean Factory
ApplicationContext Web Context

[@more@]


Component元件


IoC,用白話來講,就是由容器控制程式之間的關係,而非傳統實現中,由程式程式碼直接操控。這也就是所謂“控制反轉”的概念所在:控制權由應用程式碼中轉到了外部容器,控制權的轉移,是所謂反轉。
依賴注入機制減輕了元件之間的依賴關係,同時也大大提高了元件的可移植性,這意味著,元件得到重用的機會將會更多。
依賴注入的幾種實現型別
Type1 介面注入
常藉助介面來將呼叫者與實現者分離。如:
public class ClassA
{
private InterfaceB clzB;
public init() {
Ojbect obj =
Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
}
}
Type2 構造子注入
透過建構函式完成依賴關係的設定
public class DIByConstructor
{
private final DataSource dataSource;
private final String message;

public DIByConstructor(DataSource ds, String msg)
{
this.dataSource = ds;
this.message = msg;
}
}
Type3 設值注入
即透過類的setter方法完成依賴關係的設定。

幾種依賴注入模式的對比總結
介面注入模式因為具備侵入性,它要求元件必須與特定的介面相關聯,因此並不被看好,實際使用有限。
Type2和Type3的依賴注入實現模式均具備無侵入性的特點。在筆者看來,這兩種實現方式各有特點,也各具優勢(一句經典廢話)。

Spring Bean 封裝機制----Bean Wrapper
Bean Factory

為了實現無侵入性的目標。Spring 大量引入了Java 的Reflection機制,透過動態呼叫的方式避免硬編碼方式的約束,並在此基礎上建立了其核心元件BeanFactory,以此作為其依賴注入機制的實現基礎。
org.springframework.beans包中包括了這些核心元件的實現類,核心中的核心為BeanWrapper和BeanFactory類。

如果動態設定一個物件屬性,可以藉助Java的Reflection機制完成:
Class cls = Class.forName("net.xiaxin.beans.User");
Method mtd = cls.getMethod("setName",new Class[]{String.class});
Object obj = (Object)cls.newInstance();
mtd.invoke(obj,new Object[]{"Erica"});
return obj;
如何透過Spring BeanWrapper操作一個JavaBean:
Object obj = Class.forName("net.xiaxin.beans.User").newInstance();
BeanWrapper bw = new BeanWrapperImpl(obj);
bw.setPropertyValue("name", "Erica");
System.out.println("User name=>"+bw.getPropertyValue("name"));


Bean Factory,顧名思義,負責建立並維護Bean例項。
Bean Factory負責根據配置檔案建立Bean例項,可以配置的專案有:
1.Bean屬性值及依賴關係(對其他Bean的引用)
2.Bean建立模式(是否Singleton模式,即是否只針對指定類維持全域性唯一的例項)
3.Bean初始化和銷燬方法
4.Bean的依賴關係

Spring Bean Configuration Sample
id="TheAction" ⑴
class="net.xiaxin.spring.qs.UpperAction" ⑵
singleton="true" ⑶
init-method="init" ⑷
destroy-method="cleanup" ⑸
depends-on="ActionManager" ⑹
>

HeLLo








class="org.springframework.jndi.JndiObjectFactoryBean">

java:comp/env/jdbc/sample



InputStream is = new FileInputStream("bean.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
Action action = (Action) factory.getBean("TheAction");

ApplicationContext
BeanFactory提供了針對Java Bean的管理功能,而ApplicationContext提供了一個更為框架化的實現 ApplicationContext覆蓋了BeanFactory的所有功能,並提供了更多的特性。此外,ApplicationContext為與現有應用框架相整合,提供了更為開放式的實現
如對於Web應用,我們可以在web.xml中對ApplicationContext進行配置.

Web Context
ApplicationContext透過編碼載入。
對於Web應用,Spring提供了可配置的ApplicationContext載入機制。
載入器目前有兩種選擇:ContextLoaderListener和ContextLoaderServlet。
這兩者在功能上完全等同,只是一個是基於Servlet2.3版本中新引入的Listener介面實現,而另一個基於Servlet介面實現。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/219138/viewspace-914323/,如需轉載,請註明出處,否則將追究法律責任。

相關文章