|
注意
声明式服务让连接OSGi服务更加容易。可是还有几点需要注意。
* DS bundle需要安装并启动,以把组件连接起来。这样,DS bundle作为OSGi框架启动部分的一部分来安装,比如Equinox的osgi.bundles或Felix的felix.auto.start。
* DS通常有其他依赖需要安装。以Equinox为例,要包括equinox.util bundle。
* 声明式服务是OSGi Compendium Specification的一部分,而不是核心规范的一部分,因此对于服务接口通常需要由一个独立的bundle提供。在Equinox环境下,是由osgi.services提供,但在Felix环境下,接口由SCR(Service Component Registry——服务组件注册)bundle自身输出。
* 声明式服务可以用properties来配置。通常利用OSGi Config Admin服务;尽管这是可选的。因此DS的有些部分需要运行Config Admin;实际上,Equinox 3.5有一个bug,如果要用Config Admin,它需要在DS(Declarative Services)之前启动。这往往要求使用start-up 属性,以确保满足正确的依赖。
* OSGI-INF目录(与XML文件一起)需要被包含进bundle中,否则DS看不到它。你还需要确保Service-Component头在bundle的manifest中存在。
* 还可能要用Service-Component: OSGI-INF/*.xml来包含所有组件而不是逐个罗列其名字。这也允许fragment给一个bundle增加新组件。
* bind和unbind方法需要synchronized以避免潜在的竞争情况出现,尽管在AtomicReference之上使用compareAndSet()还可以被用作单个服务的non-synchronized占位符。
* DS组件不需要OSGi接口,这样,它可以在其他控制反转模式(如Spring)里被模拟来测试或使用。可是Spring DM 和OSGi Blueprint服务都可用来组织服务,这就留作将来的话题吧。
* DS 1.0 没有定义默认的XML命名空间;DS 1.1 增加了 http://www.osgi.org/xmlns/scr/v1.1.0命名空间。如果文件中没有出现命名空间,就认为其兼容DS 1.0。 |
|