在春季,服务层的作用是什么?在这种情况下如何拆分逻辑?

周杰伦

我正在尝试编写一个简单的webapp,它将电子邮件ID作为参数并为具有该ID的用户生成令牌。我认为我的代码是不言自明的,因此我将其粘贴在这里,这样我就不必详细解释了。

这是我的控制器/ servlet代码

    User user = userManager.getUserByEmailId("[email protected]");
    if (user == null) {
        //TODO handle this
    }
    if (user.getIssuedTokens() == user.getMaxTokens()) {
        // TODO handle this
    }
    String token = tokenService.createToken();
    user.setToken(token);
    user.setIssuedTokens(user.getIssuedTokens() + 1);
    userManager.updateUser(user);

userManager和tokenService是服务层实现。

@Service("tokenService")
public class TokenizationServiceImpl implements TokenizationService {

    @Autowired
    private TokenDAO tokenDAO;

    @Transactional
    public String createToken() {
        String uuid = UUID.randomUUID().toString();
        tokenDAO.createToken(uuid);
        return uuid;
    }
}


@Service("usermanager")
public class UserInterfaceImpl implements UserInterface {

    @Autowired
    private UserDAO userDAO;

    @Transactional
    public void createUser() {
        userDAO.createUser();
    }

    public User getUserByEmailId(String emailID) {
        return userDAO.getUserByEmailId(emailID);
    }

    @Transactional
    public void updateUser(User user) {
        userDAO.updateUser(user);

    }

}

我的春季配置是这样的

<tx:annotation-driven />

    <context:component-scan base-package="com.myapp.dao" />
    <context:component-scan base-package="com.myapp.service" />

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/mydb" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>

    <!-- dataSource TransactionManager -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

这是我的问题:

  1. 将两个服务(usermanager和tokenService)注入到我的控制器/ servlet中,然后一个接一个地调用它们是否有意义?还是我应该直接在TokenServiceImpl中编写一种方法,该方法可以直接使用usermanager服务或UserDAO?
  2. 事务性属性似乎不适用于我。当updateUser方法失败时,将通过createToken()方法在数据库中创建一个令牌。我在这里做错了什么?为什么交易没有回滚?
  3. 通常,我如何决定我的服务应使用多个DAO还是其他服务?
培养

好吧,我对第二个问题的想法可能还会回答第一个问题。在您的代码片段中,我注意到您正在为创建两个不同的事务tokenService.createToken()userManager.updateUser(user)因为您是从@Transaction方法外部调用它们的为了解决此问题,您需要执行以下操作:

public class UserService {

    ...

    @Transactional
    public void assignToken() {
        User user = userManager.getUserByEmailId("[email protected]");
        if (user == null) {
        //TODO handle this
        }
        if (user.getIssuedTokens() == user.getMaxTokens()) {
        // TODO handle this
        }
        String token = tokenService.createToken();
        user.setToken(token);
        user.setIssuedTokens(user.getIssuedTokens() + 1);
        userManager.updateUser(user);
    }
}

您会注意到,为了考虑到这种新的交易行为,我创建了一个名为的新业务组件UserService即使我不太了解您的应用程序并不能说什么是最好的方法,但我绝对不会将其放入您的控制器中。我认为,您应该在以下情况中隔离此行为:

  • 一个新的业务组件(如本例中所做的那样)
  • 或将其封装在您UserManager内部

现在,由您决定是否值得与之耦合UserService为此TokenizationService创建新的业务类。阅读您提供的代码,在我看来UserService可能会有一个TokenizationService原因,因为令牌不会在不同的上下文中使用。

请让我知道您的意见。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在这种情况下,jquery对象的作用是什么?

来自分类Dev

微服务架构,在这种情况下是什么服务

来自分类Dev

在这种情况下,“两次请求服务器”的实际含义是什么?

来自分类Dev

jQuery:在这种情况下,.on()的正确用法是什么?

来自分类Dev

在这种情况下,`typedef`是什么意思

来自分类Dev

在这种情况下,svn更新的流程是什么?

来自分类Dev

jQuery:在这种情况下,.on()的正确用法是什么?

来自分类Dev

在这种情况下setViewControllers的目的是什么

来自分类Dev

> =在这种情况下是什么意思

来自分类Dev

在这种情况下 res 是什么意思?

来自分类Dev

“/^ $/”的这些运算符是什么?在这种情况下它是如何工作的?

来自分类Dev

在这种情况下如何检查单击了什么按钮

来自分类Dev

在这种情况下返回引用是否很好?

来自分类Dev

这种代码为什么起作用,在这种情况下,Delphi如何实例化一个类?

来自分类Dev

令牌是什么!在这种情况下(与绑定一起)是什么意思?

来自分类Dev

在这种情况下,wait(null) 做什么?程序的输出是什么?

来自分类Dev

在这种情况下,处理AngularJS中事件的最佳方法是什么?

来自分类Dev

在这种情况下python比C慢得多的原因是什么?

来自分类Dev

在这种情况下,从左到右的关联性是什么意思?

来自分类Dev

在这种情况下,尾随填充字节的重要性是什么?

来自分类Dev

glRotate(angle,x,y,z),在这种情况下,x,y,z是什么?

来自分类Dev

在这种情况下,sorted()的替代方法是什么?还是可以管理?

来自分类Dev

在这种情况下,removeListener的适当用法是什么?

来自分类Dev

在这种情况下执行git-rebase的正确命令是什么?

来自分类Dev

Prolog-在这种情况下是什么导致超出本地堆栈错误?

来自分类Dev

在这种情况下,避免混乱循环的最佳方法是什么?

来自分类Dev

mysql:在这种情况下索引多列的最佳方法是什么

来自分类Dev

在这种情况下,将undef传递给DBI的do方法的目的是什么?

来自分类Dev

在这种非常相似的情况下,jQuery选择器是什么?

Related 相关文章

  1. 1

    在这种情况下,jquery对象的作用是什么?

  2. 2

    微服务架构,在这种情况下是什么服务

  3. 3

    在这种情况下,“两次请求服务器”的实际含义是什么?

  4. 4

    jQuery:在这种情况下,.on()的正确用法是什么?

  5. 5

    在这种情况下,`typedef`是什么意思

  6. 6

    在这种情况下,svn更新的流程是什么?

  7. 7

    jQuery:在这种情况下,.on()的正确用法是什么?

  8. 8

    在这种情况下setViewControllers的目的是什么

  9. 9

    > =在这种情况下是什么意思

  10. 10

    在这种情况下 res 是什么意思?

  11. 11

    “/^ $/”的这些运算符是什么?在这种情况下它是如何工作的?

  12. 12

    在这种情况下如何检查单击了什么按钮

  13. 13

    在这种情况下返回引用是否很好?

  14. 14

    这种代码为什么起作用,在这种情况下,Delphi如何实例化一个类?

  15. 15

    令牌是什么!在这种情况下(与绑定一起)是什么意思?

  16. 16

    在这种情况下,wait(null) 做什么?程序的输出是什么?

  17. 17

    在这种情况下,处理AngularJS中事件的最佳方法是什么?

  18. 18

    在这种情况下python比C慢得多的原因是什么?

  19. 19

    在这种情况下,从左到右的关联性是什么意思?

  20. 20

    在这种情况下,尾随填充字节的重要性是什么?

  21. 21

    glRotate(angle,x,y,z),在这种情况下,x,y,z是什么?

  22. 22

    在这种情况下,sorted()的替代方法是什么?还是可以管理?

  23. 23

    在这种情况下,removeListener的适当用法是什么?

  24. 24

    在这种情况下执行git-rebase的正确命令是什么?

  25. 25

    Prolog-在这种情况下是什么导致超出本地堆栈错误?

  26. 26

    在这种情况下,避免混乱循环的最佳方法是什么?

  27. 27

    mysql:在这种情况下索引多列的最佳方法是什么

  28. 28

    在这种情况下,将undef传递给DBI的do方法的目的是什么?

  29. 29

    在这种非常相似的情况下,jQuery选择器是什么?

热门标签

归档