多语言展示
当前在线:743今日阅读:167今日分享:16

Aspect实例化模型、顾问、AOP架构示例

Aspect实例化模型、顾问、AOP架构示例
工具/原料
1

spring

2

IntelliJ

方法/步骤
1

模式定义方面唯一支持的实例化模型是单例模型。未来的版本可能支持其他实例化模型。

2

“顾问”的概念来自Spring中定义的AOP支持,并且在AspectJ中没有直接的等价物。顾问就像一个小小的自足方面,只有一条建议。建议本身由bean表示,并且必须实现Spring中的建议类型中描述的建议接口 之一。顾问可以利用AspectJ切入点表达式。

3

Spring支持使用元素的顾问概念。您最常见的是它与事务性建议一起使用,它在Spring中也有自己的命名空间支持。以下示例显示了一个顾问:

4

除了pointcut-ref前面示例中使用的pointcut属性之外,您还可以使用该 属性来内联定义切入点表达式。要定义顾问程序的优先级以便建议可以参与排序,请使用该order属性来定义Ordered顾问程序的值。

5

由于并发问题(例如,死锁失败者),业务服务的执行有时可能会失败。如果重试该操作,则可能在下一次尝试时成功。对于适合在这种情况下重试的业务服务(不需要返回给用户进行冲突解决的幂等操作),我们希望透明地重试操作以避免客户端看到PessimisticLockingFailureException。这是明确跨越服务层中的多个服务的要求,因此是通过一个方面实现的理想选择。

6

因为我们想要重试操作,所以我们需要使用around建议,以便我们可以proceed多次调用。以下清单显示了基本方面实现(使用模式支持的常规Java类):

7

请注意,该方面实现了Ordered接口,以便我们可以将方面的优先级设置为高于事务通知(我们每次重试时都需要一个新的事务)。该maxRetries和order性能都Spring配置。主要操作发生在doConcurrentOperationaround advice方法中。我们试着继续。如果我们失败了PessimisticLockingFailureException,我们再试一次,除非我们已经用尽所有的重试尝试。

8

相应的Spring配置如下:

9

请注意,在当时,我们假设所有业务服务都是幂等的。如果不是这种情况,我们可以通过引入Idempotent注释并使用注释来注释服务操作的实现来优化方面,使其仅重试真正的幂等操作,如以下示例所示:

10

对方面进行更改以仅重试幂等操作涉及改进切入点表达式,以便只有@Idempotent操作匹配,如下所示:

推荐信息