2012-07-06 89 views
1

我正在构建一个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执行业务逻辑。

您对这种设计有什么看法?可以接受吗?

回答

3

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

1

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

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