2

我是第一次构建一个 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和我的Service都复制了很多。我正在考虑使用服务层来添加角色等内容,而 Dao 则执行业务逻辑。

你觉得这个设计怎么样?可以接受吗?

4

2 回答 2

3

恕我直言,最好将业务事务的语义放入服务层,将数据端构建块放入 dao 层。dao 层是服务使用的数据 API。所以,虽然 dao 层可能有UserDao方法findByName(String username),但服务层没有。相反,服务层将有一个SecurityService带有 a 的authenticateUser(String username),除其他外,它会调用userDao.findByName(username). 如果你有 a UserDetailServiceaddEmailAddressToUser(String username)那将调用相同的 dao 方法。

于 2012-07-06T12:45:33.587 回答
1

你是对的,当你展示一个简单的例子时它看起来有点重复,但是一旦你的服务层开始变得更复杂(协调多个服务/DAO)并且你的 DAO 有更复杂的查询,业务逻辑和数据的分离访问逻辑将开始变得更有意义......

服务和 DAO 接口看起来并不总是那么相似。一个应该是粗粒度和基于事务的,而另一个应该是基于实体和数据库查询的。

于 2012-07-06T12:49:42.130 回答