ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Poitras Christian" <Christian.Poit...@ircm.qc.ca>
Subject RE: converting iBATIS framework DAOs to the Spring Framework
Date Thu, 12 Apr 2007 13:56:43 GMT
I also suggest to use Stripes to cut the size of Spring config file.

By adding @SpringBean annotation in front of properties (event private),
Stripes will fill these properties by simulating the auto-wire process
of Spring (even if no setter/getter/constructor exists).

For instance, if I have a class like this
/**
 * Manage DataFile.
 * 
 * @author poitrac
 */
public class DataFileManagement {
    public DataFileManagement() {
        super();
    }
    /**
     * For DataFile management.
     */
    @SpringBean private DataFileDao dataFileDao;
    /**
     * Hides DataFiles.
     * @param dataFileList DataFiles to hide from search requests.
     */
    @Transactional
    public synchronized void hide(List<DataFile> dataFileList) {
        dataFileDao.hide(dataFileList);
    }
}

Then I have no special configuration to do in spring.xml beside
declaring the bean.
<bean id="dataFileManagement"
class="ca.qc.ircm.management.DataFileManagement"/>

It's possible to use the feature without using the web framework of
Stripes. To do so, you juste need to add a PostProcessor.
/**
 * Injection bean dependencies based on Annotation.
 * 
 * @author poitrac
 */
public class AnnotationInjector implements BeanPostProcessor,
ApplicationContextAware, Ordered {
    public AnnotationInjector() {
        super();
    }
    /**
     * ApplicationContext for bean injection.
     */
    private ApplicationContext applicationContext;
    /* (non-Javadoc)
     * @see
org.springframework.beans.factory.config.BeanPostProcessor#postProcessBe
foreInitialization(java.lang.Object, java.lang.String)
     */
    public Object postProcessBeforeInitialization(Object bean, String
beanName) throws BeansException {
        return bean;
    }
    /* (non-Javadoc)
     * @see
org.springframework.beans.factory.config.BeanPostProcessor#postProcessAf
terInitialization(java.lang.Object, java.lang.String)
     */
    public Object postProcessAfterInitialization(Object bean, String
beanName) throws BeansException {
        SpringHelper.injectBeans(bean, applicationContext);
        return bean;
    }
    /* (non-Javadoc)
     * @see org.springframework.core.Ordered#getOrder()
     */
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
    /*
     *  (non-Javadoc)
     * @see
org.springframework.context.ApplicationContextAware#setApplicationContex
t(org.springframework.context.ApplicationContext)
     */
    public void setApplicationContext(ApplicationContext
applicationContext) {
        this.applicationContext = applicationContext;
    }
}

Here I use HIGHEST_PRECEDENCE since Stripes requires to set properties
(without setters) before it is enhanced by cglib.

I prefer to just declare my beans in Spring and update my code and not
the xml file (I always forget about updating xml anyway...).


Christian


-----Original Message-----
From: larry.meadors@gmail.com [mailto:larry.meadors@gmail.com] On Behalf
Of Larry Meadors
Sent: Thursday, 12 April 2007 07:35
To: user-java@ibatis.apache.org
Subject: Re: converting iBATIS framework DAOs to the Spring Framework

I'll add this to the wiki, and clean up anything I see in it that looks
odd.

Larry


On 4/12/07, Meindert <meindert@pastelebusiness.com> wrote:
>
>
>
> Hi all.
>
> I've documented the process of converting jpetshop5, and would like to

> know if it is right?
>
> Also I don't know what to do with the
> com.ibatis.dao.client.DaoException thrown in SequenceSqlMapDao?
>
> I'm going to add the transaction on OrderService now.
>
>
> Steps to convert jpetshop5 to ibatis-spring
>
>
>
> The DAO iBATIS has been depreciated and it is recommended to replace 
> this with the spring framework. This document describes the steps 
> taken to convert from ibatis dao to spring dao. I work on the project 
> in netbeans so some terminology used might be incorrect for other 
> IDE's
>
>
>
> Prerequisite is to have a project similar to jpetstore5, and have it 
> connected to a 'normal' database
>
> (There is support for hssqldb in the DaoConfig class what we are going

> to throw away.)
>
>
> Lib jar files;
>
> Remove the old ibatis jar files from the class path and create the 
> reference to the new ibatis and spring jars
>
> Remove ibatis-common-2.jar
> Remove ibatis-dao-2.jar
> Remove ibatis-sqlmap-2.jar
> Add ibatis-2.3.0.677.jar
> Add spring.jar
> Add commons-dbcp-1.2.1.jar
> Add commons-pool-1.2.jar
> Add commons-collections.jar
>
>
> Com.ibatis.jpetstore.persistence.sqlmapdao
>
> Change the BaseSqlMapDao to;
>
> package com.ibatis.jpetstore.persistence.sqlmapdao;
>
> import org.springframework.orm.ibatis.SqlMapClientTemplate;
>
> public class BaseSqlMapDao extends SqlMapClientTemplate {
>
>     protected static final int PAGE_SIZE = 4;
>
> }
>
> All the other SqlMapDao files;
>
> Remove the public AccountSqlMapDao(DaoManager daoManager)  methode
>
> Remove import com.ibatis.dao.client.DaoManager; 
> Com.ibatis.jpetstore.service
>
> The DAO will be injected by spring, thus the constructor can be 
> deleted
>
> Example for AccountService, remove the public AccountService()methode
>
> (also remove import com.ibatis.dao.client.DaoManager;)
>
> There is a transaction in OrderService.java, this transaction must be 
> handled by Spring, remove it here for now. Also remove it out of the 
> constructor;
>
> public OrderService(ItemDao itemDao, OrderDao orderDao, SequenceDao
> sequenceDao) {
>
>     this.itemDao = itemDao;
>
>     this.orderDao = orderDao;
>
>     this.sequenceDao = sequenceDao;
>
>   }
>
>
> The Link between spring and ibatis
>
> Add the SpringInit.java class to a new package com.listeners
>
> This class will be instantiated on load of the website and will pass 
> the reference to the spring managed objects 
> Com.ibatis.jpetstore.presentation
>
>
>
> The presentation layer must connect with the spring managed service 
> layer
>
> So replace;
>
> public AccountBean() {
>
>     this(new AccountService(), new CatalogService());
>
>   }
>
> With
>
> public AccountBean() {
>
>      this((AccountService)
> SpringInit.getApplicationContext().getBean("accountService"),
>
>           (CatalogService)
> SpringInit.getApplicationContext().getBean("catalogService"));
>
>   }
>
> And add import com.listeners.SpringInit;
>
> Repeat for the other classes
>
>
> Configuration
>
> First setup the listeners to have SpringInit initiated on loading of 
> the site
>
> Add to web.xml (after <description> tag)
>
> <context-param>
>
>         <param-name>contextConfigLocation</param-name>
>
>         <param-value>/WEB-INF/spring.xml</param-value>
>
> </context-param>
>
>
>
> <listener>
>
> <listener-class>org.springframework.web.context.ContextLoaderListener<
> /listener-class>
>
> </listener>
>
>
>
> <listener>
>
>  <listener-class>com.listeners.SpringInit</listener-class>
>
> </listener>
>
>
>
> As you can see it is looking for /WEB-INF/spring.xml create this file.
> Attached is the one I created for jpetstore5
>
>
> Cleanup
>
> Throw away DaoConfig.java and dao.xml out of 
> com.ibatis.jpetstore.persistence, and the reference to it in the 
> Service classes
>
>
>

Mime
View raw message