seasar2

所謂“Seasar2”就是一個“輕量級容器”,面向無法擺脫“Java 套用開發”之煩惱的所謂“開發者”,它能夠保證開發的“高生產率和高品質”。並且同“其它輕量級容器”不同的是,“完全不需要書寫設定檔案”,“就算是應用程式發生改動也無需再次起動即可直接識別變更,因此具有腳本語言的靈活性”。

基本介紹

簡介,安裝,快速上手,

簡介

在日本,Seasar2這個框架十分的流行。Seasar2其實就是類似於Spring的一個開源框架
中文版現在還沒完善,大家可能要用日文或則英文來了解
下面簡單介紹一下:
為了不用寫設定檔案也能夠運行,Convention over Configuration的思想得以採用。Convention over Configuration就是指,“只要遵守一個適當的規約,即使不用進行非常麻煩的設定,框架結構也可以自動替我們搞定的思想”,這一思想是Ruby on Rails中所倡導的。Seasar2的Convention over Configuration是從Ruby on Rails 那裡得到的提示而產生的。
使用Seasar2的話,對於僅僅需要維護數據表這樣簡單的套用,可以在不到3分鐘的時間裡作成。
應用程式發生改動之時也無需啟動便可立即識別變更的機能在Seasar2里被稱為HOT deploy。

安裝

S2需要安裝JDK1.4 及以上。
將S2xxx.zip解壓之後的seasar2目錄引入到Eclipse、「檔案→導入→既存的工程」。
使用Seasar2基本功能(S2Container, S2AOP)的時候、CLASSPATH的下面必須包含以下檔案。
lib/aopalliance-1.0.jar
lib/commons-logging-1.1.jar
lib/javassist-3.4.ga.jar
lib/ognl-2.6.9-patch-20070624.jar
lib/s2-framework-2.x.x.jar
lib/geronimo-j2ee_1.4_spec-1.0.jar (參考下面)
lib/portlet-api-1.0.jar (任選項)
lib/log4j-1.2.13.jar (任選項)
resources/log4j.properties (任選項)
resources/aop.dicon (任選項)
使用Seasar2的擴張機能(S2JTA, S2DBCP, S2JDBC, S2Unit, S2Tx, S2DataSet)的時候必須要將以下檔案追加到CLASSPATH裡面。
lib/junit-3.8.2.jar
lib/poi-2.5-final-20040804.jar
lib/s2-extension-2.x.x.jar
lib/geronimo-jta_1.1_spec-1.0.jar (參考下面)
lib/geronimo-ejb_2.1_spec-1.0.jar (參考下面)
resources/jdbc.dicon
根據套用軟體所需的執行環境、選擇以下需要引用的檔案[geronimo-j2ee_1.4_spec-1.0.jar、geronimo-jta_1.0.1B_spec-1.0.jar、geronimo-ejb_2.1_spec-1.0.jar]
環境 geronimo-j2ee_1.4_spec-1.0.jar geronimo-jta_1.1_spec-1.0.jar geronimo-ejb_2.1_spec-1.0.jar
不完全對應J2EE的Servlet container
(Tomcat等) 不要 要
(使用S2JTA,S2Tx的時候) 要
(使用S2Tiger的時候)
完全對應J2EE的套用伺服器
(JBoss, WebSphere, WebLogic等) 不要 不要 不要
獨立 要
(使用S2JTA,S2Tx時候) 不要 不要
為了讓大家更簡單的體驗資料庫機能、使用了HSQLDB作為RDBMS。為了能夠體驗Oracle機能、準備了hsql/sql/demo- oracle.sql。SQL*Plus等執行了之後、請根據環境的需要改寫jdbc.dicon的XADataSourceImpl的設定項目。
請使用S2Container用的外掛程式Kijimuna。
想使用EJB3anoteshon的情況下、將 S2TigerXXX.zip解壓縮後的s2-tiger目錄引入Eclipse、「檔案→導入→既存的工程」。在Seasar2的設定基礎上、必需要將以下的檔案追加到CLASSPATH裡面。
lib/s2-tiger-x.x.x.jar
resources/jdbc.dicon
想使用Tigeranoteshon的情況、將S2TigerXXX.zip解凍後的s2-tiger目錄引入Eclipse、「檔案→進口→既存的項目」。在Seasar2的設定基礎上、必需要將以下的檔案追加到CLASSPATH裡面。
lib/s2-tiger-x.x.x.jar

快速上手

S2Container,就是進行Dependency Injection(注:依賴注入——譯者)(以後略稱為DI)的一個輕量級容器。DI,就是Interface和實裝分離,程式相互之間僅通過Interface來會話的一種思考方式。
最初的一步
讓我們趕快試一試吧。登場人物如下。
問候語類
返回問候語的字元串。
問候客戶端類
從問候類獲得問候語(字元串)並輸出到終端螢幕。
問候語套用主類
啟動用的類。用來組織問候語類和問候語使用者類的組成方式。
Greeting.java
問候語的Interface。
package examples.di;
public interface Greeting {
String greet();
}
GreetingImpl.java
問候語的實裝。
package examples.di.impl;
import examples.di.Greeting;
public class GreetingImpl implements Greeting {
public String greet() {
return "Hello World!";
}
}
GreetingClient.java
使用問候語的使用者客戶端Interface。
package examples.di;
public interface GreetingClient {
void execute();
}
GreetingClientImpl.java
使用問候語的客戶端的實裝。不是直接使用這個GreetngImpl(實裝),而是通過Greeting(Interface)來實現問候的機能。
package examples.di.impl;
import examples.di.Greeting;
import examples.di.GreetingClient;
public class GreetingClientImpl implements GreetingClient {
private Greeting greeting;
public void setGreeting(Greeting greeting) {
this.greeting = greeting;
}
public void execute() {
System.out.println(greeting.greet());
}
}
機能提供端和使用端的準備都完成了。下面我們就執行一下試試吧。
GreetingMain.java
package examples.di.main;
import examples.di.Greeting;
import examples.di.impl.GreetingClientImpl;
import examples.di.impl.GreetingImpl;
public class GreetingMain {
public static void main(String[] args) {
Greeting greeting = new GreetingImpl();
GreetingClientImpl greetingClient = new GreetingClientImpl();
greetingClient.setGreeting(greeting);
greetingClient.execute();
}
}
實行結果如下。
Hello World!
象這樣機能的使用者(GreetingClientImpl)經由Interface(Greeting)的中介來使用機能,具體的機能對象(既 Interface的實裝類)在實行的時候由第三者(在這裡是GreetingMain)來提供的情況,就是DI的基本思考方法。
但是,如果象GreetingMain中那樣實裝類的設定內容直接被寫出來的話,一旦實裝類需要變更的時候原始碼也必須跟著修正。為了避免這個麻煩,DIContainer就登場了。把實裝設定抽出到一個設定檔案中,由DIContainer把這個設定檔案讀入並組織對象運行。
那么,讓我們試著把剛才的提到的那個設定檔案的內容寫一下。S2Container中,設定檔案的後綴是".dicon"。
GreetingMain2.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC
"-//SEASAR//DTD S2Container 2.3//EN"
<components>
<component name="greeting"
class="examples.di.impl.GreetingImpl"/>
<component name="greetingClient"
class="examples.di.impl.GreetingClientImpl">
<property name="greeting">greeting</property>
</component>
</components>
<component name="greeting"
class="examples.di.impl.GreetingImpl"/>
上文記載的是組件的定義。在這裡,相當於如下的Java代碼。
Greeting greeting = new GreetingImpl();
component標籤的name屬性指定了組件的名稱,class屬性指定了組件的Java類檔案名稱。下文就是greetingClient的設定。
<component name="greetingClient"
class="examples.di.impl.GreetingClientImpl">
<property name="greeting">greeting</property>
</component>
property標籤的name屬性指定了組件Java類中的屬性名,標籤的定義體則指定了一個組件名稱。這個設定相當於如下Java代碼。組件名要注意不要用["]括起來。用["]括起來的話就會被當作字元串來處理了。
GreetingClientImpl greetingClient = new GreetingClientImpl();
greetingClient.setGreeting(greeting);
利用S2Container的起動類的內容如下。
GreetingMain2.java
package examples.di.main;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
import examples.di.GreetingClient;
public class GreetingMain2 {
private static final String PATH =
"examples/di/dicon/GreetingMain2.dicon";
public static void main(String[] args) {
S2Container container =
S2ContainerFactory.create(PATH);
container.init();
GreetingClient greetingClient = (GreetingClient)
container.getComponent("greetingClient");
greetingClient.execute();
}
}
S2Container,是由S2ContainerFactory#create(String path)做成的。更加詳細的內容請參照S2Container的生成。
組件(greetingClient),是由S2Container#getComponent(String componentName)的方法取得的。詳細內容請參照組件的取得。
實行結果同先前一樣表示如下。
Hello World!
經常同DI一起使用的是AOP。AOP是指、將日誌等的輸出分散到複數個類中的邏輯模組化的一種技術。那么、讓我們不修改已經作成的GreetingImpl、GreetingClinetImpl的原始碼?試著將日誌(追蹤)輸出。 適用於AOP的設定檔案如下。
GreetingMain3.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC
"-//SEASAR//DTD S2Container 2.3//E
<components>
<include path="aop.dicon"/>
<component name="greeting"
class="examples.di.impl.GreetingImpl">
<aspect>aop.traceInterceptor</aspect>
</component>
<component name="greetingClient"
class="examples.di.impl.GreetingClientImpl">
<property name="greeting">greeting</property>
<aspect>aop.traceInterceptor</aspect>
</component>
</components>
Seasar2中,經常使用的AOP模組在aop.dicon中預先定義。 象下面這樣、使用include標籤。 更加詳細的?敬請參照S2Container定義的分解和引入。
<include path="aop.dicon"/>
對於在組件中適用的AOP來說?我們component標籤的字標籤 aspect標籤的正文中指定AOP的模組名稱。aop.traceInterceptor是AOP模組的名字。
<aspect>aop.traceInterceptor</aspect>
AOP的設定如上所述。那么就讓我們執行一下GreetingMain3吧。同GreetingMain2不同的僅僅是設定檔案的路徑而已。
GreetingMain3.java
package examples.di.main;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
import examples.di.GreetingClient;
public class GreetingMain3 {
private static final String PATH =
"examples/di/dicon/GreetingMain3.dicon";
public static void main(String[] args) {
S2Container container =
S2ContainerFactory.create(PATH);
GreetingClient greetingClient = (GreetingClient)
container.getComponent("greetingClient");
greetingClient.execute();
}
}
執行結果如下。可以明白一點,沒有修改原始碼,日誌就被輸出了。
DEBUG 2005-10-11 21:01:49,655 [main] BEGIN examples.di.impl.GreetingClientImpl#execute()
DEBUG 2005-10-11 21:01:49,665 [main] BEGIN examples.di.impl.GreetingImpl#greet()
DEBUG 2005-10-11 21:01:49,665 [main] END examples.di.impl.GreetingImpl#greet() : Hello World!
Hello World!
DEBUG 2005-10-11 21:01:49,675 [main] END examples.di.impl.GreetingClientImpl#execute() : null
這樣、S2Container的基本使用方法就被掌握了。

相關詞條

熱門詞條

聯絡我們