让我们考虑一个简单的用户插入操作。我的Spring相关课程是UserController
,UserService
,UserServiceImpl
,UserDAO
,UserDAOImpl
。
在控制器端,我拨打userService.insert(new User())
并在userService.insert()
方法中拨打userDAO.insert(user)
。我认为这种模式存在方法重复。
有没有办法避免方法重复?可能是我的编码有问题。我等你的回复,经历......
提前感谢...
答案 0 :(得分:3)
对于我的项目,我使用这些服务和DAO层。 我不知道这是一种最佳做法。
这是一个示例创建操作级别:
[View Layer]
* Simple HTML form or AJAX request
|
| User submits create form. Browser sends POST data
| to controller.
|
[User Controller]
* Authentication and authorization. @Security annotations can be for method security.
* Controller tries to bind POST data to UserCreateForm. If can't Validation exception occurs.
* Validates bind data according to validation annotations. @Required ...
|
| (UserCreateForm) is POJO class which has validation annotations.
| It is similar but different from domain objects.
|
[User Controller]
* Logs errors via Logging API (logback, slf4j, log4j ...)
* Copies form values from UserCreateForm to User domain object
* Calls service methods.
* Passes messages and model objects to desired view page.
|
| (User) is POJO class. called domain object, contains ORM annotations if using JPA
| or hibernate. It is similar but different from form/command objects. It can be
| generated automatically by tools (IDE, hibernate tools ...)
|
[UserService & UserServiceImpl]
* Calls multiple DAO methods in one transaction. If an error occurs. rolls back.
* Contains business logic
* Doesn't know the database technology.
|
| (User) domain object.
|
[UserDAO & HibernateUserDAOImpl || JpaUserDAOImpl || OracleJdbcDAOImpl ...]
* DAO layer knows the persistence technology
* Operations are atomic
答案 1 :(得分:1)
我认为这不重复,我认为你使用了非常糟糕的名字(使它看起来像重复)。
服务方法“创建”用户,DAO方法“插入”或“保存”它。
现在您看到“创建”和“插入”是两种不同的操作,具有不同的范围和不同的抽象级别。所以这没有重复。
答案 2 :(得分:0)
您所概述的内容看起来很好,适合业务服务模式的许多实现。可能导致您混淆的是,通常用于描述方法/功能的语言在每个层之间是不同的。例如,'insert'是一个更多的数据持久性术语,而业务/服务层想要“创建”一个用户。差异的原因是通常概念上的差异。在服务层“创建”用户只是一个“对象”,一个“用户”,而在DAO层,它实际上是几个步骤; 1.创建'用户',2。在不同的表中创建他们的'地址',3。将它们添加到任何安全组。
所以在你的情况下你可能实际上有一对一,在很多情况下,业务层1等同于许多DAO交互。
答案 3 :(得分:0)
除了提及名称的混淆之外,您描述的结构是一个很好的起点。根据复杂性,您可以将接口类保留在外,最终会有三个类。如果你的申请很小(中等)我认为这是一种合法的方法,即使这不是最佳做法。一旦你发现有很多依赖关系,并且你需要某种api软件包,你需要某种类型的api软件包很容易引入spring,因为它不是整个应用程序。
您必须记住的另一件事是,您不需要为每个用例乘以这个完整的类链。广义的SimpleCrudDao和SimpleEntityService非常好。然后,一旦这个SimpleEntityService不够用,您就可以开始创建特定的那些,例如具有createUserAndTransferEntitiesAndUpdateWhatsoever方法的UserService。