尽展体育的魅力,创造历史辉煌!
2008
让我们为奥运加油,为中国加油!
奥运金牌榜
高级搜索
首页
技术论坛
博客
产品中心
资源中心
银弹在线
商城
goCom - SOA中国第一社区
SOA和WebService
|
面向构件
|
业务流程
|
EOS
|
综合技术
|
goCom吧
|
版务区
|
商务专区
SOA和WebService
|
面向构件
|
业务流程
|
EOS
|
综合
Primeton EOS
|
Primeton BPS
OSOA专区
|
专题
|
技术日
|
活动
|
下载
推荐阅读
|
封面报道
|
特别报道
|
CIO锦囊
|
专栏
|
公司
|
银弹讨论
最新上架
|
银弹推荐
|
普通书籍
|
音像
|
护肤
|
生活
|
数码
goCom - 面向构件与SOA社区 讨论区
-
面向构件
SCA/SDO
SCA中国推进组
SDO中国推进组
银弹讨论
Tuscany
平台厂商
主题选项
点击展开
HOVER展开
--------
打印主题
[无发表权] 请登录或者注册
版主:
hongsoft
米布
wangfeng
chaocai
个人资料
自己实现IoC,AOP容器
#1楼
总分
15 分
财富
217
威望
31
排名
第 48 名
段位
Mini-Container是本人实现的一个轻量级的IoC(Inversion of Control, 控制反制)容器,并且提供了对AOP的简单支持。
IoC容器目前已经在各种项目中的得到了广泛的应用,它的使用大大提升了应用的可维护性和可测试性,并且简化的了应用的构建。在作者所参与的项目中这样的容器也无处不在。
为了加深对这些容器原理的理解,本人开发了这个容器,在开发过程中的确在很多方面都有了新的认识,如果不是亲自做过很多思想是很难体会的。
特将此容器的实现贡献给大家研究和学习,一同进步,一同分享,为振兴中国的软件业一同努力。
为在”5.12 特大地震”中的受难同胞祈福,愿祖国更强大!
Mini-Container
开发者手册
(Mini-Container Beta 0.9)
下载地址:
http://www.blogjava.net/Files/chaocai/mini-container-beta-0.9.rar
在找到合适的站点后我会Open-Source.
蔡超
软件架构师
软件架构咨询顾问
Chaocai2001@yahoo.com.cn
序
Mini-Container是本人实现的一个轻量级的IoC(Inversion of Control, 控制反制)容器,并且提供了对AOP的简单支持。
IoC容器目前已经在各种项目中的得到了广泛的应用,它的使用大大提升了应用的可维护性和可测试性,并且简化的了应用的构建。在作者所参与的项目中这样的容器也无处不在。
为了加深对这些容器原理的理解,本人开发了这个容器,在开发过程中的确在很多方面都有了新的认识,如果不是亲自做过很多思想是很难体会的。
特将此容器的实现贡献给大家研究和学习,一同进步,一同分享,为振兴中国的软件业一同努力。
为在”5.12 特大地震”中的受难同胞祈福,愿祖国更强大!
目录
序
...
2
Mini-Container
特性
...
4
核心技术
...
4
从一个简单的示例开始
...
4
基本操作
...
6
组件(
Component
)及服务(
Service
)
...
7
组件间的依赖
...
8
属性值的注入
...
10
简单
AOP
.
11
整合
Spring
.
12
Mini-Container
特性
Mini-Container是一个轻量级的IoC(Inversion of Control, 控制反制)容器,并且提供了对AOP的简单支持。
Mini-Contaiiner具有以下特性:
1 轻量级的IoC容器,Mini-Container目前的版本使用和部署都十分简单,仅一个jar文件,mini-container.jar,
2 简单AOP支持,可以对组件提供的服务方法进行拦截, 加入自定义拦截器。
3
SOA
in JVM,将
SOA
的思想融入其中,每个组件(component)声名自己可以提供的服务(service),这种服务通过Java interface进行定义及描述。各组件同时声明运行时所需依赖的服务(reference),容器会根据配置自动为该组件连接所需服务的提供者。
4 支持与其他Framework的整合,目前mini-container可以与spring进行整合。
运行环境要求
:JDK1.5以上。
核心技术
从一个简单的示例开始
以下示例展示了一个计算器服务的实现。
Mini-container的组件配置文件:calculator.xml
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
composite
xmlns
=
"
http://www.ccsoft.org/schema/components"
xmlns:xsi
=
"
http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
=
"
http://www.ccsoft.org/schema/components
mini-container.xsd"
>
<
component
name
=
"CalculatorService"
class
=
"org.ccsoft.minicontainer.samples.calculator.impl.CalculatorServiceImpl"
>
<
service
interface
=
"org.ccsoft.minicontainer.samples.calculator.CalculatorService"
/>
<
reference
interface
=
"org.ccsoft.minicontainer.samples.calculator.AddService"
bind-property
=
"addService"
/>
<
reference
interface
=
"org.ccsoft.minicontainer.samples.calculator.SubtractService"
bind-property
=
"subtractService"
/>
<
reference
interface
=
"org.ccsoft.minicontainer.samples.calculator.MultiplyService"
bind-property
=
"multiplyService"
/>
<
reference
interface
=
"org.ccsoft.minicontainer.samples.calculator.DivideService"
bind-property
=
"divideService"
/>
</
component
>
<
component
name
=
"AddService"
class
=
"org.ccsoft.minicontainer.samples.calculator.impl.AddServiceImpl"
>
<
service
interface
=
"org.ccsoft.minicontainer.samples.calculator.AddService"
/>
</
component
>
<
component
name
=
"SubtractService"
class
=
"org.ccsoft.minicontainer.samples.calculator.impl.SubtractServiceImpl"
>
<
service
interface
=
"org.ccsoft.minicontainer.samples.calculator.SubtractService"
/>
</
component
>
<
component
name
=
"MultiplyService"
class
=
"org.ccsoft.minicontainer.samples.calculator.impl.MultiplyServiceImpl"
>
<
service
interface
=
"org.ccsoft.minicontainer.samples.calculator.MultiplyService"
/>
</
component
>
<
component
name
=
"DivideService"
class
=
"org.ccsoft.minicontainer.samples.calculator.impl.DivideServiceImpl"
>
<
service
interface
=
"org.ccsoft.minicontainer.samples.calculator.DivideService"
/>
</
component
>
</
composite
>
可见配置文件,清晰的表达了这种组件与服务间的关系,实现代码参见
CalculatorSample
。
基本操作
1 初始化一个Mini-Container
MiniContainer container=new MiniContainer();
container.loadBundlesFromClassPath("first.xml");
2 获取可用组件
//获取服务上下文
ServiceContext context=container.getServiceContext();
SaySomething service=(SaySomething) container.getServiceContext().getServiceByType(SaySomething.class.getName());
获取组件可以根据组件提供的服务及组件名来获取。
其它相关API
/**
* get the service instance by component name
* @param name component name
* @return
*/
public Object getServiceByName(String name);
/**
* get the service instance by service type
* @param type service type
* @return
*/
public Object getServiceByType(String type);
/**
* get the service instance by service type and component name
* @param type service type
* @param name component name
* @return
*/
public Object getServiceByType(String type,String name);
/**
* get the all the service instance by service type
* @param type serviceType
* @return
*/
3 获取未激活的组件
如果组件的依赖关系无法得到解决,则组件将处于未激活状态,未激活的组件可以通过以下方式获取:
Set<?> bundles=context.getUnResolvingServiceBundles();
组件(Component
)及服务(Service
)
Mini-Container中所指的组件是通过普通的Java Bean实现的,通常情况组件会通过Java Interface定义组件所能提供的服务,并且通过Java Bean(组件的实现来实现这个接口)。
配置文件定义如下:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
composite
xmlns
=
"
http://www.ccsoft.org/schema/components"
xmlns:xsi
=
"
http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
=
"
http://www.ccsoft.org/schema/components
mini-container.xsd"
>
<
component
name
=
"AddService"
class
=
"org.ccsoft.minicontainer.samples.calculator.impl.AddServiceImpl"
>
<
service
interface
=
"org.ccsoft.minicontainer.samples.calculator.AddService"
/>
</
component
>
</
composite
>
接口:AddService.java
package org.ccsoft.minicontainer.samples.calculator;
/**
* The Add service interface
*/
public interface AddService {
double add(double n1, double n2);
}
组件实现:AddServiceImpl.java
package org.ccsoft.minicontainer.samples.calculator.impl;
import org.ccsoft.minicontainer.samples.calculator.AddService;
/**
* An implementation of the Add service
*/
public class AddServiceImpl implements AddService {
public double add(double n1, double n2) {
return n1 + n2;
}
}
一个组件可以实现多个接口,从而暴露多个服务。
组件间的依赖
Mini-Container能够通过IoC帮助我们管理组件间的依赖。与Spring不同的是我们通常不需指明具体依赖的组件的名字,而是指明所依赖的服务(即java interface)。
<
component
name
=
"CalculatorService"
class
=
"org.ccsoft.minicontainer.samples.calculator.impl.CalculatorServiceImpl"
>
<
service
interface
=
"org.ccsoft.minicontainer.samples.calculator.CalculatorService"
/>
<
reference
interface
=
"org.ccsoft.minicontainer.samples.calculator.AddService"
bind-property
=
"addService"
/>
<
reference
interface
=
"org.ccsoft.minicontainer.samples.calculator.SubtractService"
bind-property
=
"subtractService"
/>
<
reference
interface
=
"org.ccsoft.minicontainer.samples.calculator.MultiplyService"
bind-property
=
"multiplyService"
/>
<
reference
interface
=
"org.ccsoft.minicontainer.samples.calculator.DivideService"
bind-property
=
"divideService"
/>
</
component
>
通过
referece
元素指定组件所依赖的服务,及这种服务实现被注入后所绑定的属性名称(通过
bind
-
property
指定)。
当如果多个组件提供了某组件所依赖的服务时,容器会在其中自动选择一个进行关系注入。通过filter属性我们还可以在这种情况下指定具体的组件,filter属性值为所指定的组件名。
<reference inter bind-property="helloService" filter="sorryService"/>
Cardinality属性
通过将该属性设置为”1..n”,我们可以将多个服务提供者注入到依赖当中,但这是绑定的属性必须是集合类型。
<
component
name
=
"helloServiceInvoker"
class
=
"org.ccsoft.mc.samples.HelloServiceInvoker"
>
<
service
interface
=
"org.ccsoft.mc.samples.HelloService"
/>
<
reference
interface
=
"org.ccsoft.mc.samples.HelloService"
bind-property
=
"services"
cardinality
=
"1..n"
/>
</
component
>
package org.ccsoft.mc.samples;
import java.util.Collection;
public class HelloServiceInvoker implements HelloService{
private Collection<HelloService> services;
public String sayHello(String sb) {
String ret="";
for (HelloService service:services){
ret+=service.sayHello(sb)+"n";
}
return ret;
}
public Collection<HelloService> getServices() {
return services;
}
public void setServices(Collection<HelloService> services) {
this.services = services;
}
}
属性值的注入
Mini-Container支持对组件实现类的特定属性通过配置文件进行值的注入,目前版本支持注入的类型包括,数据类型,字符类型及日期类型。
<
component
name
=
"helloService"
class
=
"org.ccsoft.mc.samples.HelloServiceImpl"
>
<
service
interface
=
"org.ccsoft.mc.samples.HelloService"/
>
<
property
name
=
"greeting"
value
=
"Hi"
/>
<
property
name
=
"date"
value
=
"2008-05-08 15:00:00"
/>
</
component
>
public class HelloServiceImpl implements HelloService {
private String greeting;
private Date date;
public String getGreeting() {
return greeting;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
public String sayHello(String sb) {
return greeting+" "+sb+" "+date;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
注意目前日期支持的格式为:yyyy-MM-dd HH:mm:ss
简单AOP
Mini-Container支持了简单的AOP功能,可以对服务的调用进行拦截。这种拦截是通过实现和定义interceptor来实现的(与EJB3的interceptor几乎一致)。
package org.ccsoft.mc.samples;
import org.ccsoft.mc.core.Interceptor;
import org.ccsoft.mc.core.InvocationContext;
public class HelloServiceInterceptor implements Interceptor {
public HelloServiceInterceptor() {
super();
// TODO Auto-generated constructor stub
}
public Object invoke(InvocationContext ctx) throws Exception {
System.out.println("before method:"+ctx.getMethod());
//invoke the method
Object ret=ctx.proceed();
System.out.println("after method");
//modify the result
return (String)ret+"[exist interceptor]";
}
}
配置如下
<
component
name
=
"helloService"
class
=
"org.ccsoft.mc.samples.HelloServiceImpl"
>
<
service
interface
=
"org.ccsoft.mc.samples.HelloService"
>
<
interceptor
class
=
"org.ccsoft.mc.samples.HelloServiceInterceptor"
/>
</
service
>
<
property
name
=
"greeting"
value
=
"Hi"
/>
<
property
name
=
"date"
value
=
"2008-05-08 15:00:00"
/>
</
component
>
可以通过
InvocationContext对象来激活被拦截的对象的方法,通过该对象还可以获得当前被拦截的方法的方法名及传入的参数。
整合Spring
Mini-container可以于Spring进行整合,从而获得更加完善和强大的功能,可以在spring中使用Mini-Container的组件。
配置示例:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
beans
xmlns
=
"
http://www.springframework.org/schema/beans"
xmlns:xsi
=
"
http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
=
"
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
<
bean
id
=
"springSpeaker"
class
=
"org.ccsoft.mc.samples.support.spring.SaySometingSpringBeanImpl"
>
<
property
name
=
"speaker"
ref
=
"miniSpeaker"
/>
</
bean
>
<
bean
id
=
"miniContainerBridge"
class
=
"org.ccsoft.mc.support.spring.MiniContainerBridge"
>
<
property
name
=
"configFile"
value
=
"first.xml"
/>
</
bean
>
<
bean
id
=
"miniSpeaker"
class
=
"org.ccsoft.mc.support.spring.MiniContainerComponentFactory"
>
<
property
name
=
"service"
value
=
"org.ccsoft.mc.samples.SaySomething"
/>
<
property
name
=
"context"
ref
=
"miniContainerBridge"
/>
</
bean
>
</bean>
5月26日 20:22:30
普元培训中心EOS公开培训
SOA博客精英 重金寻求
普元诚招技术精英
goCom币赠送:EOS公开培训调研
普元业务流程平台-Primeton BPS 最新频道火热上线
IDC:SOA中国路线图白皮书免费下载
普元诚招EOS技术咨询顾问
lavenderfei
个人资料
Re: 自己实现IoC,AOP容器
#2楼
总分
275 分
财富
383
威望
41
排名
:(
段位
感谢LZ~~
可惜论坛把最后一段给弄掉了~~博客原文:
http://gocom.primeton.com/blog10040_3229.htm
5月26日 21:52:42
普元培训中心EOS公开培训
SOA博客精英 重金寻求
普元诚招技术精英
goCom币赠送:EOS公开培训调研
普元业务流程平台-Primeton BPS 最新频道火热上线
IDC:SOA中国路线图白皮书免费下载
普元诚招EOS技术咨询顾问
米布
个人资料
Re: 自己实现IoC,AOP容器
#3楼
总分
108 分
财富
718
威望
44
排名
:(
段位
没看到你写实现呀,就是怎么使用
5月26日 23:17:15
SOA 讨论群 12498988
普元培训中心EOS公开培训
SOA博客精英 重金寻求
普元诚招技术精英
goCom币赠送:EOS公开培训调研
普元业务流程平台-Primeton BPS 最新频道火热上线
IDC:SOA中国路线图白皮书免费下载
普元诚招EOS技术咨询顾问
chaocai
个人资料
Re: 自己实现IoC,AOP容器
#4楼
总分
15 分
财富
217
威望
31
排名
第 48 名
段位
争取很快整理好源码后,发布给大家,希望对大家有用!
蔡超
5月27日 10:33:51
普元培训中心EOS公开培训
SOA博客精英 重金寻求
普元诚招技术精英
goCom币赠送:EOS公开培训调研
普元业务流程平台-Primeton BPS 最新频道火热上线
IDC:SOA中国路线图白皮书免费下载
普元诚招EOS技术咨询顾问
chaocai
个人资料
Re: 自己实现IoC,AOP容器
#5楼
总分
15 分
财富
217
威望
31
排名
第 48 名
段位
源码下载
http://www.blogjava.net/Files/chaocai/mini-container-beta0.9-src.rar
希望对大家有帮z,也期待大家的反馈!
5月30日 13:37:25
普元培训中心EOS公开培训
SOA博客精英 重金寻求
普元诚招技术精英
goCom币赠送:EOS公开培训调研
普元业务流程平台-Primeton BPS 最新频道火热上线
IDC:SOA中国路线图白皮书免费下载
普元诚招EOS技术咨询顾问
rosa781010
个人资料
Re: 自己实现IoC,AOP容器
#6楼
总分
147 分
财富
59
威望
1
排名
:(
段位
看不懂,慢慢看
6月15日 15:08:12
普元培训中心EOS公开培训
SOA博客精英 重金寻求
普元诚招技术精英
goCom币赠送:EOS公开培训调研
普元业务流程平台-Primeton BPS 最新频道火热上线
IDC:SOA中国路线图白皮书免费下载
普元诚招EOS技术咨询顾问
chaocai
个人资料
Re: 自己实现IoC,AOP容器
#7楼
总分
15 分
财富
217
威望
31
排名
第 48 名
段位
文章中给出的文件下载后有问题,请从以下地址下载。
http://www.blogjava.net/Files/chaocai/mini-container-beta-0.9-a.rar
源码下载没有问题可以继续下载。
6月19日 8:29:49
普元培训中心EOS公开培训
SOA博客精英 重金寻求
普元诚招技术精英
goCom币赠送:EOS公开培训调研
普元业务流程平台-Primeton BPS 最新频道火热上线
IDC:SOA中国路线图白皮书免费下载
普元诚招EOS技术咨询顾问
[无发表权] 请登录或者注册
发表回复
账号
用户名
密码
登录
内容:
字体大小
xx-small
x-small
small
medium
large
x-large
xx-large
字体
Arial
Courier
Georgia
Helvetica
Impact
Verdana
字体颜色
#000000
#000033
#000066
#000099
#0000CC
#0000FF
#003300
#003333
#003366
#003399
#0033CC
#0033FF
#006600
#006633
#006666
#006699
#0066CC
#0066FF
#009900
#009933
#009966
#009999
#0099CC
#0099FF
#00CC00
#00CC33
#00CC66
#00CC99
#00CCCC
#00CCFF
#00FF00
#00FF33
#00FF66
#00FF99
#00FFCC
#00FFFF
#330000
#330033
#330066
#330099
#3300CC
#3300FF
#333300
#333333
#333366
#333399
#3333CC
#3333FF
#336600
#336633
#336666
#336699
#3366CC
#3366FF
#339900
#339933
#339966
#339999
#3399CC
#3399FF
#33CC00
#33CC33
#33CC66
#33CC99
#33CCCC
#33CCFF
#33FF00
#33FF33
#33FF66
#33FF99
#33FFCC
#33FFFF
#660000
#660033
#660066
#660099
#6600CC
#6600FF
#663300
#663333
#663366
#663399
#6633CC
#6633FF
#666600
#666633
#666666
#666699
#6666CC
#6666FF
#669900
#669933
#669966
#669999
#6699CC
#6699FF
#66CC00
#66CC33
#66CC66
#66CC99
#66CCCC
#66CCFF
#66FF00
#66FF33
#66FF66
#66FF99
#66FFCC
#66FFFF
#990000
#990033
#990066
#9