Loading...
Spring Framework Reference Documentation 7.0.2의 Manipulating Advised Objects의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
AOP proxy를 어떻게 생성하든지, org.springframework.aop.framework.Advised 인터페이스를 사용하여 이를 조작할 수 있습니다. 어떤 AOP proxy든지, 그 밖에 어떤 다른 인터페이스를 구현하든 상관없이 이 인터페이스로 캐스팅할 수 있습니다. 이 인터페이스에는 다음과 같은 메서드들이 포함됩니다:
1Advisor[] getAdvisors(); 2 3void addAdvice(Advice advice) throws AopConfigException; 4 5void addAdvice(int pos, Advice advice) throws AopConfigException; 6 7void addAdvisor(Advisor advisor) throws AopConfigException; 8 9void addAdvisor(int pos, Advisor advisor) throws AopConfigException; 10 11int indexOf(Advisor advisor); 12 13boolean removeAdvisor(Advisor advisor) throws AopConfigException; 14 15void removeAdvisor(int index) throws AopConfigException; 16 17boolean replaceAdvisor(Advisor a, Advisor b) throws AopConfigException; 18 19boolean isFrozen();
1fun getAdvisors(): Array<Advisor> 2 3@Throws(AopConfigException::class) 4fun addAdvice(advice: Advice) 5 6@Throws(AopConfigException::class) 7fun addAdvice(pos: Int, advice: Advice) 8 9@Throws(AopConfigException::class) 10fun addAdvisor(advisor: Advisor) 11 12@Throws(AopConfigException::class) 13fun addAdvisor(pos: Int, advisor: Advisor) 14 15fun indexOf(advisor: Advisor): Int 16 17@Throws(AopConfigException::class) 18fun removeAdvisor(advisor: Advisor): Boolean 19 20@Throws(AopConfigException::class) 21fun removeAdvisor(index: Int) 22 23@Throws(AopConfigException::class) 24fun replaceAdvisor(a: Advisor, b: Advisor): Boolean 25 26fun isFrozen(): Boolean
getAdvisors() 메서드는 팩토리에 추가된 모든 advisor, interceptor 또는 기타 advice 타입에 대해 Advisor를 반환합니다. Advisor를 추가한 경우, 이 인덱스에서 반환되는 advisor는 여러분이 추가한 객체입니다. interceptor나 다른 advice 타입을 추가한 경우, Spring은 이것을 항상 true를 반환하는 포인트컷을 가진 advisor로 래핑합니다.
따라서 MethodInterceptor를 추가했다면, 이 인덱스에 대해 반환되는 advisor는 여러분의 MethodInterceptor와 모든 클래스 및 메서드에 매칭되는 포인트컷을 반환하는 DefaultPointcutAdvisor입니다.
addAdvisor() 메서드는 어떤 Advisor든 추가하는 데 사용할 수 있습니다. 보통, 포인트컷과 advice를 보유하는 advisor는 일반적인 DefaultPointcutAdvisor이며, 어떤 advice나 포인트컷과도 함께 사용할 수 있습니다 (introduction에는 사용할 수 없음).
기본적으로, proxy가 한 번 생성된 이후에도 advisor나 interceptor를 추가하거나 제거하는 것이 가능합니다. 유일한 제한은 introduction advisor를 추가하거나 제거하는 것은 불가능하다는 점입니다. 팩토리로부터 생성된 기존 proxy는 인터페이스 변경을 보여주지 않기 때문입니다. (이 문제를 피하려면 팩토리로부터 새로운 proxy를 얻을 수 있습니다.)
다음 예제는 AOP proxy를 Advised 인터페이스로 캐스팅하고 그 advice를 검사하고 조작하는 방법을 보여줍니다:
1Advised advised = (Advised) myObject; 2Advisor[] advisors = advised.getAdvisors(); 3int oldAdvisorCount = advisors.length; 4System.out.println(oldAdvisorCount + " advisors"); 5 6// Add an advice like an interceptor without a pointcut 7// Will match all proxied methods 8// Can use for interceptors, before, after returning or throws advice 9advised.addAdvice(new DebugInterceptor()); 10 11// Add selective advice using a pointcut 12advised.addAdvisor(new DefaultPointcutAdvisor(mySpecialPointcut, myAdvice)); 13 14assertEquals("Added two advisors", oldAdvisorCount + 2, advised.getAdvisors().length);
1val advised = myObject as Advised 2val advisors = advised.advisors 3val oldAdvisorCount = advisors.size 4println("$oldAdvisorCount advisors") 5 6// Add an advice like an interceptor without a pointcut 7// Will match all proxied methods 8// Can use for interceptors, before, after returning or throws advice 9advised.addAdvice(DebugInterceptor()) 10 11// Add selective advice using a pointcut 12advised.addAdvisor(DefaultPointcutAdvisor(mySpecialPointcut, myAdvice)) 13 14assertEquals("Added two advisors", oldAdvisorCount + 2, advised.advisors.size)
운영 환경에서 비즈니스 객체의 advice를 수정하는 것이 과연 바람직한지(말장난 의도 아님)는 의문이지만, 의심의 여지 없이 정당한 사용 사례들이 있습니다. 그러나 개발 환경에서는 (예를 들어, 테스트에서) 매우 유용할 수 있습니다. 우리는 때때로 interceptor나 다른 advice의 형태로 테스트 코드를 추가하여, 우리가 테스트하고자 하는 메서드 호출 내부로 들어갈 수 있는 기능이 매우 유용하다는 것을 발견했습니다. (예를 들어, advice는 그 메서드를 위해 생성된 트랜잭션 내부로 들어가서, 트랜잭션을 롤백하도록 표시하기 전에 데이터베이스가 올바르게 업데이트되었는지 확인하기 위해 SQL을 실행할 수 있습니다.)
proxy를 어떻게 생성했는지에 따라, 보통 frozen 플래그를 설정할 수 있습니다. 이 경우, Advised isFrozen() 메서드는 true를 반환하고, 추가 또는 제거를 통한 advice 수정 시도는 AopConfigException을 발생시킵니다. advised 객체의 상태를 고정(freeze)하는 기능은 어떤 경우에는 유용합니다 (예를 들어, 호출 코드가 시큐리티 interceptor를 제거하지 못하도록 방지하기 위해).
Creating AOP Proxies Programmatically with the ProxyFactory
Using the "auto-proxy" facility