Date: 2004-10-11T08:26:10
   Editor: DewiRoberts <[EMAIL PROTECTED]>
   Wiki: Cocoon Wiki
   Page: SpringBeansFromFlowScript
   URL: http://wiki.apache.org/cocoon/SpringBeansFromFlowScript

   no comment

New Page:

##language:en
== Spring Framework from FlowScript  ==
This is a short introduction on how you can access Spring Framework beans from 
your flowscript.  See http://www.springframework.org for more information about 
Spring, and the SpringPetstore example.

=== Why use Spring? ===
Spring lets you configure and instantiate Java objects using an ''application 
context'' XML file.  This can be a simple list of your ''Singleton'' Java 
classes for which there should only ever be one instance created throughout the 
entire application.  An example of a Singleton would be a class which interacts 
with a database - each instance of that class would have its own database 
connection, so having more than one would be a waste of resources.  The Spring 
Framework allows you to create exactly one instance of each singleton, passing 
it any parameters needed; which could be a simple text value, a list of values, 
or a reference to another bean defined in the application context.  All you 
have to do to let Spring inject a value is to add a setter and getter method 
for the properties you want set.

=== Example applicationContext.xml ===
{{{
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd";>
 
<beans>
  <!-- Define your data source -->
  <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
destroy-method="close">
    <property name="driverClassName">
      <value>org.hsqldb.jdbcDriver</value>
    </property>
    <property name="url">
      <value>jdbc:hsqldb:hsql://localhost:9002</value>
    </property>
    <property name="username">
      <value>sa</value>
    </property>
    <property name="password">
      <value></value>
    </property>
  </bean>

  <!-- Pass a reference to the data source to a Data Access Object -->
  <bean id="userDAO" class="org.myapp.UserDAOImpl">
    <property name="dataSource">
      <ref bean="myDataSource"/>
    </property>
  </bean>

  <!-- Pass a reference to the data access object to your application -->
  <bean id="myApp" class="org.myapp.MyAppImpl">
    <property name="userDAO">
      <ref bean="userDAO"/>
    </property>
    
  </bean>
</beans>
}}} 

=== Accessing your application bean from Flowscript ===
Since Cocoon currently uses Avalon, you must create a wrapper object which it 
initializes on startup. You can then access this wrapper from your flowscript 
and retrieve a reference to your application bean, which has been injected with 
properties by Spring.

{{{
public class MyAppWrapper implements Initializable {
    private MyAppService service;
    
    public MyAppService getService() {
        return service;
    }

    public synchronized void initialize() throws Exception {
        BeanFactoryLocator bfl = 
org.springframework.beans.factory.access.SingletonBeanFactoryLocator
                
.getInstance("net/sanctuarytechnology/timesheets/spring/beanRefFactory.xml");

        BeanFactory beanFactory = 
bfl.useBeanFactory("org.myapp.spring.appCtx").getFactory();

        service = (MyAppService ) beanFactory.getBean("
        LocalSessionFactoryBean lsfb = (LocalSessionFactoryBean) 
        service.initializeDatabase(lsfb);

    }
}
}}} 

then in your flowscript

{{{
importClass(Packages.org.myapp.MyAppWrapper);

var myApp = cocoon.createObject(MyAppWrapper).service;
}}}