SCA Java implementation.spring (TUSCANY) edited by Simon Laws
Page:
http://cwiki.apache.org/confluence/display/TUSCANY/SCA+Java+implementation.spring
Changes:
http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=66253&originalVersion=2&revisedVersion=3
Content:
---------------------------------------------------------------------
{section:border=false}
{column:width=15%}
{include: SCA Java Subproject Menu}
{include: Java SCA Menu New}
{column}
{column:width=85%}
h2. <implementation.spring>
The Tuscany Java SCA runtime supports components implemented with Spring
Framework by using the <implementation.spring> SCDL extension.
Spring Framework are used with SCA by integration Spring at the SCA Composite
level, where a Spring application context provides a complete composite,
exposing services and using references via SCA. This means that a Spring
application context defines the internal structure of a composite
implementation.
The Spring Component implementation is one of the SCA extensions which is being
formalized in the OASIS Open Composite Services Architecture with a published
[specifications |http://www.oasis-opencsa.org/sca-spring] document.
h3. How Spring Application Context is used as SCA Composite Implementation?
* A Spring Application Context is used as an implementation within an SCA
composite component.
* A component that uses Spring for an implementation can wire SCA services and
references without introducing SCA metadata into the Spring configuration. The
Spring context knows very little about the SCA environment.
* All policy enforcement occurs in the SCA runtime implementation and does not
enter into theSpring space.
* It should be possible to generate an SCA Composite from any Spring context
and use that composite within an SCA assembly.
h3. How to Use Spring Component Implementation
The Spring component implementation SCDL has the following format:
{code}
<implementation.spring location="targetURI" />
{code}
Where the location attribute of that element specifies the target uri of an
archive file or directory or the fully qualified path that contains the Spring
application context files.
An example of all the three ways of specifying the target uri in the location
attribute is shown below
a) Specifying Fully Qualified Path:
{code}
<implementation.spring location="./spring/application-context.xml" />
{code}
b) Specifying a Directory:
{code}
<implementation.spring location="./spring" />
{code}
Here the target uri specifies the resource as a directory named "spring", where
all the spring related files are available.
c) Specifying an Archive file:
{code}
<implementation.spring location="./spring.jar" />
{code}
Here the target uri specifies the resource as an archive file name
"spring.jar", where all the spring related files are available.
*IMPORTANT NOTE:* In case of b) and c), If the resource identified by the
location attribute is an archive file then the file META-INF/MANIFEST.MF is
read from the archive. If the location URI identifies a directory, then
META-INF/MANIFEST.MF must exist underneath that directory.
If the manifest file contains a header "Spring-Context" of the format:
+Spring-Context ::= path ( ';' path )*+
Where path is a relative path with respect to the location URI, then the set of
paths specified in the header identify the context configuration files. If
there is no MANIFEST.MF file or no Spring-Context header within that file, then
the default behaviour is to build an application context using
application-context.xml file in the META-INF/spring directory.
h3. Some Examples:
h4. Spring BigBank Sample
The spring-bigbank sample demonstrates most of the functionality that being
specified in the [specifications |http://www.oasis-opencsa.org/sca-spring]
demostrating how the Spring Framework can be used with SCA.
See the [simple-bigbank-spring
|http://svn.apache.org/repos/asf/tuscany/java/sca/samples/simple-bigbank-spring/]
sample for a complete example.
h4. Direct use of SCA references within a Spring configuration
The references like addService, subtractService, multiplyService and
divideService defined by SCA composite as shown below
{code}
<composite>
<component name="CalculatorServiceComponent">
<implementation.spring
location="META-INF/spring/CalculatorService-context.xml"/>
<reference name="addService" target="AddServiceComponent" />
<reference name="subtractService" target="SubtractServiceComponent" />
<reference name="multiplyService" target="MultiplyServiceComponent" />
<reference name="divideService" target="DivideServiceComponent" />
</component>
<component name="AddServiceComponent">
<tuscany:implementation.script script="calculator/AddServiceImpl.js"/>
</component>
<component name="SubtractServiceComponent">
<tuscany:implementation.script
script="calculator/SubtractServiceImpl.rb"/>
</component>
<component name="MultiplyServiceComponent">
<tuscany:implementation.script
script="calculator/MultiplyServiceImpl.py"/>
</component>
<component name="DivideServiceComponent">
<tuscany:implementation.script
script="calculator/DivideServiceImpl.groovy"/>
</component>
</composite>
{code}
can be directly used by Spring Application Context as shown here...
{code}
<beans>
<sca:service name="CalculatorService"
type="bigbank.calculator.CalculatorService"
target="CalculatorServiceBean"/>
<bean id="CalculatorServiceBean"
class="bigbank.calculator.CalculatorServiceImpl">
<!-- Here are some implicit references - a property with a ref not
satisifed within the
* Spring application context.
-->
<property name="addService" ref="addService"/>
<property name="subtractService" ref="subtractService"/>
<property name="multiplyService" ref="multiplyService"/>
<property name="divideService" ref="divideService"/>
</bean>
</beans>
{code}
See the [spring-bigbank-calculator
|http://svn.apache.org/repos/asf/tuscany/java/sca/samples/spring-bigbank-calculator/]
sample for a complete example of using SCA references directly.
h4. Explicit declaration of SCA related beans inside a Spring Application
Context
It is also possible to explicitly declare SCA-related beans inside a Spring
configuration to proxy SCA references. The primary reason you may do this is to
enable the Spring container to decorate the bean (using Spring AOP for example).
The references checkingAccountService, calculatorService and stockQuoteService
defined by SCA composite as shown below
{code}
<composite name="BigBank">
<component name="AccountServiceComponent">
<implementation.spring
location="spring-context/Account-spring-context.xml"/>
<service name="AccountService">
<interface.java interface="bigbank.account.AccountService"/>
</service>
<reference name="savingsAccountService"
target="SavingsAccountServiceComponent"/>
<reference name="checkingAccountService">
<interface.java
interface="bigbank.account.checking.CheckingAccountService"/>
<binding.jms
initialContextFactory="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
jndiURL="tcp://localhost:61619">
<destination name="RequestQueue" create="always"/>
<response>
<destination name="ResponseQueue" create="always"/>
</response>
</binding.jms>
</reference>
<reference name="stockAccountService"
target="StockAccountServiceComponent"/>
<reference name="calculatorService">
<tuscany:binding.rmi host="localhost" port="8099"
serviceName="CalculatorRMIService"/>
</reference>
<reference name="stockQuoteService">
<binding.ws
uri="http://localhost:8081/services/StockQuoteWebService"/>
</reference>
</component>
<component name="SavingsAccountServiceComponent">
<implementation.composite name="bbsv:SavingsAccountDept"/>
</component>
<component name="StockAccountServiceComponent">
<implementation.composite name="bbst:StockAccountDept"/>
</component>
</composite>
{code}
can be declared explicit as SCA beans in Spring Application Context as shown
below using the Spring SCA Namespace schema..
{code}
<beans>
<bean id="AccountServiceBean" class="bigbank.account.AccountServiceImpl">
<property name="calculatorService" ref="calculatorService"/>
<property name="stockQuoteService" ref="stockQuoteService"/>
<property name="checkingAccountService" ref="checkingAccountService"/>
<!-- Here are some implicit references & properties - a property with a
ref not satisifed
* within the Spring application context.
-->
<property name="savingsAccountService" ref="savingsAccountService"/>
<property name="stockAccountService" ref="stockAccountService"/>
<property name="currency" value="EURO"/>
</bean>
<sca:reference name="checkingAccountService"
type="bigbank.account.checking.CheckingAccountService"/>
<sca:reference name="calculatorService"
type="bigbank.calculator.CalculatorService"/>
<sca:reference name="stockQuoteService"
type="bigbank.stockquote.StockQuoteService"/>
</beans>
{code}
See the [simple-bigbank-spring
|http://svn.apache.org/repos/asf/tuscany/java/sca/samples/simple-bigbank-spring/]
sample for a complete example of using explicit declaration of SCA related
beans.
h4. Using SCA Bindings for Spring Implementation
We know that a component that uses Spring for an implementation can wire SCA
services and references without introducing SCA metadata into the Spring
configuration. The Spring context knows very little about the SCA environment.
Hence the SpringComponent implementation remains the same as shown from some of
the examples above but different bindings are chosen at the SCA Composite level
as shown below.
NOTE: All kind of bindings supported by SCA can be used for Spring
Implementation as the bindings are independent of Spring context. Few examples
can be seen below.
h5. Working with SCA WebServices Binding
Declaring Service
{code}
<composite name="StockQuote">
<service name="StockQuoteService" promote="StockQuoteServiceComponent">
<interface.java interface="bigbank.stockquote.StockQuoteService"/>
<binding.ws uri="http://localhost:8081/services/StockQuoteWebService"/>
</service>
<component name="StockQuoteServiceComponent">
<implementation.spring
location="META-INF/spring/StockQuoteService-context.xml"/>
</component>
</composite>
{code}
Declaring Reference
{code}
<component name="AccountServiceComponent">
<implementation.spring
location="spring-context/Account-spring-context.xml"/>
<reference name="stockQuoteService">
<binding.ws uri="http://localhost:8081/services/StockQuoteWebService"/>
</reference>
</component>
{code}
See the [spring-bigbank-stockquote |
http://svn.apache.org/repos/asf/tuscany/java/sca/samples/spring-bigbank-stockquote/]
sample for a complete example of using SCA Web Service binding.
h5. Working with SCA RMI Binding
Declaring Service
{code}
<composite name="Calculator">
<service name="CalculatorService" promote="CalculatorServiceComponent">
<interface.java interface="bigbank.calculator.CalculatorService"/>
<tuscany:binding.rmi host="localhost" port="8099"
serviceName="CalculatorRMIService"/>
</service>
<component name="CalculatorServiceComponent">
<implementation.spring
location="META-INF/spring/CalculatorService-context.xml"/>
<reference name="addService" target="AddServiceComponent" />
<reference name="subtractService" target="SubtractServiceComponent" />
<reference name="multiplyService" target="MultiplyServiceComponent" />
<reference name="divideService" target="DivideServiceComponent" />
</component>
</composite>
{code}
Declaring Reference
{code}
<component name="AccountServiceComponent">
<implementation.spring
location="spring-context/Account-spring-context.xml"/>
<reference name="calculatorService">
<tuscany:binding.rmi host="localhost" port="8099"
serviceName="CalculatorRMIService"/>
</reference>
</component>
{code}
See the [spring-bigbank-calculator
|http://svn.apache.org/repos/asf/tuscany/java/sca/samples/spring-bigbank-calculator/]
sample for a complete example of using SCA RMI binding.
h3. Spring SCA Namespace schema
{code}
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.springframework.org/schema/sca"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://www.springframework.org/schema/sca">
<xsd:element name="composite">
<xsd:complexType>
<xsd:attribute name="component" use="required">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="sca-adapter-class" use="optional">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="reference">
<xsd:complexType>
<xsd:attribute name="name" use="required">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="type" use="required">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="default" use="optional">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="property">
<xsd:complexType>
<xsd:attribute name="id" use="optional">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="name" use="required">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="type" use="required">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="service">
<xsd:complexType>
<xsd:attribute name="name" use="required">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="type" use="required">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="target" use="required">
<xsd:simpleType><xsd:restriction
base="xsd:string" /></xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
{code}
h3. References
[1] SCA Spring Component Implementation Specification -
http://www.oasis-opencsa.org/sca-spring
[2] Spring Framework -
http://static.springframework.org/spring/docs/2.0.x/reference/index.html
{column}
{section}
---------------------------------------------------------------------
CONFLUENCE INFORMATION
This message is automatically generated by Confluence
Unsubscribe or edit your notifications preferences
http://cwiki.apache.org/confluence/users/viewnotifications.action
If you think it was sent incorrectly contact one of the administrators
http://cwiki.apache.org/confluence/administrators.action
If you want more information on Confluence, or have a bug to report see
http://www.atlassian.com/software/confluence