2016-11-23 1 views
0

저는 스프링 AOP 측면 집합을 사용하고 있습니다 (주로 내 라이브러리 here). 나는 aspect에 명시된 순서가 더 이상 존중되지 않는다는 것을 발견했다. (1 년 전에 Boot 1.3.x에서 1 년 전, 그것이 존경 받았다고 확신한다.) aspect의 범위 bean은 "프로토 타입"입니다. Java에서 'scope = "prototype"또는 JavaConfig에서 @Scope ("prototype")을 제거하면 순서가 정확하지만 범위가 프로토 타입 일 때 순서가 작동하지 않습니다 - 외관이 임의 순서로 시작됩니다 . aspect는 Ordered 인터페이스를 구현한다. 그들 (예를 들어, RetryInterceptor)의 일부 (인, 실패한 작업의 수를 유지하는 상태이기 때문에봄 AOP 프로토 타입 범위 측면에서 순서가 맞지 않습니다.

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

내가, 프로토 타입 범위로 측면이 필요합니다

콩의 정의는 패턴 (JavaConfig를) 따라 JMX로 내보내기). 프로토 타입 범위를 제거하면 순서가 올바르게 작동하지만 권장되는 모든 빈 인스턴스에 대해 동일한 싱글 톤 aspect 인스턴스가 사용됩니다! 나는 봄 부팅 1.4.1 및 Java 8

가 어떻게 프로토 타입 측면이 제대로 주문을 얻을 수 오전

?

답변

0

이것은 스프링의 버그 인 것으로 보입니다. 애스펙트에 @Order 주석을 추가하면 제대로 정렬됩니다. 봄에 버그를 제출했습니다. https://jira.spring.io/browse/SPR-14959

+0

Juergen은 이것이 의도적이라고 말합니다. 봄 5에서 그들은 다시 방문 할 수있을 것입니다. –

2

prototype 범위가 측면에 대해 지원되거나 더 많은 가능성이 있다고 생각하지 않습니다. 11.2.6 Aspect instantiation models에서 문서는 특히이 언급 : 기본적으로

가 애플리케이션 컨텍스트 내에서 각 측면의 단일 인스턴스가있을 것입니다.

이 동작을 수정하려면 스프링 AOP가 AspectJ를 perthispertarget 인스턴스 모델을 지원합니다. 아마도 그들은 당신에게 유용 할 것입니다.

+0

감사합니다. 필자는'perthis'와'pertarget'을 모두 시도했는데 작동하지 않았습니다. 첫째, 여전히'scope = "prototype"이 필요합니다. 그렇지 않으면 컨테이너가 시작되지 않습니다. 더 이상. 그러나 "주문"속성은 여전히 ​​존중되지 않습니다. Grr, 2007 년부터 이러한 문제를 겪어 본 적이 없지만 전에는이 문제가 없었습니다 ... –

+0

답변 해 주셔서 감사합니다! 그것은 나에게 많은 도움이된다! – paul