| <?xml version="1.0" encoding="UTF-8"?> |
| <!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" |
| "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> |
| <chapter id="blueprint"> |
| <title>OSGi 4.2 Blueprint Container</title> |
| |
| <para>Based on the Gemini Blueprint programming model, the OSGi Alliance introduced in OSGi 4.2 Release |
| the Blueprint Container specification (part of the Compendium Service). Gemini Blueprint 1.0 serves as |
| the Blueprint Reference <ulink url="http://en.wikipedia.org/wiki/Reference_implementation">Implementation</ulink> |
| - the official, complete implementation of the spec. |
| </para> |
| <para>Existing and new users have the freedom to mix and match the programming model they want, since Eclipse Gemini Blueprint supports |
| both the Spring DM 1.x declarations and the Blueprint one, inside the same application, provided the default namespace is Blueprint |
| and the Blueprint files are stored in the folder <literal>META-INF/spring</literal>. |
| </para> |
| |
| <para>Please note that this documentation will focus on Gemini Blueprint specific configurations and options; for Blueprint specific |
| behaviour please refer to the OSGi 4.2 Compendium spec, section 121.</para> |
| |
| <section id="blueprint:requirements"> |
| <title>Blueprint Requirements</title> |
| <para>The Blueprint Container spec is part of the OSGi 4.2 release and relies on it, in its API. Thus, |
| in order to use Blueprint, one must use an OSGi 4.2 compatible platform as a runtime environment. Gemini Blueprint itself |
| requires only an OSGi 4.0 framework so if 4.2 is not an option, one can safely downgrade at the loss of the Blueprint |
| model which can be built on top of Spring/Gemini Blueprint. |
| </para> |
| <note>On environments prior to OSGi 4.2, Gemini Blueprint will disable the Blueprint functionality automatically - users will be notified |
| through a log message similar to the following: |
| |
| <screen><![CDATA[Pre-4.2 OSGi platform detected; disabling Blueprint Container functionality]]></screen> |
| |
| </note> |
| </section> |
| |
| <section id="blueprint:differences"> |
| <title>Blueprint/Gemini Blueprint Differences</title> |
| <para>There are a lot of similarities in terms of functionality and configuration between Gemini Blueprint 1.x and Blueprint which should be |
| no surprise considering that Spring DM was the basis of the Blueprint spec. In addition to fully supporting the Blueprint configuration schema, |
| DM 2.x enhanced its declarations by providing option that allow for Blueprint specific behaviour. The table below aggregates the most |
| important user facing differences between Spring/Gemini Blueprint configurations and Blueprint. Additional comparison information is available |
| throughout the documentation (such as <xref linkend="app-deploy:headers:blueprint"/> or <xref linkend="service-registry:export:blueprint"/>). |
| Again, one can simply switch between the two definition styles, if need be.</para> |
| |
| |
| <section id="blueprint:differences:xml"> |
| <title>XML Declarations</title> |
| |
| <para>Most of the XML declarations are similar between Spring and Blueprint. Using the Spring |
| <ulink url="http://static.springsource.org/spring/docs/2.5.x/reference/new-in-2.html#new-in-2-ioc-configuration">namespace</ulink> mechanism, |
| the same configuration can contain both Spring, Gemini Blueprint, Blueprint and other namespaces. Moreover, custom elements can be used for virtually |
| all elements of a Spring configuration (namespace, bean declaration, decoration, etc...). The table below focuses <emphasis>only</emphasis> |
| on the usual, standard Spring namespaces and their Blueprint equivalent.</para> |
| |
| <table id="spring-vs-blueprint-xml" pgwide="1"> |
| <title>XML Configuration Differences</title> |
| <tgroup cols="3"> |
| <thead> |
| <row> |
| <entry>Element/Attribute</entry> |
| <entry>Gemini Blueprint</entry> |
| <entry>Blueprint</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry>Namespace Declaration</entry> |
| <entry><para><literal>http://www.springframework.org/schema/beans</literal></para> |
| <para>or <literal>http://www.springframework.org/schema/osgi</literal></para></entry> |
| <entry><literal>http://www.osgi.org/xmlns/blueprint/v1.0.0</literal></entry> |
| </row> |
| <row> |
| <entry>Root Element</entry> |
| <entry><literal><![CDATA[<beans>]]></literal></entry> |
| <entry><literal><![CDATA[<blueprint>]]></literal></entry> |
| </row> |
| <row> |
| <entry>Default Lazy</entry> |
| <entry><literal><![CDATA[default-lazy]]></literal></entry> |
| <entry><literal><![CDATA[default-activation]]></literal></entry> |
| </row> |
| <row> |
| <entry>Default Init Method</entry> |
| <entry><literal><![CDATA[default-init-method]]></literal></entry> |
| <entry><literal>-</literal></entry> |
| </row> |
| <row> |
| <entry>Default Destroy Method</entry> |
| <entry><literal><![CDATA[default-destroy-method]]></literal></entry> |
| <entry><literal>-</literal></entry> |
| </row> |
| <row> |
| <entry>Default Autowire Strategy</entry> |
| <entry><literal><![CDATA[default-autowire]]></literal>, <literal><![CDATA[default-autowire-candidates]]></literal></entry> |
| <entry><literal>-</literal></entry> |
| </row> |
| <row> |
| <entry>Root Element</entry> |
| <entry><literal><![CDATA[<beans>]]></literal></entry> |
| <entry><literal><![CDATA[<blueprint>]]></literal></entry> |
| </row> |
| <row> |
| <entry>Bean ID</entry> |
| <entry><literal>id</literal></entry> |
| <entry><literal>id</literal></entry> |
| </row> |
| <row> |
| <entry>Bean Name/Alias</entry> |
| <entry><literal>name</literal>/<literal><![CDATA[<alias>]]></literal></entry> |
| <entry><literal>-</literal></entry> |
| </row> |
| <row> |
| <entry>Bean Class</entry> |
| <entry><literal>class</literal></entry> |
| <entry><literal>class</literal></entry> |
| </row> |
| <row> |
| <entry>Bean Scope Name</entry> |
| <entry><literal>scope</literal></entry> |
| <entry><literal>scope</literal></entry> |
| </row> |
| <row> |
| <entry>Built-in Scopes</entry> |
| <entry><literal>singleton</literal>, <literal>prototype</literal>, <literal>request</literal>, <literal>session</literal>, <literal>bundle</literal></entry> |
| <entry><literal>singleton</literal>, <literal>prototype</literal></entry> |
| </row> |
| <row> |
| <entry>Lazy Initialization Name/Values</entry> |
| <entry><literal>lazy-init</literal>=<literal>true/false</literal></entry> |
| <entry><literal>activation</literal>=<literal>lazy/eager</literal></entry> |
| </row> |
| <row> |
| <entry>Depends</entry> |
| <entry><literal>depends-on</literal></entry> |
| <entry><literal>depends-on</literal></entry> |
| </row> |
| <row> |
| <entry>Init Method</entry> |
| <entry><literal>init-method</literal></entry> |
| <entry><literal>init-method</literal></entry> |
| </row> |
| <row> |
| <entry>Destroy Method</entry> |
| <entry><literal>destroy-method</literal></entry> |
| <entry><literal>destroy-method</literal></entry> |
| </row> |
| <row> |
| <entry>Factory Method</entry> |
| <entry><literal>factory-method</literal></entry> |
| <entry><literal>factory-method</literal></entry> |
| </row> |
| <row> |
| <entry>Factory Bean</entry> |
| <entry><literal>factory-bean</literal></entry> |
| <entry><literal>factory-ref</literal></entry> |
| </row> |
| <row> |
| <entry>Bean Inheritance</entry> |
| <entry><literal>parent</literal></entry> |
| <entry><literal>-</literal></entry> |
| </row> |
| <row> |
| <entry>Autowire Strategy</entry> |
| <entry><literal>autowire</literal>, <literal>autowire-candidate</literal></entry> |
| <entry><literal>-</literal></entry> |
| </row> |
| <row> |
| <entry>Constructor</entry> |
| <entry><literal><![CDATA[<constructor-arg>]]></literal></entry> |
| <entry><literal><![CDATA[<argument>]]></literal></entry> |
| </row> |
| <row> |
| <entry>Property</entry> |
| <entry><literal><![CDATA[<property>]]></literal></entry> |
| <entry><literal><![CDATA[<property>]]></literal></entry> |
| </row> |
| <row> |
| <entry>Value</entry> |
| <entry><literal><![CDATA[<value>]]></literal></entry> |
| <entry><literal><![CDATA[<value>]]></literal></entry> |
| </row> |
| <row> |
| <entry>Service Exporter</entry> |
| <entry><literal><![CDATA[<service>]]></literal></entry> |
| <entry><literal><![CDATA[<service>]]></literal></entry> |
| </row> |
| <row> |
| <entry>Service Importer</entry> |
| <entry><literal><![CDATA[<reference>/<list>/<set>]]></literal></entry> |
| <entry><literal><![CDATA[<reference>/<list>]]></literal></entry> |
| </row> |
| |
| </tbody> |
| </tgroup> |
| </table> |
| |
| <para>The configurations below are equivalent in terms of functionality:</para> |
| |
| <programlisting language="xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?> |
| <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy"> |
| <bean id="object" class="java.lang.Object"/> |
| |
| <bean id="length" class="java.lang.Integer"> |
| <argument value="4"/> |
| </bean> |
| |
| <bean id="buffer" class="java.lang.StringBuffer" depends-on="simple"> |
| <property name="length" ref="length"/> |
| </bean> |
| |
| <bean id="current-time" class="java.lang.System" factory-method="currentTimeMillis" scope="prototype"/> |
| |
| <bean id="list" class="java.util.ArrayList" destroy-method="clear" activation="eager"> |
| <argument ref="length"/> |
| </bean> |
| </blueprint>]]></programlisting> |
| <programlisting language="xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?> |
| <beans xmlns="http://www.springframework.org/schema/beans" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" |
| default-lazy-init="true"> |
| |
| <bean id="object" class="java.lang.Object"/> |
| |
| <bean id="length" class="java.lang.Integer"> |
| <constructor-arg value="4"/> |
| </bean> |
| |
| <bean id="buffer" class="java.lang.StringBuffer" depends-on="simple"> |
| <property name="length" ref="length"/> |
| </bean> |
| |
| <bean id="current-time" class="java.lang.System" factory-method="currentTimeMillis" scope="prototype"/> |
| |
| <bean id="list" class="java.util.ArrayList" destroy-method="clear" lazy-init="false"> |
| <constructor-arg ref="length"/> |
| </bean> |
| </beans>]]></programlisting> |
| |
| <para>As mentioned before, in Gemini Blueprint one can mix and match the namespaces provided the default namespace is Blueprint |
| and the Blueprint files are stored in the folder <literal>META-INF/spring</literal>:</para> |
| |
| <programlisting language="xml"><![CDATA[<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" |
| xmlns:beans="http://www.springframework.org/schema/beans" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation=" |
| http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd |
| http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> |
| |
| <beans:bean id="anInteger" class="java.lang.Integer"> |
| <beans:constructor-arg value="10"/> |
| </beans:bean> |
| |
| <service ref="anInteger" interface="java.lang.Comparable" /> |
| </blueprint>]]></programlisting> |
| |
| <para>The example above uses the Gemini Blueprint and Spring <literal>beans</literal> namespaces.</para> |
| </section> |
| |
| <section id="blueprint:differences:container"> |
| <title>Container Capabilities</title> |
| |
| <para>From a container perspective, the Blueprint spec standardizes the a subset of the Spring container. A high-level view comparison, by no |
| means comprehensive, is summarized in the table below:</para> |
| |
| <table id="spring-vs-blueprint-container" pgwide="1"> |
| <title>Container Capabilities Differences</title> |
| <tgroup cols="3"> |
| <colspec colname='c1'/> |
| <colspec colname='c2'/> |
| <colspec colname='c3'/> |
| <spanspec spanname="wide" namest="c1" nameend="c3" align="center"/> |
| <thead> |
| <row> |
| <entry>Feature</entry> |
| <entry>Gemini Blueprint</entry> |
| <entry>Blueprint</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row rowsep="1"> |
| <entry spanname="wide"><emphasis>Object Instantiation</emphasis></entry> |
| </row> |
| <row> |
| <entry>Constructor Instantiation</entry> |
| <entry>Y</entry> |
| <entry>Y</entry> |
| </row> |
| <row> |
| <entry>Static Factory Instantiation</entry> |
| <entry>Y</entry> |
| <entry>Y</entry> |
| </row> |
| <row> |
| <entry>Instance Factory Instantiation</entry> |
| <entry>Y</entry> |
| <entry>Y</entry> |
| </row> |
| <row rowsep="1"> |
| <entry spanname="wide"><emphasis>Dependency Injection</emphasis></entry> |
| </row> |
| <row> |
| <entry>Constructor Injection</entry> |
| <entry>Y</entry> |
| <entry>Y</entry> |
| </row> |
| <row> |
| <entry>Setter Injection</entry> |
| <entry>Y</entry> |
| <entry>Y</entry> |
| </row> |
| <row> |
| <entry>Field Injection</entry> |
| <entry>Y</entry> |
| <entry>N</entry> |
| </row> |
| <row> |
| <entry>Method Injection</entry> |
| <entry>Y</entry> |
| <entry>N</entry> |
| </row> |
| <row> |
| <entry>Arbitrary Method Injection</entry> |
| <entry>Y</entry> |
| <entry>N</entry> |
| </row> |
| <row> |
| <entry>Autowiring</entry> |
| <entry>Y</entry> |
| <entry>N</entry> |
| </row> |
| <row rowsep="1"> |
| <entry spanname="wide"><emphasis>Component Lifecycle</emphasis></entry> |
| </row> |
| <row> |
| <entry>Lazy Initialization</entry> |
| <entry>Y</entry> |
| <entry>Y</entry> |
| </row> |
| <row> |
| <entry>Bean Scopes</entry> |
| <entry>Y</entry> |
| <entry>Y</entry> |
| </row> |
| <row> |
| <entry>Custom Bean Scopes</entry> |
| <entry>Y</entry> |
| <entry>N</entry> |
| </row> |
| <row> |
| <entry>Built-in Callbacks</entry> |
| <entry>Y</entry> |
| <entry>N</entry> |
| </row> |
| <row> |
| <entry>Custom Callbacks</entry> |
| <entry>Y</entry> |
| <entry>Y</entry> |
| </row> |
| <row> |
| <entry>Initialization Processing</entry> |
| <entry>Y</entry> |
| <entry>N</entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| |
| <para>As with the XML configuration, since Gemini Blueprint translates the Blueprint configuration into Spring metadata, one can rely on Spring for features |
| beyond the Blueprint container. For example, one can configure a bean using Blueprint and use annotation on the same instance, for field injection. |
| The same object can implement Spring's <literal>Aware</literal> interfaces or rely on other post processors for certain behaviour.</para> |
| </section> |
| |
| <para>Note that additional information on Blueprint is available through out the documentation. These being said, it is highly recommended to read |
| and use the Blueprint specification as guidance, if the Blueprint Container becomes the programming model of choice.</para> |
| |
| </section> |
| |
| <section id="blueprint:using"> |
| <title>Using Blueprint</title> |
| <para>There are no extra jars or steps that need to be executed to <emphasis>enable</emphasis> the Blueprint functionality in Gemini Blueprint. |
| This is built directly into the core, in fact the Blueprint APIs are exported by the Gemini Blueprint core. Please see the next section for |
| information on how to install Gemini Blueprint and the OSGi compendium spec (section 121) for Blueprint related information such as bootstrapping |
| and configuration locations. For those in a hurry, simply install and start the Gemini Blueprint jars (io, core, extender) and their dependencies |
| (namely Spring and slf4j) and you should be all set: Gemini Blueprint will automatically detect the running environment and the types of bundles started. |
| </para> |
| </section> |
| </chapter> |