嗨大家我是Spring的新手。刚才有疑问。服务和DAO课程做同样的事情?你为什么需要它们?除此之外,我们可以将控制器直接连接到Dao方法,我们可以从中获取数据。什么是完全需要SERVICE Layer。我经历了一些门户网站,其中一些人告诉服务层提供模块化,其中很少有人提到它也是为了安全目的。我仍然感到困惑任何人都可以为此查询提供明确的答案吗?
答案 0 :(得分:3)
在事务和回滚的情况下,服务层是必需的。假设你有一个案例 一种执行多次更新或删除的方法。在这种情况下,您的控制器可能不支持事务,但在服务层spring提供了提交和回滚的方法
让服务层成为DAO的包装器是一种常见的反模式。在你给它的例子中肯定不是很有用。使用服务层意味着您可以获得以下好处:
您可以明确区分控制器中最佳完成的Web类型活动与非Web相关的通用业务逻辑。您可以与控制器逻辑分开测试与服务相关的业务逻辑。
通常,我的服务包含单一类型用户的用例,服务上的每个方法都是单个操作(在单个请求 - 响应周期中完成的工作),该用户将执行该操作,而不像您的例如,通常不仅仅是在那里进行简单的数据访问对象调用。
答案 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来对数据库进行查询。