我是第一次构建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),但服务层却没有。取而代之的是,服务层将具有带有SecurityServiceauthenticateUser(String username),并且除其他外将称为userDao.findByName(username)。而且,如果您的UserDetailServiceaddEmailAddressToUser(String username)很好,那将调用相同的dao方法。

10-08 12:50