學習Spring 開發指南------Spring初探

abcbbc發表於2007-05-09

Ø 首先,我們的元件並不需要實現框架指定的介面,因此可以輕鬆的將元件從Spring中脫離,甚
至不需要任何修改(這在基於EJB框架實現的應用中是難以想象的)。
Ø 其次,元件間的依賴關係減少,極大改善了程式碼的可重用性。

[@more@]

applicationContext.xml :



Spring Quick Start
class="net.xiaxin.spring.qs.UpperAction">

HeLLo


testQuickStart.java:
package net.xiaxin.spring.qs;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class testQuickStart {
public void aa() {
ApplicationContext ctx=new
FileSystemXmlApplicationContext("applicationContext.xml");
Action action = (Action) ctx.getBean("TheAction");
System.out.println(action.execute("Rod Johnson"));
}
public static void main(String[]args)
{
testQuickStart a = new testQuickStart();
a.aa();
}
}


Action.java
package net.xiaxin.spring.qs;
public interface Action {
public String execute(String str);
}

UpperAction.java package net.xiaxin.spring.qs;
public class UpperAction implements Action {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String string) {
message = string;
}
public String execute(String str) {
return (getMessage() + str).toUpperCase();
}
}


執行測試程式碼,我們看到控制檯輸出:
HELLO ROD JOHNSON
Spring的依賴注入機制,可以在執行期為元件配置所需資源,而無需在編寫元件程式碼時就加以
指定,從而在相當程度上降低了元件之間的耦合。
上面的例子中,我們透過Spring,在執行期動態將字串 “HeLLo” 注入到Action實現類的
Message屬性中。

仔細觀察一下上面的程式碼,可以看到:
1. 我們的所有程式程式碼中(除測試程式碼之外),並沒有出現Spring中的任何元件。
2. UpperAction和LowerAction的Message屬性均由Spring透過讀取配置檔案(bean.xml)動態設定。
3. 客戶程式碼(這裡就是我們的測試程式碼)僅僅面向介面程式設計,而無需知道實現類的具體名稱。同時,
我們可以很簡單的透過修改配置檔案來切換具體的底層實現類。

傳統編碼過程中,引入一個介面,往往也意味著同時要引入一個Factory類,也許還有一個額外的配置文
件及其讀寫程式碼
傳統編碼:
首先,我們必須編寫一個配置檔案讀取類,以實現Message屬性的可配置化。
其次,得有一個Factory模式的實現,並結合配置檔案的讀寫完成Action的動態載入。
config.properties:
TheAction=net.xiaxin.spring.qs.UpperAction
TheAction_msg=HeLLo

ActionFactory:
package net.xiaxin.spring.qs;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;

import org.apache.commons.beanutils.BeanUtils;

public class ActionFactory{
public static Action getAction(String actionName){
Properties pro = new Properties();
try {
pro.load(new FileInputStream("config.properties"));
String actionImplName =
(String)pro.get(actionName);
String actionMessage =
(String)pro.get(actionName+"_msg");
Object obj =
Class.forName(actionImplName).newInstance();
// BeanUtils是Apache Commons BeanUtils提供的輔助類
BeanUtils.setProperty(obj,"message",actionMessage);
return (Action)obj;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
}

testFactory:
package net.xiaxin.spring.qs;
public class testFactory {

public static void main(String[] args) {

Action action = ActionFactory.getAction("TheAction");
System.out.println(action.execute("Rod Johnson"));

}

}


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

相關文章