[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.*.*(..)) && 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.주석 기반 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.제공 한 예제 코드에서 인터페이스를 구현하지 않는 클래스에 대한 조언을 작성하는 것으로 보입니다. 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.Spring 3.1 이후 @Configuraiton에 @EnableAspectJAutoProxy (proxyTargetClass = true)를 추가하십시오.
Spring 3.1 이후 @Configuraiton에 @EnableAspectJAutoProxy (proxyTargetClass = true)를 추가하십시오.
from https://stackoverflow.com/questions/2611986/intercepting-method-with-spring-aop-using-only-annotations by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @ Configurable-Beans는 Spring Boot에서 JPA-EntityListeners와 함께 작동하지 않습니다. (0) | 2019.04.26 |
---|---|
[SPRING] mockMvc를 사용하여 응답 본문에서 JSON을 확인하는 방법 (0) | 2019.04.26 |
[SPRING] URL (Spring, REST, CXF)에서 이스케이프 문자 (파이프 |)를 처리하는 방법? (0) | 2019.04.26 |
[SPRING] 스프링 데이터 JPA + Websphere 8.5.5에서 최대 절전 모드 (0) | 2019.04.26 |
[SPRING] @ 봄 데이터의 과도는 작동하지 않습니다. (0) | 2019.04.26 |