Spring AOP Prototype-scoped Aspects正在无序启动

时间:2016-11-23 15:20:35

标签: spring spring-boot spring-aop

我正在使用一组Spring AOP Aspects(主要来自我的库here)。我发现我为这些方面指定的顺序不再受到尊重(我确定,在过去的某个时刻,例如,1年前在Boot 1.3.x上,它被尊重)当方面的范围bean是"原型"。如果我删除了' scope ="原型"'在XML中,或JavaConfig中的@Scope(" prototype"),排序是正确的,但是当范围是原型时,排序不起作用 - 方面以明显随机的顺序触发。这些方面实现了Ordered接口。

Bean定义遵循模式(JavaConfig):

@Bean
@Scope("prototype")
public CircuitBreakerAspect circuitBreakerAspect()
{
    CircuitBreakerAspect aspect = new CircuitBreakerAspect();
    aspect.setGraphiteClient(graphiteClient);
    aspect.setOrder(100);
    return aspect;
}

我需要将这些方面作为原型范围,因为其中一些(例如,RetryInterceptor)是有状态的(维护失败操作的计数,导出到JMX)。如果我删除原型范围,则排序正常,但是所有建议的bean实例都使用相同的单例方面实例!

我在Spring Boot 1.4.1和Java 8上。

如何才能让原型方面正确订购?

2 个答案:

答案 0 :(得分:2)

我不认为prototype范围支持方面或更可能没有意义。 11.2.6 Aspect instantiation models的文档特别提及:

  

默认情况下,每个方面都会有一个实例   应用程序上下文。

要修改此行为,Spring AOP支持AspectJ perthispertarget实例化模型。也许它们对你有用。

答案 1 :(得分:0)

这似乎是Spring中的一个错误。如果我将{{1}}注释添加到方面,它们会正确排序。我已经提交了Spring的错误。 https://jira.spring.io/browse/SPR-14959