没有合适的资源?快使用搜索试试~ 我知道了~
首页seasar2中文文档
seasar2中文文档

seasar2文档内容 快速上手 最初的一步 更进一步 S2Container指南 需要作成的文件 S2Container的定义 S2Container的生成 SingletonS2ContainerFactory的使用 S2ContainerFactory的使用 组件的取得 Dependency Injection的方式 构造函数注入 设定函数注入 方法函数注入 S2Container定义的分解和引入 名称空间 实例管理 生存周期 自动绑定 组件中利用S2Container S2ContainerServlet app.dicon的角色 AOP的适用范围 META数据 Request的自动绑定 组件的自动登陆 Aspect的自动登陆 Meta的自动登陆 Hotswap S2Container标签指南 DOCTYPE components标签 include标签 component标签 arg标签 property标签 meta标签 initMethod标签 destroyMethod标签 aspect标签 interType标签 description标签 OGNL式 S2Container备注码(Annotation本篇翻译为备注码)指南 Component备注码 Binding备注码 Aspect备注码 InterType备注码 InitMethod备注码 DestroyMethod备注码 DIContainer练习
资源详情
资源评论
资源推荐

l快速上手
¡最初的一步
¡更进一步
lS2Container指南
¡需要作成的文件
¡S2Container的定义
¡S2Container的生成
nSingletonS2ContainerFactory的使用
nS2ContainerFactory的使用
¡组件的取得
¡Dependency Injection的方式
¡构造函数注入
¡设定函数注入
¡方法函数注入
¡S2Container定义的分解和引入
¡名称空间
¡实例管理
¡生存周期
¡自动绑定
¡组件中利用S2Container
¡S2ContainerServlet
¡app.dicon的角色
¡AOP的适用范围
¡META数据
¡Request的自动绑定
¡组件的自动登陆
¡Aspect的自动登陆
¡Meta的自动登陆
¡Hotswap
lS2Container标签指南
¡DOCTYPE
¡components标签
¡include标签
¡component标签
¡arg标签
¡property标签
¡meta标签
¡initMethod标签
¡destroyMethod标签
¡aspect标签
¡interType标签
¡description标签
¡OGNL式
lS2Container备注码(Annotation本篇翻译为备注码)指南
¡Component备注码
¡Binding备注码
¡Aspect备注码
¡InterType备注码
¡InitMethod备注码
¡DestroyMethod备注码
lDIContainer练习
快速上手
S2Container,就是进行Dependency Injection(注:依赖注入——译者)(以后略称为DI)的一个轻量级
页码,1/26(W)
w
2012/9/4
http://s2container.seasar.org/2.4/zh/DIContainer.html

容器。DI,就是Interface和实装分离,程序相互之间仅通过Interface来会话的一种思考方式。
最初的一步
让我们赶快试一试吧。登场人物如下。
l问候语类
¡返回问候语的字符串。
l问候客户端类
¡从问候类获得问候语(字符串)并输出到终端屏幕。
l问候语应用主类
¡启动用的类。用来组织问候语类和问候语使用者类的组成方式。
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());
}
页码,2/26(W)
w
2012/9/4
http://s2container.seasar.org/2.4/zh/DIContainer.html

}
机能提供端和使用端的准
备都完成了。下面我们就执行一下试试吧。
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"
"http://www.seasar.org/dtd/components23.dtd">
<components>
<component name="greeting"
class="examples.di.impl.GreetingImpl"/>
<component name="greetingClient"
class="examples.di.impl.GreetingClientImpl">
<property name="greeting">greeting</property>
</component>
</components>
更加具体的
,请大家参照S2Container参考。这里先说明关键几点。
<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>
页码,3/26(W)
w
2012/9/4
http://s2container.seasar.org/2.4/zh/DIContainer.html

</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//EN"
"http://www.seasar.org/dtd/components23.dtd">
<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"/>
页码,4/26(W)
w
2012/9/4
http://s2container.seasar.org/2.4/zh/DIContainer.html

对于在组件中适用的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的基本使用方法就被掌握了。
更进一步
但是,不管怎么说书写设定文件都是一件麻烦的事啊。在S2Container中,为了尽可能的减少设定文件的记
述量、采用了如下的概念。
lConvention over Configuration
就是说制定一个适当的规约,遵守这个规约的话?无需什么设定也可以运作。比如说,刚才的设定文件中,
象下面这样明确地指定属性的部分存在着。
<component name="greetingClient"
class="examples.di.impl.GreetingClientImpl">
<property name="greeting">greeting</property>
</component>
S2Container中、属性的类型是Interface的情形下? 如果要将属性类型的实装组件注册进软件容器中, 不
需要什么特殊的设定也可以自动得运作DI的机能。 这就是,如果遵守DI中推荐的所谓“属性类型用
Interface定义”的规则,S2Container会自动地处理一切。
虽然一说到规约就容易产生麻烦之类的想法,“推荐而已,如果遵守的话就能使开发愉快”的话,遵守规
约的动机就产生了。这才是问题的重点。
如上的设定,可以做如下化简
<component name="greetingClient"
class="examples.di.impl.GreetingClientImpl">
</component>
页码,5/26(W)
w
2012/9/4
http://s2container.seasar.org/2.4/zh/DIContainer.html
剩余25页未读,继续阅读









安全验证
文档复制为VIP权益,开通VIP直接复制

评论5