创建业务层,声明事务
业务层主要处理业务逻辑,提供给web层友好的访问接口和实现访问DAO层。用业务层的另一个好处是,可以适应数据访问层从Hibernate技术转移到其他数据访问技术。
1. 在src/com.jandar.service下新建一个IUserManager接口,该接口有几乎于IUserDAO同样的方法,不同的是处理参数,应为IUserManager是供web层访问的。
public interface IUserManager {
User getUser(String userid);
List getUsers();
User saveUser(User user);
void removeUser(String userid);
}
2. 在src/com.jandar.service.spring下新建IuserManager实现类,UserManager.java
/*
* 创建日期 2005-3-4
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
package com.jandar.service.spring;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.jandar.model.User;
import com.jandar.service.IUserManager;
import com.jandar.service.dao.IUserDAO;
/**
* @author Administrator
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public class UserManagerImpl implements IUserManager {
/* (非 Javadoc)
* @see com.jandar.service.IUserManager#getUser(java.lang.String)
*/
private static Log log=LogFactory.getLog(UserManagerImpl.class);
public IUserDAO userDao;
/**
* @return 返回 userDao。
*/
public IUserDAO getUserDao() {
return userDao;
}
/**
* @param userDao 要设置的 userDao。
*/
public void setUserDao(IUserDAO userDao) {
this.userDao = userDao;
}
public User getUser(String userid) {
User user=userDao.getUser(Integer.valueOf(userid));
if(user==null){
log.warn(" user id "+userid+" not found in database");
}
if(log.isDebugEnabled()){
log.debug("get a user with id "+userid);
}
return user;
}
/* (非 Javadoc)
* @see com.jandar.service.IUserManager#getUsers()
*/
public List getUsers() {
// TODO 自动生成方法存根
return userDao.getUsers();
}
/* (非 Javadoc)
* @see com.jandar.service.IUserManager#saveUser(com.jandar.model.User)
*/
public User saveUser(User user) {
// TODO 自动生成方法存根
userDao.saveUser(user);
return user;
}
/* (非 Javadoc)
* @see com.jandar.service.IUserManager#removeUser(java.lang.String)
*/
public void removeUser(String userid) {
// TODO 自动生成方法存根
userDao.removeUser(Integer.valueOf(userid));
}
}
UserManager.java通过访问dao接口实现业务逻辑和数据库操作。同时该类中提供了set方法,运用了Spring的依赖注入机制。但尚未使用spring的AOP和声明事务。
配置applicationContext.xml
在WEB-INF 下新建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>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>
<property name="url"><value>jdbc:hsqldb:db/appfuse</value></property>
<property name="username"><value>sa</value></property>
<!-- Make sure <value> tags are on same line - if they're not,
authentication will fail -->
<property name="password"><value></value></property>
</bean>
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<list>
<value>com/jandar/model/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="userDAO" class="com.jandar.dao.hibernate.UserDAOHibernate">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="userManagerTarget" class="com.jandar.service.spring.UserManager">
<property name="userDAO"><ref local="userDAO"/></property>
</bean>
<bean id="userManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="transactionManager"/></property>
<property name="target"><ref local="userManagerTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>