S2Container指南.docx

上传人:b****7 文档编号:11372158 上传时间:2023-02-28 格式:DOCX 页数:205 大小:58.79KB
下载 相关 举报
S2Container指南.docx_第1页
第1页 / 共205页
S2Container指南.docx_第2页
第2页 / 共205页
S2Container指南.docx_第3页
第3页 / 共205页
S2Container指南.docx_第4页
第4页 / 共205页
S2Container指南.docx_第5页
第5页 / 共205页
点击查看更多>>
下载资源
资源描述

S2Container指南.docx

《S2Container指南.docx》由会员分享,可在线阅读,更多相关《S2Container指南.docx(205页珍藏版)》请在冰豆网上搜索。

S2Container指南.docx

S2Container指南

∙快速上手 

o最初的一步

o更进一步        

∙S2Container指南

o需要作成的文件

oS2Container的定义

oS2Container的生成

▪SingletonS2ContainerFactory的使用

▪S2ContainerFactory的使用

o组件的取得

oDependencyInjection的方式

▪构造函数注入

▪设定函数注入

▪方法函数注入

oS2Container定义的分解和引入

o名称空间

o实例管理

o生存周期

o自动绑定

o组件中利用S2Container

oS2ContainerServlet

oapp.dicon的角色

oAOP的适用范围

oMETA数据

oRequest的自动绑定

o组件的自动登陆

oAspect的自动登陆

oMeta的自动登陆

oHotswap

oS2Container标签指南

oDOCTYPE

ocomponents标签

oinclude标签

ocomponent标签

oarg标签

oproperty标签

ometa标签

oinitMethod标签

odestroyMethod标签

oaspect标签

ointerType标签

odescription标签

oOGNL式

oS2Container备注码(Annotation本篇翻译为备注码)指南

oComponent备注码

oBinding备注码

oAspect备注码

oInterType备注码

oInitMethod备注码

oDestroyMethod备注码

oDIContainer练习

快速上手

S2Container,就是进行DependencyInjection(注:

依赖注入——译者)(以后略称为DI)的一个轻量级容器。

DI,就是Interface和实装分离,程序相互之间仅通过Interface来会话的一种思考方式。

最初的一步

让我们赶快试一试吧。

登场人物如下。

∙问候语类

o返回问候语的字符串。

∙问候客户端类

o从问候类获得问候语(字符串)并输出到终端屏幕。

∙问候语应用主类

o启动用的类。

用来组织问候语类和问候语使用者类的组成方式。

Greeting.java

问侯语的Interface。

packageexamples.di;

publicinterfaceGreeting{

Stringgreet();

}

GreetingImpl.java

问候语的实装。

packageexamples.di.impl;

importexamples.di.Greeting;

publicclassGreetingImplimplementsGreeting{

publicStringgreet(){

return"HelloWorld!

";

}

}

GreetingClient.java

使用问候语的使用者客户端Interface。

packageexamples.di;

publicinterfaceGreetingClient{

voidexecute();

}

GreetingClientImpl.java

使用问候语的客户端的实装。

不是直接使用这个GreetngImpl(实装),而是通过Greeting(Interface)来实现问候的机能。

packageexamples.di.impl;

importexamples.di.Greeting;

importexamples.di.GreetingClient;

publicclassGreetingClientImplimplementsGreetingClient{

privateGreetinggreeting;

publicvoidsetGreeting(Greetinggreeting){

this.greeting=greeting;

}

publicvoidexecute(){

System.out.println(greeting.greet());

}

}

机能提供端和使用端的准备都完成了。

下面我们就执行一下试试吧。

GreetingMain.java

packageexamples.di.main;

importexamples.di.Greeting;

importexamples.di.impl.GreetingClientImpl;

importexamples.di.impl.GreetingImpl;

publicclassGreetingMain{

publicstaticvoidmain(String[]args){

Greetinggreeting=newGreetingImpl();

GreetingClientImplgreetingClient=newGreetingClientImpl();

greetingClient.setGreeting(greeting);

greetingClient.execute();

}

}

实行结果如下。

HelloWorld!

象这样机能的使用者(GreetingClientImpl)经由Interface(Greeting)的中介来使用机能,具体的机能对象(既Interface的实装类)在实行的时候由第三者(在这里是GreetingMain)来提供的情况,就是DI的基本思考方法。

但是,如果象GreetingMain中那样实装类的设定内容直接被写出来的话,一旦实装类需要变更的时候源代码也必须跟着修正。

为了避免这个麻烦,DIContainer就登场了。

把实装设定抽出到一个设定文件中,由DIContainer把这个设定文件读入并组织对象运行。

那么,让我们试着把刚才的提到的那个设定文件的内容写一下。

S2Container中,设定文件的后缀是".dicon"。

GreetingMain2.dicon

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEcomponentsPUBLIC

"-//SEASAR//DTDS2Container2.3//EN"

"http:

//www.seasar.org/dtd/components23.dtd">

class="examples.di.impl.GreetingImpl"/>

class="examples.di.impl.GreetingClientImpl">

greeting

更加具体的,请大家参照S2Container参考。

这里先说明关键几点。

class="examples.di.impl.GreetingImpl"/>

上文记载的是组件的定义。

在这里,相当于如下的Java代码。

Greetinggreeting=newGreetingImpl();

component标签的name属性指定了组件的名称,class属性指定了组件的Java类文件名。

下文就是greetingClient的设定。

class="examples.di.impl.GreetingClientImpl">

greeting

property标签的name属性指定了组件Java类中的属性名,标签的定义体则指定了一个组件名称。

这个设定相当于如下Java代码。

组件名要注意不要用["]括起来。

用["]括起来的话就会被当作字符串来处理了。

GreetingClientImplgreetingClient=newGreetingClientImpl();

greetingClient.setGreeting(greeting);

利用S2Container的起动类的内容如下。

GreetingMain2.java

packageexamples.di.main;

importorg.seasar.framework.container.S2Container;

importorg.seasar.framework.container.factory.S2ContainerFactory;

importexamples.di.GreetingClient;

publicclassGreetingMain2{

privatestaticfinalStringPATH=

"examples/di/dicon/GreetingMain2.dicon";

publicstaticvoidmain(String[]args){

S2Containercontainer=

S2ContainerFactory.create(PATH);

container.init();

GreetingClientgreetingClient=(GreetingClient)

container.getComponent("greetingClient");

greetingClient.execute();

}

}

S2Container,是由S2ContainerFactory#create(Stringpath)做成的。

更加详细的内容请参照S2Container的生成。

组件(greetingClient),是由S2Container#getComponent(StringcomponentName)的方法取得的。

详细内容请参照组件的取得。

实行结果同先前一样表示如下。

HelloWorld!

经常同DI一起使用的是AOP。

AOP是指、将日志等的输出分散到复数个类中的逻辑模块化的一种技术。

那么、让我们不修改已经作成的GreetingImpl、GreetingClinetImpl的源代码?

试着将日志(追踪)输出。

适用于AOP的设定文件如下。

GreetingMain3.dicon

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEcomponentsPUBLIC

"-//SEASAR//DTDS2Container2.3//EN"

"http:

//www.seasar.org/dtd/components23.dtd">

class="examples.di.impl.GreetingImpl">

aop.traceInterceptor

class="examples.di.impl.GreetingClientImpl">

greeting

aop.traceInterceptor

Seasar2中,经常使用的AOP模块在aop.dicon中预先定义。

象下面这样、使用include标签。

更加详细的?

敬请参照S2Container定义的分解和引入。

对于在组件中适用的AOP来说?

我们component标签的字标签aspect标签的正文中指定AOP的模块名称。

aop.traceInterceptor是AOP模块的名字。

aop.traceInterceptor

AOP的设定如上所述。

那么就让我们执行一下GreetingMain3吧。

同GreetingMain2不同的仅仅是设定文件的路径而已。

GreetingMain3.java

packageexamples.di.main;

importorg.seasar.framework.container.S2Container;

importorg.seasar.framework.container.factory.S2ContainerFactory;

importexamples.di.GreetingClient;

publicclassGreetingMain3{

privatestaticfinalStringPATH=

"examples/di/dicon/GreetingMain3.dicon";

publicstaticvoidmain(String[]args){

S2Containercontainer=

S2ContainerFactory.create(PATH);

GreetingClientgreetingClient=(GreetingClient)

container.getComponent("greetingClient");

greetingClient.execute();

}

}

执行结果如下。

可以明白一点,没有修改源代码,日志就被输出了。

DEBUG2005-10-1121:

01:

49,655[main]BEGINexamples.di.impl.GreetingClientImpl#execute()

DEBUG2005-10-1121:

01:

49,665[main]BEGINexamples.di.impl.GreetingImpl#greet()

DEBUG2005-10-1121:

01:

49,665[main]ENDexamples.di.impl.GreetingImpl#greet():

HelloWorld!

HelloWorld!

DEBUG2005-10-1121:

01:

49,675[main]ENDexamples.di.impl.GreetingClientImpl#execute():

null

这样、S2Container的基本使用方法就被掌握了。

更进一步

但是,不管怎么说书写设定文件都是一件麻烦的事啊。

在S2Container中,为了尽可能的减少设定文件的记述量、采用了如下的概念。

∙ConventionoverConfiguration

就是说制定一个适当的规约,遵守这个规约的话?

无需什么设定也可以运作。

比如说,刚才的设定文件中,象下面这样明确地指定属性的部分存在着。

class="examples.di.impl.GreetingClientImpl">

greeting

S2Container中、属性的类型是Interface的情形下?

如果要将属性类型的实装组件注册进软件容器中,不需要什么特殊的设定也可以自动得运作DI的机能。

这就是,如果遵守DI中推荐的所谓“属性类型用Interface定义”的规则,S2Container会自动地处理一切。

虽然一说到规约就容易产生麻烦之类的想法,“推荐而已,如果遵守的话就能使开发愉快”的话,遵守规约的动机就产生了。

这才是问题的重点。

如上的设定,可以做如下化简

class="examples.di.impl.GreetingClientImpl">

实际上?

刚才的AOP的例子也适用“ConventionoverConfiguration”。

通常在AOP中,AOP的模块在什么地方适用是由pointcut指定的,S2AOP的情况下?

如果遵守所谓“使用Interface”这个推荐的规约,不指定pointcut,自动的适用于在Interface中定义的所有方法。

因为有这个机能,在刚才的那个例子中,就没有必要指定pointcut。

虽然根据“ConventionoverConfiguration”,DI和AOP的设定可以得以简化,需要处理的组件数增加了、仅仅组件的注册也会变成一个非常累的作业。

那么这个组件注册自动化就叫做组件自动注册机能。

刚才的GreetingImpl、GreetingClientImpl的注册自动化如下。

class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">

"examples.di.impl"

".*Impl"

FileSystemComponentAutoRegister组件将addClassPattern方法指定的类从文件系统中探寻出来,自动注册到S2Container中。

关于initMethod标签,请参照方法函数注入。

addClassPattern方法的第一个参数是想要注册的组件的包的名字。

子包的内容也会用回归的方式检索。

第二个参数是类的名字。

可以使用正则表达式。

也可以用“,”做分隔符指定复数个设定。

根据组件自动注册原则,即使后续追加组件的情况下,也没有必要追加设定,这样手续就大大地简化了。

如果组件的自动化注册可以了,接下来就会想让AOP的注册也自动化了吧。

刚才的GreetingImpl、GreetingClientImp的AOP注册自动化的设定如下。

...

class="org.seasar.framework.container.autoregister.AspectAutoRegister">

aop.traceInterceptor

"examples.di.impl"

".*Impl"

用interceptor属性指定AOP的名称。

addClassPattern方法同组件的自动化注册时的用法一样,这里就不做特殊的说明了。

组件自动化注册和AOP自动化注册的例子如下。

GreetingMain4.dicon

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEcomponentsPUBLIC"-//SEASAR//DTDS2Container2.3//EN"

"http:

//www.seasar.org/dtd/components23.dtd">

class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">

"examples.di.impl"

".*Impl"

class="org.seasar.framework.container.autoregister.AspectAutoRegister">

aop.traceInterceptor

"examples.di.impl"

".*Impl"

那么来执行一下GreetingMain4吧。

自动注册的情况下,S2Container#init()和S2Container#destroy()的调用是必要的。

GreetingMain4.java

packageexamples.di.main;

importorg.seasar.framework.container.S2Container;

importorg.seasar.framework.container.factory.S2ContainerFactory;

importexamples.di.GreetingClient;

publicclassGreetingMain4{

privatestaticfinalStringPATH=

"examples/di/dicon/GreetingMain4.dicon";

publicstaticvoidmain(String[]args){

S2Containercontainer=

S2ContainerFactory.create(PATH);

container.init();

try{

GreetingClientgreetingClient=(GreetingClient)

container.getComponent("greetingClient");

greetingClient.execute();

}finally{

container.destroy();

}

}

}

执行的结果同GreetingMain3一样如下列出。

DEBUG2005-10-1216:

00:

08,093[main]BEGINexamples.di.impl.GreetingClientImpl#execute(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1