S2Container框架学习笔记之一

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>














  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值