S2Container框架学习笔记之一

来源:互联网 发布:农村淘宝网下载电脑版 编辑:程序博客网 时间:2024/05/16 14:35

S2Container的官网:http://s2container.seasar.org/2.4/ja/ 

前提,准备好JAVA的开发环境。


1. 添加jar包

(1). 首先是添加如下的S2-Framework的jar包和配置文件

lib/s2-framework-2.4.x.jar
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/geronimo-j2ee_1.4_spec-1.0.jar (在非J2EE环境的时候添加)
lib/portlet-api-1.0.jar (要使用Portlet的时候添加)
lib/log4j-1.2.13.jar (要使用Log4J的时候添加)


resources/log4j.properties (要使用Log4J的时候添加)
resources/convention.dicon (要使用「SMART deploy」的时候添加)
resources/creator.dicon (要使用「SMART deploy」的时候添加)
resources/customizer.dicon (要使用「SMART deploy」的时候添加)


(2). 要使用Seasar2的扩展功能时(S2JTA, S2DBCP, S2JDBC, S2Unit, S2Tx, S2DataSet)时,需要添加如下的S2-Extension的jar包和配置

lib/s2-extension-2.4.x.jar
lib/junit-3.8.2.jar (需要单体测试的话添加)
lib/poi-3.0-FINAL.jar (需要使用Excel来做单体测试的时候添加)
lib/geronimo-jta_1.1_spec-1.0.jar (需要使用S2JTA或S2Tx的时候添加)
lib/geronimo-jta_1.1_spec-1.0-tsr.jar (需要使用S2JTA或S2Tx的时候添加)
lib/geronimo-ejb_2.1_spec-1.0.jar (需要使用S2Tx的EJB互换功能的时候添加)


resources/jdbc.dicon


(3). 要使用Java5对应的功能,需要添加如下的S2-Tiger的jar包

lib/s2-tiger-2.4.x.jar
lib/geronimo-annotation_1.0_spec-1.0.jar (使用@Resource注解时添加)
lib/geronimo-jpa_3.0_spec-1.0.jar (使用S2JDBC或者JPA时添加)
lib/geronimo-ejb_3.0_spec-1.0.jar (使用EJB3的时候添加)
lib/geronimo-interceptor_3.0_spec-1.0.jar (使用EJB3的时候添加)


2. 配置文件

要使用S2Container,必须配置好一定的配置文件。这些配置文件的格式是xml,扩展名是dicon。

配置文件的基本样式如下

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN""http://www.seasar.org/dtd/components24.dtd"><components>    <component name="..." class="...">            ...    </component>    <component name="..." class="...">            ...    </component></components>


基本上所有的dicon配置文件都是这样子的,然后可以通过include把多个配置包含到一个里

<include path="convention.dicon"/>

S2Container是DI容器,编写的类可以以组件的形式配置到dicon里,这一点跟Spring很像。


3. 获取容器对象的方法

(1) 通过SingletonS2ContainerFactory

SingletonS2ContainerFactory.init();S2Container container = SingletonS2ContainerFactory.getContainer();
不指定的话默认配置文件是app.dicon(Web应用的话是WEB-INF/classes/app.dicon)。

要指定的话,在init()之前调用setConfigPath(String Path),例

private static final String PATH = "aaa/bbb/ccc.dicon";...SingletonS2ContainerFactory.setConfigPath(PATH);SingletonS2ContainerFactory.init();S2Container container = SingletonS2ContainerFactory.getContainer();
在Web应用中,SingletonS2ContainerFactory.init()会在S2ContainerServlet里被自动调用。


(2)通过S2ContainerFactory生成

private static final String PATH = "aaa/bbb/ccc.dicon";...S2Container container = S2ContainerFactory.create(PATH);
通过这种方法生成的容器对象,需要在程序里管理。S2ContainerFactory是在SingletonS2ContainerFactory的内部被调用的。

(3)Web应用在S2ContainerServlet自动创建,但是需要在web.xml里配置这个servlet

<servlet>    <servlet-name>s2servlet</servlet-name>    <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>    <init-param>        <param-name>configPath</param-name>        <param-value>app.dicon</param-value>    </init-param>    <init-param>        <param-name>debug</param-name>        <param-value>false</param-value>    </init-param>    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>    <servlet-name>s2servlet</servlet-name>    <url-pattern>/s2servlet</url-pattern></servlet-mapping>
configPath指定默认配置文件,
debug参数是true的话,可以运行中重新加载S2Container容器。重加载的方法是访问如下URL

http://localhost:8080/xxx/s2servlet?command=restart   
另外还可以查看加载了什么组件

http://localhost:8080/xxx/s2servlet?command=list         


4. 获取组件对象的方法

S2Container.getComponent(Object componentKey)
有同名类时,报TooManyRegistrationRuntimeException错,所以最好所有的类都是唯一的。

Java5里使用S2Tiger时,使用SingletonS2Container获取组件对象则不需要进行类型转换。要使用SingletonS2Container,必须Seasar2.4以上。

示例代码:

Hoge hoge = (Hoge) container.getComponent(Hoge.class);Hoge hoge = SingletonS2Container.getComponent(Hoge.class);Hoge hoge = (Hoge) container.getComponent("hoge");Hoge hoge = SingletonS2Container.getComponent("hoge");

组件的依赖注入可以分为:构造方法注入、set方法注入、指定方法注入和属性注解绑定注入。配置或编写方法分别如下:

<components>    <component name="..." class="...">        <arg>...</arg>    </component></components>

<components>    <component name="..." class="...">        <property name="...">...</property>    </component></components>

<components>    <component name="..." class="...">        <initMethod name="...">            <arg>...</arg>        </initMethod>    </component></components>

@Binding("foo")private Foo foo;

在配置里通过instance属性来指定组件对象的作用域

instance属性説明singleton(default)单例,S2Container.getComponent()取得的都是同一个对象prototypeS2Container.getComponent()都是新对象requestrequest作用域。以name属性指定的名字为Key保存在request中。 需要配置S2ContainerFilter。sessionsession作用域。 以name属性指定的名字为Key保存在session。 需要配置S2ContainerFilter。applicationWeb全局作用域。以name属性指定的名字为Key保存在ServletContext。需要配置S2ContainerFilter。outer对象在S2Container容器外创建,只是依赖注入到容器中。不适用域aspect和构造方法注入。

如果不在配置文件里配置组件的注入的话,S2Container会根据组件的类定义里的autoBinding注解的指定值,以及名字匹配来自动实施注入。

其中autoBinding的值有如下几种形式:

autoBinding说明auto(default)自动绑定构造方法的参数和类属性constructor自动绑定构造方法的参数property自动绑定类属性none不自动绑定


S2Container容器对象的生命周期是从S2Container.init()被调用开始,到S2Container.destroy()结束。

在Web应用里,它与S2ContainerServlet的生命周期一致。

至于组件对象的生命周期,单例的话是与S2container容器周期一致,其它形式的话,是在取得对象是被实例化。

正如上面提到的,想要在request、session、application里管理组件实例,需要在web.xml配置S2ContainerFilter,配置示例如下

<web-app>    <filter>        <filter-name>s2filter</filter-name>        <filter-class>org.seasar.framework.container.filter.S2ContainerFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>s2filter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping></web-app>














原创粉丝点击