锁定老帖子 主题:业务层代码复用的一点建议
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-29
如果考虑到代码软件最本质的特征-复用。减少不必要的编写。我们可以充分考虑Java语言的特征,诸如反射、多态、继承,以达到最大程度的重构。 由此,我们在编写DAO层代码时,可设计一个BaseDAO类,抽象出最顶层的公有行为。 public void save(Object entityObj); public void update(Object entityObj); public Object findById(Class cls, Integer id); public List<Object> findByProperty(String hql, Object property); public List<Object> findByHql(String hql, Object[] values); public List<Object> findBySql(String sql, Object property); public List<Object> findBySql(String sql, Object[] values); 在业务层,编写服务组件时,也可以抽象出一个BaseService类,集合公有行为。 public class BaseService { private BaseDAO baseDAO; // setter method // 共有方法 } 其他业务层服务组件,可以 extends BaseService达到公有复用。 当然,配置文件需配置bean的父子关系. <bean id="" class="" parent="BaseService"></bean> 这当然只是一种很简单的方法,你也可以从中抽象和重构出更简单更短小的设计。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-07-29
最后修改:2010-07-29
看的出来,lz是个认真学习的好孩子
|
|
返回顶楼 | |
发表时间:2010-07-29
想起以前人们常讨论的 泛型...
|
|
返回顶楼 | |
发表时间:2010-07-29
感觉楼主理解的service没有真正做到service的职责。dao不应该与service存在一一对应的关系,否则你的service仅仅是dao的一层壳,没有太多存在的必要。service与dao应该是1对n的关系(n>=1)
|
|
返回顶楼 | |
发表时间:2010-07-29
传统意义上来将,BaseDao封装的Crud操作已经够用了,dao是很薄的一层,多个Dao注入service只会额外增加code负担
|
|
返回顶楼 | |
发表时间:2010-07-29
用泛型设计 应该会更好 ~呵呵
|
|
返回顶楼 | |
发表时间:2010-07-29
这只是技术的代码复用,没有考虑到业务逻辑上的代码复用。技术是死的,业务需求的变化才是要命的
|
|
返回顶楼 | |
发表时间:2010-07-29
想起了泛型 basedao 就用泛型来写
且要写成抽象的 |
|
返回顶楼 | |
发表时间:2010-07-29
最后修改:2010-07-29
我自己就是这样做的,本着dao只做存储的思想
一个service对应N个dao public interface IBaseDao { void saveOrUpdate(Object entity); @SuppressWarnings("unchecked") void saveOrUpdateAll(Collection entities); void delete(Object entity); <T> List<T> loadAll(Class<T> entityClass); <T> T get(Class<T> entityClass, Serializable id); } 实现: public class BaseDaoHibernateImpl extends HibernateDaoSupport implements IBaseDao { @Autowired public final void setupSessionFactory(SessionFactory sessionFactory) { setSessionFactory(sessionFactory); } @Override public void saveOrUpdate(Object entity) { getHibernateTemplate().saveOrUpdate(entity); } @Override @SuppressWarnings("unchecked") public void saveOrUpdateAll(Collection entities) { getHibernateTemplate().saveOrUpdateAll(entities); } @Override public void delete(Object entity) { getHibernateTemplate().delete(entity); } @Override public <T> List<T> loadAll(Class<T> entityClass) { return getHibernateTemplate().loadAll(entityClass); } @Override public <T> T get(Class<T> entityClass, Serializable id) { return getHibernateTemplate().get(entityClass, id); } } |
|
返回顶楼 | |
发表时间:2010-07-29
最后修改:2010-07-29
理想总是美好的.
当你发现这个Dao需要分页,这个Dao需要转换成Dto,这个Dao的查询需要equals,like,le,lt等等. 有50%的Dao需要上述功能,50%的Dao不需要,那你到底是在不在BaseDao实现这些方法还是抽象还是让子类实现.当业务逻辑越来越复杂以后你就发现突然间Dao被无限扩大不可控了.所以我个人认为还是把公有类写成Utils的形式而不是继承 |
|
返回顶楼 | |