我是第一次构建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);
}
带有一个暗示,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层。 dao层就是服务使用的数据API。因此,尽管dao层可能具有带有UserDao
方法的findByName(String username)
,但服务层却没有。取而代之的是,服务层将具有带有SecurityService
的authenticateUser(String username)
,并且除其他外将称为userDao.findByName(username)
。而且,如果您的UserDetailService
和addEmailAddressToUser(String username)
很好,那将调用相同的dao方法。