请输入您要查询的百科知识:

 

词条 seasar2
释义

所谓“Seasar2”就是一个“轻量级容器”,面向无法摆脱“Java 应用开发”之烦恼的所谓“开发者”,它能够保证开发的“高生产率和高品质”。并且同“其它轻量级容器”不同的是,“完全不需要书写设定文件”,“就算是应用程序发生改动也无需再次起动即可直接识别变更,因此具有脚本语言的灵活性”。

在日本,Seasar2这个框架十分的流行。Seasar2其实就是类似于Spring的一个开源框架

中文版现在还没完善,大家可能要用日文或则英文来了解

下面简单介绍一下:

所谓“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"

<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的基本使用方法就被掌握了。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/1/11 15:36:18