Martin Fowler有一篇文章里称:说一个面向对象系统框架或结构是基于IoC的,就好像说汽车有四个轮子一样。非常精辟 ,IoC或者DI更多的是一个设计原则,一个设计良好的面向对象的系统或多或少都有这方面的特点,这与是否有一个IoC容器的关系不大,IoC容器的作用 是简化开发,强制系统遵循IoC原则而已。
OpenCore在最初设计的时候,没有考虑IoC容器的问题,主要是解决服务端的WEB开发、数据库访问、与REST远程通信等问题,我们完全使用 OSGi本身的服务注册机制,在插件启动时用代码实现依赖注射。直到今年8月份左右,我们把依赖注射的职责分离出来,在OSGi上实现了一个分级的IoC 容器,以简化开发,避免在插件启动类写依赖注射的代码。
OpenCore IoC容器有下面几个特性:
1. 每个插件(bundle)增加一个IoC的自描述文件META-INF/OPENCORE.XML,例如org.opengoss.web.core中,该文件的配置如下:
<plugin version="1.0" id="WebCore"></plugin>
2. 插件的激活类(Activator)不是直接实现OSGi本身的"BundleActivator"接口,而是继承由OpenCore提供的 "org.opengoss.core.PluginActivator",启动时,PluginActivator负责完成XML文件解析与依赖注射。 例如org.opengoss.web.core中的Activator代码如下:
3. 我们注意到上的的服务配置中有"scope"的属性,该属性定义一个服务的使用范围,确定一个服务注册到哪一级IoC容器。
4. 另外一点,我们在IoC基础上增加了动态扩展点功能,实现多对1的注射。
OpenCore整个项目代码发布在www.sf.net/projects/opengoss与code.google.com/p/opengoss下。
OpenCore在最初设计的时候,没有考虑IoC容器的问题,主要是解决服务端的WEB开发、数据库访问、与REST远程通信等问题,我们完全使用 OSGi本身的服务注册机制,在插件启动时用代码实现依赖注射。直到今年8月份左右,我们把依赖注射的职责分离出来,在OSGi上实现了一个分级的IoC 容器,以简化开发,避免在插件启动类写依赖注射的代码。
OpenCore IoC容器有下面几个特性:
- 完全基于OSGi的插件体系结构。
- 简单,远没有Spring IoC容器复杂,支持属性注射(Property Injection)与构造函数注册(Constructor Injection)。
- 分级IoC容器,分为插件级、应用程序级、网络级
- IoC容器管理的服务与OSGi框架管理的服务可以互访,这样保证了OpenCore IoC不会屏蔽OSGi本身的模型,使得基于OpenCore IoC的插件与大量第三方基于完全基于OSGi服务模型的插件可以协作。
- 支持通过动态扩展点实现1对多的依赖注册机制。
1. 每个插件(bundle)增加一个IoC的自描述文件META-INF/OPENCORE.XML,例如org.opengoss.web.core中,该文件的配置如下:
<plugin version="1.0" id="WebCore"></plugin>
xml 代码
- <plugin id="WebCore" version="1.0">
- <service id="WebServerConfiguration" scope="application" class="org.opengoss.web.internal.WebServerConfiguration">
- <interface name="org.opengoss.web.core.IWebServerConfiguration"/>
- </service>
- <service id="MarshallerRegistry" scope="application" class="org.opengoss.web.internal.MarshallerRegistry">
- <interface name="org.opengoss.web.service.IMarshallerRegistry"/>
- </service>
- <service id="WSContainer" scope="application" class="org.opengoss.web.internal.WSContainer">
- <interface name="org.opengoss.web.service.IWSContainer"/>
- <property name="marshallerRegistry" ref="MarshallerRegistry"/>
- </service>
- <service id="WSExporter" scope="application" class="org.opengoss.web.internal.WSExporter">
- <interface name="org.opengoss.web.service.IWSExporter"/>
- <constructor>
- <param ref="WSContainer"/>
- </constructor>
- </service>
- <extension-point id="Marshaller" target="MarshallerRegistry"
- bindMethod="addMarshaller" unbindMethod="removeMarshaller"/>
- <extension-point id="WebService" target="WSExporter"
- bindMethod="export" unbindMethod="unexport"/>
- <extension-point id="Class" target="MarshallerRegistry"
- bindMethod="addAliasClass" unbindMethod="removeAliasClass"/>
- </plugin>
2. 插件的激活类(Activator)不是直接实现OSGi本身的"BundleActivator"接口,而是继承由OpenCore提供的 "org.opengoss.core.PluginActivator",启动时,PluginActivator负责完成XML文件解析与依赖注射。 例如org.opengoss.web.core中的Activator代码如下:
java 代码
- import org.opengoss.core.IPluginContext;
- import org.opengoss.core.PluginActivator;
- /**
- * Plugin activator.
- *
- * @author Ery Lee(ery.lee@gmail.com)
- * @version 1.0 2006-11-20
- * @since 1.0
- */
- public class Activator extends PluginActivator {
- @Override
- protected void startPlugin(IPluginContext pluginContext)
- throws Exception {
- }
- @Override
- protected void stopPlugin(IPluginContext pluginContext)
- throws Exception {
- }
- }
3. 我们注意到上的的服务配置中有"scope"的属性,该属性定义一个服务的使用范围,确定一个服务注册到哪一级IoC容器。
4. 另外一点,我们在IoC基础上增加了动态扩展点功能,实现多对1的注射。
OpenCore整个项目代码发布在www.sf.net/projects/opengoss与code.google.com/p/opengoss下。