我是第一次建立一个SpringMVC项目,只是希望得到一些关于我的设计的反馈。
目前我有以下UserDao
package org.myproj.com.dao;
import org.myproj.com.entity.User;
public interface UserDao {
public User getById(Long id);
}
这是由UserDaoImpl
实现的package org.myproj.com.dao;
import org.myproj.com.entity.User;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDaoImpl implements UserDao{
@Autowired
private SessionFactory sessionFactory;
public User getById(Long id) {
return (User) sessionFactory.getCurrentSession().get(User.class, id);
}
}
然后我有一个服务层,UserService
package org.myproj.com.service;
import org.myproj.com.entity.User;
public interface UserService {
public User getById(Long id);
}
使用impl,UserServiceImpl
package org.myproj.com.service;
import org.myproj.com.dao.UserDao;
import org.myproj.com.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public UserServiceImpl() {
}
@Transactional
public User getById(Long id) {
return userDao.getById(id);
}
}
然后我的servlet用...
访问它@Autowired
private UserService userService;
User user = userService.getById(1L);
我不禁觉得我的Dao和我的服务正在复制很多。我正在考虑使用服务层添加角色等内容,而Dao则执行业务逻辑。
您如何看待这种设计?可以接受吗?
答案 0 :(得分:3)
恕我直言,最好将业务事务的语义放入服务层,将数据端构建块放入dao层。然后,dao层是服务使用的数据API。因此,虽然dao层可能具有UserDao
方法findByName(String username)
,但服务层不会。相反,服务层会有SecurityService
authenticateUser(String username)
,除此之外,还会调用userDao.findByName(username)
。如果你有UserDetailService
addEmailAddressToUser(String username)
,那么就会调用相同的dao方法。
答案 1 :(得分:1)
当你展示一个简单的例子时,你看起来有点重复,但是一旦你的服务层开始变得更复杂(协调多个服务/ DAO)并且你的DAO有更复杂的查询,那么业务分离逻辑和数据访问逻辑将开始变得更有意义......
服务和DAO接口看起来并不总是那么相似。一个应该是基于粗粒度和基于事务的,而另一个应该基于实体和数据库查询。