我正在使用一组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上。
如何才能让原型方面正确订购?
答案 0 :(得分:2)
我不认为prototype
范围支持方面或更可能没有意义。 11.2.6 Aspect instantiation models的文档特别提及:
默认情况下,每个方面都会有一个实例 应用程序上下文。
要修改此行为,Spring AOP支持AspectJ perthis
和pertarget
实例化模型。也许它们对你有用。
答案 1 :(得分:0)
这似乎是Spring中的一个错误。如果我将{{1}}注释添加到方面,它们会正确排序。我已经提交了Spring的错误。 https://jira.spring.io/browse/SPR-14959