Spring+hibernate+struts2企业级开发service层重构讲解
2016-04-11 11:43
489 查看
前景介绍
大家也许对dao层的重构并不陌生,根据泛型的应用可以极大简化子类dao代码的书写。dao层用到sessionFactory或HibernateTemplate进行数据的操作。子类dao只要把参数化类型(也就是泛型)传递给父类,就能实现dao层的重构了。那么怎样在service层中向dao层那样实现service重构,实现代码的复用呢?方法简介
要实现service层的重构,就要动态的给BaseServiceImpl(XxxServiceImpl的父类,例如本博客以部门Department为例,XxxServiceImpl也就是DepartmentServiceImpl,下文就以此为例。也就是service架构的核心要实现的类),赋予相应的dao层的DepartmentDao呢?我要介绍的一种方法为利用spring容器的“@Autowried”注解形式为父类serviceImpl动态赋值。话不多说,直接贴代码。代码介绍
BaseService
package com.ssh.baseservice; import java.io.Serializable; import java.util.Collection; import com.ssh.basedao.BaseDao; /** * 对service层的架构重新构造 * @author SURUI * * @param <T> 参数类型 */ public interface BaseService<T>{ public void insertBase(T t); public void deleteBase(Serializable id,String deletedMsg); public void updateBase(T t); public Collection<T> queryallBase(); public T queryoneBase(Serializable id); }
BaseServiceImpl
package com.ssh.baseserviceimpl; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.util.Collection; import org.springframework.transaction.annotation.Transactional; import com.ssh.basedao.BaseDao; import com.ssh.baseservice.BaseService; public class BaseServiceImpl<T> implements BaseService<T> { public BaseDao<T> baseDao; private Class classz; //子类调用父类构造方法时获取泛型的实体类型 public BaseServiceImpl() { //获取带有泛型的父类,子类调用时就把泛型的实体类传递过来了 ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass(); this.classz = (Class) parameterizedType.getActualTypeArguments()[0]; } //由子类在spring容器启动时给BaseDao动态赋值,这样在调用方法之前BaseDao就有了子类对应的baseDao public void setBaseDao(BaseDao<T> baseDao) { System.out.println(baseDao); this.baseDao = baseDao; } @Transactional(readOnly=false) @Override public void insertBase(T t) { baseDao.insertBase(t); } @Transactional(readOnly=false) @Override public void deleteBase(Serializable id,String deletedMsg) { baseDao.deleteBase(id,deletedMsg); } @Transactional(readOnly=false) @Override public void updateBase(T t) { baseDao.updateBase(t); } @Override public Collection<T> queryallBase() { Collection<T> list = baseDao.queryallBase(); return list; } @Override public T queryoneBase(Serializable id) { T t = (T) baseDao.queryoneBase(id); return t; } }
DepartmentService
package com.ssh.service; import com.ssh.baseservice.BaseService; //继承了父类service接口,就有了父类的方法,自己不用写方法了,实现代码的复用 public interface DepartmentService<T> extends BaseService<T>{ }
DepartmentServiceImpl
package com.ssh.serviceimpl; import java.io.Serializable; import java.util.Collection; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ssh.basedao.BaseDao; import com.ssh.basedaoimpl.BaseDaoImpl; import com.ssh.baseserviceimpl.BaseServiceImpl; import com.ssh.dao.DepartmentDao; import com.ssh.domain.Department; import com.ssh.service.DepartmentService; /** * 重构 * * @author SURUI * */ @Service public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements DepartmentService<Department> { @Resource public DepartmentDao departmentDao; /** * sring容器为DepartmentServiceImpl创建实例时,也会调用super.setBaseDao()为父类传递自身的具体dao实现 * @param departmentDao */ @Autowired public void setDepartmentDao(DepartmentDao departmentDao) { super.setBaseDao(departmentDao); } }
总结
service层的重构,并没有想象中那么难,其实为父类传递具体的dao实现类,还有好些方法,例如,直接在增删改查方法参数中传递具体dao实现类,但较为麻烦,不利于代码的复用。大家集思广益,看有没有更好的方法。欢迎讨论。相关文章推荐
- Java 类 子类父类访问权限关系
- springMVC对于controller处理方法返回值的可选类型
- Java的setLocationRelativeTo()
- Java 空字符串“”和null区别
- springMVC的HelloWorld
- java使用傅里叶变换,得到变换之后的傅里叶频谱图像。
- Java 类 子类与父类构造方法
- Spring官网下载dist.zip的几种方法
- Java 流 缓冲流的使用
- Java中的setResizable()
- Java 线程同步 生产消费问题
- Java 线程同步 卖票问题
- MyEclipse下连接SVN资源库URL连接及验证错误解决办法
- JAVA 回调机制(callback)
- Java 改进简单加法器实现(代码精简)
- JAVA的学习过程
- Java 朴素版计算器实现(代码冗长)
- SpringDataJPA的几个使用记录
- java实现的加密解密
- 【Java并发编程六】线程池