我真的开始关注 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/