Spring DM Application Context
Application Context创建
Spring DM提供org.springframework.osgi.extender的Bundle来为每个支持Sping功能的Bundle初始化一个application context。当extender Bundle启动后,它会为那些状态为ACTIVE并且直持Spring的Bundle创建application context。说白了,这个Bundle监听bundle启动事件。Extender bundle创建application context是异步的,通过不同的线程启动每个Bundle。这样可以保证启动平台快速并且Bundles之间的服务引用不会引起死锁。如果application context创建失败,bundle会是ACTIVE状态,但是这时将没有服务导出。
这和Application context销毁相反,Application context销毁是同步的,通过同一个线程。
如何知道Application Context创建创建成功?
当Application Context创建成功后,这个对象会被注册为一个服务。这个服务接口是org.springframework.context.ApplicationContext。并且这个服务带有一个服务属性:org.springframework.context.service.name,对应的值为Bundle的symbolic name,这个值在Manifest文件中定义。注册这个服务主要目的是更容易测试管理。通过引用这个服务调用getBean()或类似的方法是不推荐的。建议的方式的将需要的Bean发布成一个服务,然后需要这个服务的Bundle引用它。
怎样在Bundle中获得OSGi的BundleContext呢?
Application context创建成功后会包含一个类型为BundleContext,名字为bundleContext的Bean。你可以在配制文件注入这个Bean。此外,你还可以通过实现org.springframework.osgi.context.BundleContextAware接口来获取。
当一个bundle停止了,它发布的服务将会从服务注册表里删除,它的状态变成RESOLVED,它将释放所有资源,停止所有线程,但是导出的Packages对其他bundle继续有效。
所有资源加载通过org.springframework.core.io.ResourceLoader并且通过它关将资源加入到application context。