2012-07-06 124 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接口不會總是看起來如此相似。一個應該是一個粗粒度和事務基礎,而另一個基於實體和數據庫查詢。