java - 基于 AOP 的持久性、事务和消息传递示例

标签 java transactions persistence aop message

我真的开始关注 AOP,并且非常喜欢抽象出横切关注点并将其从我的核心业务代码中删除的想法。到目前为止,我一直在阅读 AOP Alliance(我认为它是 Guice 和 Spring AOP 的主力)和 AspectJ。

不幸的是,当我们谈论比简单方法拦截更高级的事情时,很难找到好的、有效的 Java AOP 代码示例。我一遍又一遍地阅读如何使用 AOP 实现持久性、事务处理和消息传递等主要 Java EE 概念,但我一生都找不到任何这样的示例!

最终来说,AOP 确实归结为方法拦截(除非我在这里遗漏了一些主要的东西)。因此,如果是这种情况,并给出方法拦截器的一般形式:

// Using AOP Alliance for this example
public class MyInterceptor implements MethodInterceptor {
    public Object invoke(MethodInvocation inv) {
        // Run this code before executing inv.
        preInvocation();

        Object result = inv.proceed();

        // Run this code after executing inv.
        postInvocation();
    }

    // ...
}

鉴于此作为起点,有人可以提供具体代码示例来说明如何通过方法拦截将每个 Java EE 概念委托(delegate)给 AOP:

  • 持久化/ORM
  • 交易处理
  • 消息传递

我想我只是很难将所有点连接起来并通过“树木”看到“森林”。提前致谢!

最佳答案

不知道持久性和消息传递,但对于事务,我可以解释。我将以 Spring 为例。

您可以配置 Spring bean(通常是服务层 bean),以便在这些 bean 上调用的每个方法都将被事务拦截器拦截。该拦截器通常会执行以下操作:

  • 查看事务是否已绑定(bind)到当前线程
  • 如果没有,则启动一个事务并将其绑定(bind)到当前线程
  • 调用方法
  • 如果事务是通过该方法拦截启动的,并且该方法没有抛出运行时异常,则提交事务
  • 如果事务是通过该方法拦截启动的,并且该方法抛出运行时异常,则回滚事务
  • 从当前线程解除事务绑定(bind)

如果没有事务方面,事务方法必须执行如下操作:

try {
    userTransaction.begin();
    executeSomeBusinessCode();
    userTransaction.commit();
}
catch (RuntimeException e) {
    userTransaction.rollback();
}

它很麻烦,容易出错,甚至不处理事务传播、新事务等。

使用 AOP,方法的主体变为:

executeSomeBusinessCode();

关于java - 基于 AOP 的持久性、事务和消息传递示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10948262/

相关文章:

java - "default character encoding"和 "native character encoding"的含义是什么?

java - 记住 swing 中的窗口位置

java - 在单个 lambda 表达式中将元素添加到不同的集合

java - 我正在 AspectJ 中搜索特定切入点

java - PMD 找不到规则集

sql-server - 调用 BEGIN TRANS 而不是 COMMIT、ROLLBACK 或 END TRANS 时的结果是什么?

java - EJB3 事务回滚

session - 如何杀死从jboss超时的数据库事务

java - RabbitMQ 消息丢失

java - 在 MongoDB 中保留多重图