1.鬆耦合 ( loosely-coupled )
物件導向語言的程式寫法中,讓物件間呈現一種鬆耦合的關係,有很多好處,例如:透過Spring提供的Ioc(控制反轉)功能,所有物件的關係都只需要在XML組態檔裡做設定,Spring會自動根據組態檔的設定將物件間的關係建立起來,開發人員就能很輕易的就做到鬆耦合的程式寫法。
2.整合多個Framework
Spring是個相當全面的應用程式框架,常見的Framework,Spring也都提供了整合的方式,例如Struts、Hibernate,經由Spring整合後,更加簡單易用。
這篇文章主要用到Spring最基礎的部分,就是實現 IoC(Inversion of Control)的設計,下面用一個簡單的範例來作初步的介紹,也是當成是開發紀錄。
首先先下載 Spring framework
接著建立一個Java專案 ,下載完解壓後,將相關的jar檔設定至build path 中。
以下範例功能說明:
這個範例準備設計一個簡單股票分析服務,服務內部有預設股票的賣出點與買入點的機制,將股票的資料輸入服務後,可取得簡單的分析報告。
首先建立 Stocks的Java bean,其中包含股票代碼及價位。
package com.core.beans; public class Stocks { private String stockId; private Double price; public Stocks(){ } public String getStockId() { return stockId; } public void setStockId(String stockId) { this.stockId = stockId; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } }建立Threshold 的java bean,包含股價上限值,和股價下限值。
package com.core.beans; public class Threshold { private Double upperTh; private Double lowerTh; public Double getUpperTh() { return upperTh; } public void setUpperTh(Double upperTh) { this.upperTh = upperTh; } public Double getLowerTh() { return lowerTh; } public void setLowerTh(Double lowerTh) { this.lowerTh = lowerTh; } }
建立 IStockService.java 的interface,要實作的Method 包含:
public void process( Stocks stock) :輸入股票資訊,會將股票進行處理。
public HashMap<String, String> getReport():取得股票處理的的建議報告。
package com.core; import java.util.HashMap; import com.core.beans.Stocks; public interface IStockService { public void process( Stocks stock); public HashMap建立StockService.java類別,實作 IStockService 中的方法getReport() ; }
package com.core.impl; import java.util.HashMap; import com.core.IStockService; import com.core.beans.Threshold; import com.core.beans.Stocks; public class StockService implements IStockService { private Threshold threshold; private HashMapreport; StockService(){ } public void StockServiceInit(){ this.report=new HashMap (); } @Override public void process(Stocks stock) { // TODO Auto-generated method stub if(stock.getPrice()>threshold.getUpperTh()){ this.report.put(stock.getStockId(), "賣出"); }else if(stock.getPrice()>threshold.getLowerTh()){ this.report.put(stock.getStockId(), "買進"); }else{ this.report.put(stock.getStockId(), "觀望"); } //return null; } /** * * @return Threshold */ public Threshold getThreshold() { return threshold; } /** * * @param Threshold */ public void setThreshold(Threshold threshold) { this.threshold = threshold; } /** * * @return HashMap */ public HashMap getReport() { return report; } }
在服務中所有的物件都是由Spring所以建立的,在Spring中物件的定義必須由xml來建立,所以接著建立AppContext.xml,來定義剛剛所建立的類別。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<bean id="stockService" class="com.core.impl.StockService" init- method="StockServiceInit">
<property name="threshold">
<ref bean="threshold"/>
</property>
</bean>
<bean id="threshold" class="com.core.beans.Threshold">
<property name="upperTh">
<value>100</value>
</property>
<property name="lowerTh">
<value>10</value>
</property>
</bean>
</beans>
|
1.
<bean id="threshold" class="com.core.beans.Threshold">
<property name="upperTh">
<value>100</value>
</property>
<property name="lowerTh">
<value>10</value>
</property>
</bean>
說明:
<bean>的Tag 就是定義一個物件的方式,須指定bean一個id和class的路徑,id名稱預設開頭必須是小寫,class就是在java專案中,對應類別的路徑位置。
<property>的Tag定義一個物件內部成員,指定property name,顧名思義,必須和成員名稱一致,<value>的Tag則是給定此成員初始值。
2.
<bean id="stockService" class="com.core.impl.StockService" init-method="StockServiceInit">
<property name="threshold">
<ref bean="threshold"/>
</property>
</bean>
說明:
init-method="StockServiceInit" 指定初始化的Method,也就是在建構子之後執行StockServiceInit()的Method。
<ref bean="threshold"/> 這個Tag的意義為此成員參考至另一個物件,也就說名稱為threshold的成員,參考至id 為"threshold"物件,其中"threshold"物件,也必須定義至xml中。
建立 測試程式 SpringTestCase1.java
package com.process; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.core.IStockService; import com.core.beans.Stocks; import com.core.impl.StockService; public class SpringTestCase1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"AppContext.xml" }); //由Spring 建立stockService IStockService stockService=(StockService) context.getBean("stockService"); //建立股票的物件 Stocks stocks1=new Stocks(); stocks1.setStockId("a00001"); stocks1.setPrice(99.0); Stocks stocks2=new Stocks(); stocks2.setStockId("a00002"); stocks2.setPrice(9.0); Stocks stocks3=new Stocks(); stocks3.setStockId("a00003"); stocks3.setPrice(109.0); //將股票的物件,輸入至stockService stockService.process(stocks1); stockService.process(stocks2); stockService.process(stocks3); //取得輸出結果 HashMapreport=stockService.getReport(); Set key=report.keySet(); Iterator it=key.iterator(); //將輸出結果印出 while(it.hasNext()){ String id = (String) it.next(); System.out.println(id+":"+report.get(id)); } } }
執行結果
a00003:賣出
a00002:觀望
a00001:買進
|
沒有留言:
張貼留言