seasar2
在日本,Seasar2这个框架十分的流行。Seasar2其实就是类似于Spring的一个开源框架
大家有兴趣的话,可以去官方网站看看: http://www.seasar.org/index.html
中文版现在还没完善,大家可能要用日文或则英文来了解
下面简单介绍一下:
所谓“Seasar2”就是一个“轻量级容器”,面向无法摆脱“Java 应用开发”之烦恼的所谓“开发者”,它能够保证开发的“高生产率和高品质”。并且同“其它轻量级容器”不同的是,“完全不需要书写设定文件”,“就算是应用程序发生改动也无需再次起动即可直接识别变更,因此具有脚本语言的灵活性”。
为了不用写设定文件也能够运行,Convention over Configuration的思想得以采用。Convention over Configuration就是指,“只要遵守一个适当的规约,即使不用进行非常麻烦的设定,框架结构也可以自动替我们搞定的思想”,这一思想是Ruby on Rails中所倡导的。Seasar2的Convention over Configuration是从Ruby on Rails 那里得到的提示而产生的。
使用Seasar2的话,对于仅仅需要维护数据表这样简单的应用,可以在不到3分钟的时间里作成。
应用程序发生改动之时也无需启动便可立即识别变更的机能在Seasar2里被称为HOT deploy。
安装:
S2需要安装JDK1.4 or JDK1.5。
将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"
"http://www.seasar.org/dtd/components23.dtd">
<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//EN"
"http://www.seasar.org/dtd/components23.dtd">
<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的基本使用方法就被掌握了。