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

Java 基于AOP的持久性、事务和;示例消息传递,java,transactions,persistence,aop,message,Java,Transactions,Persistence,Aop,Message,我真的开始考虑AOP,并且非常喜欢抽象出横切关注点并将其从核心业务代码中删除的想法。到目前为止,我一直在阅读AOP联盟(我看到它是Guice和Spring AOP的主力)和AspectJ 不幸的是,当我们谈论任何比简单方法拦截更高级的东西时,很难找到好的、可工作的JavaAOP代码示例。我一直在一遍又一遍地阅读主要的JavaEE概念,如持久性、事务处理和消息传递是如何用AOP实现的,但就我的一生而言,我找不到任何这样的例子 归根结底,AOP确实可以归结为方法拦截(除非我这里遗漏了一些重要的东西)

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

不幸的是,当我们谈论任何比简单方法拦截更高级的东西时,很难找到好的、可工作的JavaAOP代码示例。我一直在一遍又一遍地阅读主要的JavaEE概念,如持久性、事务处理和消息传递是如何用AOP实现的,但就我的一生而言,我找不到任何这样的例子

归根结底,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();
    }

    // ...
}
public Object invoke(MethodInvocation invocation) throws Throwable {
    Object result = invocation.proceed();
    myPersistenceMethod(invocation, result);
    return result;
}
考虑到这一点,能否有人提供具体的代码示例,说明如何通过方法拦截将这些Java EE概念委托给AOP:

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

我想我只是很难把所有的点连接起来,通过“树”看到“森林”。提前谢谢

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

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

  • 查看事务是否已绑定到当前线程
  • 如果没有,则启动事务并将其绑定到当前线程
  • 调用该方法
  • 如果事务是通过此方法拦截启动的,并且该方法未引发运行时异常,请提交事务
  • 如果事务是通过此方法拦截启动的,并且该方法引发了运行时异常,请回滚该事务
  • 从当前线程解除事务绑定
如果没有事务方面,事务方法必须执行以下操作:

try {
    userTransaction.begin();
    executeSomeBusinessCode();
    userTransaction.commit();
}
catch (RuntimeException e) {
    userTransaction.rollback();
}
它很麻烦,容易出错,甚至不能处理事务传播、新事务等

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

executeSomeBusinessCode();

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

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

  • 查看事务是否已绑定到当前线程
  • 如果没有,则启动事务并将其绑定到当前线程
  • 调用该方法
  • 如果事务是通过此方法拦截启动的,并且该方法未引发运行时异常,请提交事务
  • 如果事务是通过此方法拦截启动的,并且该方法引发了运行时异常,请回滚该事务
  • 从当前线程解除事务绑定
如果没有事务方面,事务方法必须执行以下操作:

try {
    userTransaction.begin();
    executeSomeBusinessCode();
    userTransaction.commit();
}
catch (RuntimeException e) {
    userTransaction.rollback();
}
它很麻烦,容易出错,甚至不能处理事务传播、新事务等

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

executeSomeBusinessCode();

不确定你所说的“消息传递”和“持久性”是什么意思-你想发送什么消息?你想坚持什么

如果您想保持方法调用的结果,请实现MethodInterceptor:

// 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();
    }

    // ...
}
public Object invoke(MethodInvocation invocation) throws Throwable {
    Object result = invocation.proceed();
    myPersistenceMethod(invocation, result);
    return result;
}
然后,您可以定义一个注释,并为带注释的方法保留方法结果。例如,在GUI模块中:

 bindInterceptor(Matchers.any(), Matchers.annotatedWith(MyPersistenceAnnotation.class),
            new MyPersistenceInterceptor());
主要问题是如何构造持久性“键”——对您来说,最明显的事情是调用方法和参数,但由于这都是基于反射的,因此如果您开始假设某些方法具有某些参数,就不会进行编译时检查


这有什么帮助。

不知道“消息传递”和“持久性”是什么意思-你想发送什么消息?你想坚持什么

如果您想保持方法调用的结果,请实现MethodInterceptor:

// 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();
    }

    // ...
}
public Object invoke(MethodInvocation invocation) throws Throwable {
    Object result = invocation.proceed();
    myPersistenceMethod(invocation, result);
    return result;
}
然后,您可以定义一个注释,并为带注释的方法保留方法结果。例如,在GUI模块中:

 bindInterceptor(Matchers.any(), Matchers.annotatedWith(MyPersistenceAnnotation.class),
            new MyPersistenceInterceptor());
主要问题是如何构造持久性“键”——对您来说,最明显的事情是调用方法和参数,但由于这都是基于反射的,因此如果您开始假设某些方法具有某些参数,就不会进行编译时检查


这有多大帮助。

一开始AOP虽然令人兴奋,但要小心代码中“automagic”的后果。。。我们已经发现,对于您团队中的其他开发人员来说,这可能会让他们感到非常沮丧/困惑,因为他们对它没有足够的把握。和所有的事情一样,它在适度的情况下是非常好的。我真的建议对此使用注释,而不是纯粹的代码外AOP编织,它只是更容易遵循。对此有兴趣吗,或者您真的在寻找一个带有事务信息的线程局部变量存在的示例吗?我不确定AOP到底会给消息传递增加什么,你在那里寻找什么?我是AOP的新手,正在尝试查看我所做的工作的代码示例。是的,我绝对希望最终使用注释(方法拦截)而不是字节码编织,原因有几个。我要找的是一个AOP方法拦截器的例子,它可以用于持久性或消息传递(意思是,当一个方法执行时,它被截获,并且某种持久性或消息传递导向的代码作为它的建议执行)