基于OSGi的企业级开发框架实践――OSGi Annotations(二)
lloworld.biz.share.OsgiServiceTest;
/**
*
* @author Administrator
* @version $Id: InvokeOsgiServiceTestImpl.java, v 0.1 2013-2-27 下午1:22:45 Administrator Exp $
*/
public class InvokeOsgiServiceTestImpl implements InvokeOsgiServiceTest {
/* OSGi服务 */
private OsgiServiceTest osgiServiceTest;
/**
* @see org.storevm.helloworld.biz.service.impl.InvokeOsgiServiceTest#invoke()
*/
@Override
public void invoke() {
osgiServiceTest.out(); //调用OSGi服务
}
/**
* Setter method for property osgiServiceTest.
*
* @param osgiServiceTest value to be assigned to property osgiServiceTest
*/
@ServiceReference
public void setOsgiServiceTest(OsgiServiceTest osgiServiceTest) {
this.osgiServiceTest = osgiServiceTest;
}
}
这里的关注点是OsgiServiceTest Bean的注入,我们可以看到在Setter方法处使用了如下的Annotation:
[java]
@ServiceReference
通过该Annotation,当前Bean在实例化的时候就会去查找OSGi容器中是否有注册为osgiServiceTest的服务,如果有就会将该服务注入到当前Bean中,如果没有就会抛出异常。为了验证我们的OSGi服务是否注入成功,我们将InvokeOsgiServiceTestImpl定义到Spring上下文中,并将invoke方法定义为init-method。如下所示(在bundle-context.xml文件中定义):
[html]
好了,让我们重新启动Eclipse IDE中的OSGi运行时容器,如果之前已经启动了,则在Console中输入close命令来关闭OSGi容器,然后再启动它。我们在启动日志中会看到如下内容:
(图七)
从上图中可以看到,我们的OSGi服务调用成功了,我们也不再需要 配置元素了。