2017-09-28 4 views
0

먼저 간단히 작업을 수행하는 CustomerRegister 서비스가 있다고 생각해보십시오.원래 @Transaction 주석이 붙은 메소드에서 @AfterReturnin 연산을 제공하는 Aspect를 생성 할 수 있습니까?

@Service 
class CustomerRegister { 
    private final CustomerRegister customerRegister; 

    CustomerRegister(CustomerRegister customerRegister) { 
     this.customerRegister = customerRegister; 
    } 

    @Transactional 
    public void create(Customer customer) { 
     customerRegister.persist(customer); 
    } 
} 

나중에 레지스트리 조작에 대한 비즈니스 메트릭을 갖는 것이 바람직 할 수 있다고 결정되었습니다. 일반적인 선택하는 org.springframework.boot.actuate.metrics.CounterService

주 사용하는 것입니다

@Transactional를 사용하여, 봄 동적 가 동일한 인터페이스를 구현하는 프록시 (들)을 생성 우리가

counterService.increment(REGISTY_METRIC); 
를 호출하기로 결정하는 경우 클래스 당신은

에 주석하고

생성 방법의 범위 내에서 트랜잭션이 롤백 된 경우에도 카운터가 증가합니다.

내 생각은 랩하는 측면를 만드는 것입니다 transactional proxy (이 포장 원래 CustomerRegister 서비스)가. 그런 다음 @Aspect 구성 요소는 @AfterReturning(pointcut =이라는 주석이 달린 메소드를 제공 할 수 있습니다. 이는 증분 메트릭 카운터입니다.

다른 단어 :

  1. 어떻게 다른 측면을 측면을 구현하는 방법?
  2. aspect over transactional proxy를 구현하는 방법은 무엇입니까?

답변

1

정상적으로 수행되는 것처럼 양상을 구현하십시오. 맞춤 측면 '@Order이 낮은 값 (, 즉 가장 높은 우선 순위 예 : 1)으로 설정되어이 경우 거래 측면 인 다른 측면보다 먼저 실행되도록하십시오.

요청 흐름을 그래픽으로 이해하려면 아래 이미지 (reference)를 참조하십시오. custom advisor(s)에 적절한 순서를 설정하면 특별한 고려 사항없이 거래 전/후로 실행할 수 있습니다. 추천

Spring Transaction execution flow

추가는 화면 순서가 봄에 처리하는 방법을 이해하는 here를 참조하십시오.