This appendix documents features on the Spring Dynamic Modules roadmap. The design of these features specified here is subject to change. As a most up to date source, please see our issue tracker.
It should be possible to easily instantiate a bean from the configuration information stored for a
ManagedService
, and a set of beans from the configuration information
stored for a ManagedServiceFactory
. In addition, updates to the configuration information
should be propagated to beans created in this way.
The
managed-service
element is used to define a bean based on the configuration information stored under a given
persistent id. It has two mandatory attributes, class
and persistent-id
. The
persistent-id
attribute is used to specify the persistent id to be looked up in the configuration administration service,
class
indicates the Java class of the bean that will be instantiated.
A simple declaration of a managed service bean would look as follows:
<osgix:managed-service id="myService" class="com.xyz.MessageService" persistent-id="com.xyz.messageservice"/>
The properties of the managed-service
bean
are autowired by name based on the configuration found under the given
persistent id. It is possible to declare regular Spring bean
property
elements within the
managed-service
declaration. If a property value is
defined both in the configuration object stored in the Configuration
Admin service, and in a nested property
element,
then the value from Configuration Admin takes precedence. Property
values specified via property
elements can
therefore be treated as default values to be used if none is available
through Configuration Admin.
It is possible for the configuration data stored in
Configuration Admin to be updated once the bean has been created. By
default, any updates post-creation will be ignored. To receive
configuration updates, the update-strategy
attribute can be used with a value of either
bean-managed
or
container-managed
.
The default value of the optional
update-strategy
attribute is
none
. If an update strategy of
bean-managed
is specified then the
update-method
attribute must also be used to
specify the name of a method defined on the bean class that will be
invoked if the configuration for the bean is updated. The update
method must have one of the following signatures:
public void anyMethodName(Map properties) public void anyMethodName(Map<String,?> properties); // for Java 5 public void anyMethodName(Dictionary properties);
When an update strategy of container-managed
is specified then the container will autowire the bean instance by
name based on the new properties received in the update. For
container-managed
updates, the bean class must
provide setter methods for the bean properties that it wishes to have
updated. Container-managed updates cannot be used in conjunction with
constructor injection. Before proceeding to autowire based on the new
property values, a lock is taken on the bean instance. This lock is
released once autowiring has completed. A class may therefore
synchronize its service methods or otherwise lock on the bean instance
in order to have atomic update semantics.
The managed-service-factory
element is
similar to the managed-service
element, but instead
defines a set of beans, one instance for each configuration stored
under the given factory pid. It has two mandatory attributes,
factory-pid
and class
.
A simple managed-service-factory
declaration
would look as follows:
<osgix:managed-service-factory id="someId" factory-pid="org.xzy.services" class="MyServiceClass"/>
This declaration results in the creation of zero or more beans,
one bean for each configuration registered under the given factory
pid. The beans will have synthetic names generated by appending "-"
followed by the persistent id of the configuration object as returned
by Configuration Admin, to the value of the id
attribute used in the declaration of the
managed-service-factory
. For example,
someId-config.admin.generated.pid
.
Over time new configuration objects may be added under the
factory pid. A new bean instance is automatically instantiated
whenever a new configuration object is created. If a configuration
object stored under the factory pid is deleted, then the corresponding
bean instance will be disposed (this includes driving the
DisposableBean
callback if the bean implements
DisposableBean
). The option
destroy-method
attribute of the
managed-service-factory
element may be used to
specify a destroy callback to be invoked on the bean instance. Such a
method must have a signature:
public void anyMethodName();
It is also possible for the configuration of an existing bean to
be updated. The same update-strategy
and
update-method
attributes are available as for the
managed-service
element and with the same semantics
(though obviously only the bean instance whose configuration has been
updated in Configuration Admin will actually be updated). The same
client-locking semantics also apply when using the
container-managed
update strategy
If you need to work directly with the configuration data stored
under a given persistent id or factory persistent id, the easiest way
to do this is to register a service that implements either the
ManagedService
or
ManagedServiceFactory
interface and specify the pid
that you are interested in as a service property. For example:
<service interface="org.osgi.service.cm.ManagedService" ref="MyManagedService"> <service-properties> <entry key="service.pid" value="my.managed.service.pid"/> </service-properties> </service> <bean id="myManagedService" class="com.xyz.MyManagedService"/>
and where the class MyManagedService
implements
org.osgi.service.cm.ManagedService
.
We intend to provide support for automatic publication of service properties sourced from the Configuration Admin service under a given persistent id. This support has yet to be designed but may look as follows:
<service ref="toBeExported" interface="SomeInterface"> <osgix:config-properties persistent-id="pid"/> </service>
Issues to be considered are scoping of a subset of properties to be published (public/private), and automatic updates to published service properties if the value is updated via config admin.
Note that named properties can easily be published as service
properties already without this support, simply by using the
property-placeholder
support.
The current specification does not provide for access to the
ServiceReference
objects for services in a managed
collection (i.e. obtained via a set
or
list
declaration). A future release of Spring Dynamic
Modules will provide an easy means of gaining access to these
references.
A future release of Spring Dynamic Modules may offer the following additional guarantee with respect to application context creation and start levels:
Application context creation happens asynchronously. However, the
extender bundle does guarantee that the creation of all application
contexts for bundles at start level n
will be
complete before the creation of any application context at start level
m
, where m > n
. Care must
therefore be taken not to introduce any mandatory dependencies on
services exported by bundles with higher start levels or a deadlock will
be introduced.
In a similar vein, when shutting down the extender bundle,
application contexts at start level m
will be shut
down before application contexts at start level n
,
where m > n
.
While support for generic and Spring-MVC web applications is available in 1.1.0, in the future we'd like to provide integration (if needed) with other popular web libraries (such as JSF and Spring Web Flow) in the upcoming releases.
Care needs to be taken when using JPA or Hibernate under OSGi as the persistence engines must have visibility of the persistent types and mapping files. The Spring Dynamic Modules project will be investigating an extension model to make managing this easier when persistent configuration is split across several bundles. See Peter Krien's blog entry on the topic for an insight into the issues.
Also, the project aims to simplify deployment of JDBC drivers and
pooling libraries that at the moment require special DynamicImport-Package
.
While OSGi 4.0 is currently required, work is underway to take advantage of the new features available in 4.1. SpringSource is an active participant in the OSGi Enterprise Expert Group and we hope to help many of the ideas found in the Spring Dynamic Modules project to make their way into the OSGi R5 specification. Spring Dynamic Modules would obviously seek to support any such standards at that point in time.