복붙노트

[SPRING] 주석만을 사용하여 Spring AOP로 인터셉트하기

SPRING

주석만을 사용하여 Spring AOP로 인터셉트하기

스프링 컨텍스트 파일에서 나는 다음과 같은 것을 가지고있다 :

<bean id="userCheck" class="a.b.c.UserExistsCheck"/>
<aop:config>
      <aop:aspect ref="userCheck">
         <aop:pointcut id="checkUser"
                expression="execution(* a.b.c.d.*.*(..)) &amp;&amp; args(a.b.c.d.RequestObject)"/>
         <aop:around pointcut-ref="checkUser" method="checkUser"/>
      </aop:aspect>
</aop:config>    

a.b.c.UserExistsCheck는 다음과 같습니다.

@Aspect
public class UserExistsCheck {

@Autowired
private UserInformation userInformation;

public Object checkUser(ProceedingJoinPoint pjp) throws Throwable {
    int userId = ... //get it from the RequestObject passed as a parameter
    if (userExists(userId)) {
        return pjp.proceed();
    } else {
        return new ResponseObject("Invalid user);
    }
}

그리고이 물건으로 가로 챌 클래스는 다음과 같습니다 :

public class Klazz {
    public ResponseObject doSomething(RequestObject request) {...}
}

이 작동합니다. UserExistCheck는 호출이 Klazz로 전달되기 전에 원하는대로 실행됩니다. 문제는 그것이 이것이 작동하도록하는 유일한 방법이라는 것입니다. 컨텍스트 파일 대신 주석을 사용하여이 작업을 수행하려면 내 작은 두뇌에 너무 많은 것처럼 보입니다. 그래서 ... 정확히 어떻게 UserExistsCheck 및 Klazz에서 메서드에 주석을 추가해야합니까? 그리고 나는 여전히 다른 것을 필요로 하는가? 다른 클래스? 컨텍스트 파일에 아직 뭔가가 있습니까?

해결법

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

    1.주석 기반 AOP를 활성화 했습니까? 설명서에 추가해야한다고 나와 있습니다.

    주석 기반 AOP를 활성화 했습니까? 설명서에 추가해야한다고 나와 있습니다.

    <aop:aspectj-autoproxy/>
    

    당신의 봄 형태로. 그런 다음 checkUser 메소드 앞에 주석을 추가해야합니다. 여기에 설명 된 것처럼 @Around advice가 필요해 보입니다.

    @Aspect
    public class UserExistsCheck {
    
      @Around("execution(* a.b.c.d.*.*(..)) && args(a.b.c.d.RequestObject)")
      public Object checkUser(ProceedingJoinPoint pjp) throws Throwable {
    
  2. ==============================

    2.제공 한 예제 코드에서 인터페이스를 구현하지 않는 클래스에 대한 조언을 작성하는 것으로 보입니다. Spring 문서의 Proxying Mechanisms 섹션에서 설명한 것처럼 이것을 수행하려면 CGLIB를 활성화해야합니다.

    제공 한 예제 코드에서 인터페이스를 구현하지 않는 클래스에 대한 조언을 작성하는 것으로 보입니다. Spring 문서의 Proxying Mechanisms 섹션에서 설명한 것처럼 이것을 수행하려면 CGLIB를 활성화해야합니다.

    <aop:aspectj-autoproxy proxy-target-class="true" />
    

    개인적으로 이것이 문서가 나타내는 것보다 좀 더 까다 롭다는 것을 알았습니다. 그리고 모든 별들이 올바르게 정렬되어 있으면 작동하지만, 종종 설계의 관점에서 보면 더 쉽고 선언적입니다. 다음과 같이 인터페이스에 대한 AOP 조언. (BeanFactory / ApplicationContext에서 KlazzImpl의 인스턴스를 얻어야합니다.)

    public interface Klazz {
      ResponseObject doSomething(RequestObject request);
    }
    
    public class KlazzImpl implements Klazz {
      public ResponseObject doSomething(RequestObject request) {...}
    }
    

    또한 args 표현식을 사용하는 것이 약간의 문제입니다. 다음을 참조하십시오.

    @Aspect
    public class UserExistsCheck {
      @Autowired
      private UserInformation userInformation;
    
      @Around("execution(* a.b.c.d.*.*(..)) && args(reqObj)")
      public Object checkUser(ProceedingJoinPoint pjp, a.b.c.d.RequestObject reqObj) throws Throwable {
          // ...
      }
    }
    

    이러한 변화가 그 일을해야합니다.

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

    3.Spring 3.1 이후 @Configuraiton에 @EnableAspectJAutoProxy (proxyTargetClass = true)를 추가하십시오.

    Spring 3.1 이후 @Configuraiton에 @EnableAspectJAutoProxy (proxyTargetClass = true)를 추가하십시오.

  4. from https://stackoverflow.com/questions/2611986/intercepting-method-with-spring-aop-using-only-annotations by cc-by-sa and MIT license