服务和DAO类正在做同样的事情。你为什么需要它们?

时间:2014-07-05 09:27:14

标签: java spring hibernate

嗨大家我是Spring的新手。刚才有疑问。服务和DAO课程做同样的事情?你为什么需要它们?除此之外,我们可以将控制器直接连接到Dao方法,我们可以从中获取数据。什么是完全需要SERVICE Layer。我经历了一些门户网站,其中一些人告诉服务层提供模块化,其中很少有人提到它也是为了安全目的。我仍然感到困惑任何人都可以为此查询提供明确的答案吗?

3 个答案:

答案 0 :(得分:3)

在事务和回滚的情况下,服务层是必需的。假设你有一个案例 一种执行多次更新或删除的方法。在这种情况下,您的控制器可能不支持事务,但在服务层spring提供了提交和回滚的方法

让服务层成为DAO的包装器是一种常见的反模式。在你给它的例子中肯定不是很有用。使用服务层意味着您可以获得以下好处:

您可以明确区分控制器中最佳完成的Web类型活动与非Web相关的通用业务逻辑。您可以与控制器逻辑分开测试与服务相关的业务逻辑。

  • 你可以指定交易行为,所以如果你有电话 多个数据访问对象
  • 您可以指定它们出现在同一个交易中
  • 您可以嵌套服务,以便在一个人有不同的交易时间 行为(需要自己的交易)你可以强制执行。
  • 你可以使用postCommit拦截器来做通知之类的事情 发送电子邮件,这样就不会使控制器崩溃。

通常,我的服务包含单一类型用户的用例,服务上的每个方法都是单个操作(在单个请求 - 响应周期中完成的工作),该用户将执行该操作,而不像您的例如,通常不仅仅是在那里进行简单的数据访问对象调用。

答案 1 :(得分:3)

服务层的目的是使用DAO来实现您的业务逻辑。 我已经在服务层下面提供了一些好处

  • 服务层可以使用事务来执行原子操作。在DAO层中使用Transaction不会产生sens(对于复杂的用例),因为操作中可能涉及多个实体。

  • 在Service Layer的帮助下,我们可以将Session范围扩展到请求而不是每次操作的Session。

  • 服务层可用于处理特定于业务的异常,并可抛出可用于显示错误页面的新业务异常。抛出业务特定的异常(如BadCredentials或来自DAO的InvalidInput)会为DAO增加额外的责任来验证用户名和密码。理想情况下,DAO仅用于与数据库通信,所有业务逻辑应位于服务层。

  • 一项服务可以使用多项服务来执行工作流程并允许代码重新使用。

e.g。用例

这是DAO的简单实现,在并发访问期间可能会失败 到同一个数据库行。 假设有两个操作A和B.操作A和B想要创建具有相同用户名的用户(如果尚未存在)。

操作A开始 - > getUser(" abc")返回null --->因此createUser(abc)。

操作B开始---> getUser(" abc")返回null,因为事务A尚未创建用户abc --->因此createUser(abc),如果我们使用username作为主键,这将抛出重复主键的数据库异常,或者如果我们使用代理键,我们可以有两个用户具有相同的用户名,因为操作A在先前的事务中创建了用户abc。

public class UserDao{


public User getUser(String Username){

    User user = null;
    Session session = SessionFactory.OpenSession();
    Transaction tx = session.beginTransaction();

    // Some logic here...//
    tx.commit();
    session.close();
    retur user;
}

public User createUser(User user){

    Session session = SessionFactory.OpenSession();
    Transaction tx = session.beginTransaction();
    // Some logic here...//
    tx.commit();
    session.close();
}

}


public class NewUserDao{


public User getUser(String Username){

    User user = null;
    Session session = SessionFactory.getCurrentSession();
    // Some logic here...//
    return user;
}

public User createUser(User user){

    Session session = SessionFactory.getCurrentSession();
    // Some logic here...//
    return user;
}

}

public class UserService{

New UserDao newUserDao; //Dependecy injection

@Transactional
public User createUser(User user){

if(newUserDao.getUser(user.getUserName())== null){
    newUserDao.createUser(user);
}

}

}

答案 2 :(得分:2)

您应该在DAO中放入对数据库的所有访问权限,并且您不应该在此处放置业务逻辑。所有逻辑都应该包含在服务中,服务应该调用DAO来对数据库进行查询。