词条 | 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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。