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>
<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()取得的都是同一个对象 |
prototype | S2Container.getComponent()都是新对象 |
request | request作用域。以name属性指定的名字为Key保存在request中。 需要配置S2ContainerFilter。 |
session | session作用域。 以name属性指定的名字为Key保存在session。 需要配置S2ContainerFilter。 |
application | Web全局作用域。以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>