2013年3月21日 星期四

Spring Framework 基礎學習筆記(一)

Spring  是由 Rod Johnson 撰寫,它是個輕量級(Lightweight)容器(Container),實現 IoC(Inversion of Control)、AOP(Aspect-oriented programming)概念。使用Spring有以下優點:


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 getReport() ;
}

建立StockService.java類別,實作  IStockService 中的方法
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 HashMap report;
 

 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);
  //取得輸出結果
  HashMap report=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:買進

沒有留言:

張貼留言