복붙노트

[SPRING] + @Transactional 주위에 사용자 정의 스프링 AOP

SPRING

+ @Transactional 주위에 사용자 정의 스프링 AOP

나는 정의가 주위에 사용자 정의 주석에 맞게 구현해야합니다. 나는 주위에 사용자가 외부 @Transactional 내에서 실행하고자합니다. 불행하게도,이 작업이 표시되지 않습니다. 합니다 (AOP가 작동한다. 나는 그것을 보여 스택 추적을 참조).

스택 트레이스는 MyBatis로 세션, 트랜잭션을 시작 MyBatis로 봄이 트랜잭션을 종료하고 내 AOP가 완료 트랜잭션을 닫는 내 AOP 전에 (로거) 실행 보여줍니다.

내 AOP 도움이 될 발주 로의 구현을 생각했다. 나는 내가 사용 1로 반환 된 값을 설정합니다. 이 작동하지 않았다. 내가 어떻게 봄 명령을 오해 때문에 그것이 생각합니다.

그래서 순서 속성을했다. 이는 Integer.MIN_VALUE를 반환 @Transactional해야한다. 나는 위의 견적을 이해한다면 그것은해야한다, 마지막으로 실행합니다. 나는 다시 배포 할 때, 그것은 여전히 ​​뒤로 실행. 내 AOP, 봄 TX, MyBatis로, 닫기 MyBatis로, 닫기 봄 텍사스, 내 AOP를 닫습니다.

내가 무엇을 잘못하고 있지?

해결법

  1. ==============================

    1.순서 속성이 @Transactional 주석 구성되지 않은 경우, 고문 트랜잭션 속성에 대한 책임이다 - AbstractPointcutAdvisor (사실, 그것의 하위 클래스 중 하나)에 Integer.MAX_VALUE로 정의 Ordered.LOWEST_PRECEDENCE를 반환한다.

    순서 속성이 @Transactional 주석 구성되지 않은 경우, 고문 트랜잭션 속성에 대한 책임이다 - AbstractPointcutAdvisor (사실, 그것의 하위 클래스 중 하나)에 Integer.MAX_VALUE로 정의 Ordered.LOWEST_PRECEDENCE를 반환한다.

    사용자 정의 AOP에 대한 조언을 담당하는 고문은 같은 AbstractPointcutAdvisor의 서브 클래스는, 실제 조언 인터페이스를 주문 구현하는지 여부를 보이는 것, 그것이 않는 경우, 제공된 값은 정렬시 사용됩니다. 사용자 정의 AOP 조언 인터페이스를 주문 구현하지 않는 경우, Advisor는 동일한 기본 Ordered.LOWEST_PRECEDENCE을 반환하고 정렬의 결과는 약간 예측된다.

    그래서, @Transactional 주석의 순서 속성을 구성, 예를 들어 이 같은

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="
               http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
               http://www.springframework.org/schema/tx 
               http://www.springframework.org/schema/tx/spring-tx-3.1.xsd>
               .......
    
               <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" order="[Order for @Transactional]">
    <beans/>    
    

    및 사용자 정의 AOP 조언 구현은 다음과 같습니다

    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    
    import org.springframework.core.Ordered;
    
    @Aspect
    public class CustomAspect implements Ordered {
    
        @Around(value = "@annotation(CustomAnnotation)")
        public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        ... 
        }
        ....
    
        @Override
        public int getOrder() { 
            return [Order for @CustomAnnotation];
        }
    
        ....
    
    }
    

    당신은 아마 당신의 응용 프로그램 전체 순서와 모든 자유 (아직, 정적)을 가지고있다.

    후드, 그것은 프록시 초기화에 위임 OrderComparator에 정렬 비교기 org.springframework.aop.aspectj.autoproxy.AspectJPrecedenceComparator를 사용하여 자문을 정렬 AspectJAwareAdvisorAutoProxyCreator을합니다. 나중에, 실제 실행시, AopProxy의 구체적인 구현은 특정 메소드 것이 인터셉터를 호출하는 조언의 배열을 보유하고 있으며이 동적 재 배열을 위해 사용될 수있다, 나는 생각하지만, 이런 것들 중 어느 것도 쉽게 나에게 보인다 접근 및 / 또는 구성.

    모든 버전 4.0.3 - 내 환경은 봄 콩, TX, AOP이다. 나는 또한 두 개의 사용자 정의 트랜잭션 매니저를 가지고, 하나는 최대 절전 모드 - 바인딩 하나는 JDBC 데이터 소스가 결합 된,하지만 나는 여기에 중요한 생각하지 않는다

  2. ==============================

    2.조금 실험 후 단순히 순서 속성을 제거하면이 작업을하지 않는 것으로 나타났다. 나는 @Transactional 기본 순서로이 홀수가는 Integer.MIN_VALUE입니다 찾을 수 있습니다. 분명히 당신은 당신이 명시 적으로 모든 AOP 주문의 작은에 순서를 설정해야합니다 주문 사용하려는 경우.

    조금 실험 후 단순히 순서 속성을 제거하면이 작업을하지 않는 것으로 나타났다. 나는 @Transactional 기본 순서로이 홀수가는 Integer.MIN_VALUE입니다 찾을 수 있습니다. 분명히 당신은 당신이 명시 적으로 모든 AOP 주문의 작은에 순서를 설정해야합니다 주문 사용하려는 경우.

  3. ==============================

    3.페이지 https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html에서, 그 거래의 기본 순서에 Integer.MAX_VALUE 동일 가치 Ordered.LOWEST_PRECEDENCE, 말한다

    페이지 https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html에서, 그 거래의 기본 순서에 Integer.MAX_VALUE 동일 가치 Ordered.LOWEST_PRECEDENCE, 말한다

  4. from https://stackoverflow.com/questions/32057910/custom-spring-aop-around-transactional by cc-by-sa and MIT license