Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring项目冗余类_Java_Spring - Fatal编程技术网

Java Spring项目冗余类

Java Spring项目冗余类,java,spring,Java,Spring,我第一次构建了一个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.e

我第一次构建了一个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,userserviceinpl

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层。dao层是服务使用的数据API。因此,虽然dao层可能有
UserDao
findByName(字符串用户名)
方法,但服务层不会。相反,服务层将有一个
SecurityService
和一个
authenticateUser(字符串用户名)
,这将调用
userDao.findByName(用户名)
。如果您有一个
UserDetailService
和一个
addEmailAddressToUser(字符串用户名)
,那么,这将调用相同的dao方法。

IMHO最好将业务事务的语义放入服务层,将数据端构建块放入dao层。dao层是服务使用的数据API。因此,虽然dao层可能有
UserDao
findByName(字符串用户名)
方法,但服务层不会。相反,服务层将有一个
SecurityService
和一个
authenticateUser(字符串用户名)
,这将调用
userDao.findByName(用户名)
。如果您有一个
UserDetailService
和一个
addemailAddressToser(字符串用户名)
,那么,这将调用相同的dao方法。

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


服务和DAO接口并不总是如此相似。一个应该是粗粒度的、基于事务的,而另一个则基于实体和数据库查询。

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

服务和DAO接口并不总是如此相似。一个应该是粗粒度的、基于事务的,而另一个则基于实体和数据库查询