[SPRING] Spring AOP - 왜 aspectjweaver가 필요한가요?
SPRINGSpring AOP - 왜 aspectjweaver가 필요한가요?
나는 Spring AOP로 매우 간단한 Aspect를 작성했다. 그것은 작동하지만, 나는 정말로 무슨 일이 일어나고 있는지 이해하는데 약간의 문제가 있습니다. 내가 왜 aspectjweaver.jar를 추가해야하는지 이해하지 못합니까? Spring-AOP 문서는 분명히 Spring-AOP를 사용하는 한 aspectj 컴파일러 나 위버가 필요 없다고 분명하게 명시하고있다.
내 구성은 다음과 같습니다.
<aop:aspectj-autoproxy />
@Aspect
@Service
public class RemoteInvocationAspect {
@Before("execution(* at.test.mypackage.*.*(..))")
public void test() {
System.out.println("test");
}
...
또한 XML 구성을 시도했지만 아무 것도 변경하지 않았습니다. 어쩌면 그냥 놓을 수도 있지만 aspectj-weaver가 사용되는 이유를 정말로 알고 싶습니다. 내가 maven에 종속성을 추가하지 않으면 java.lang.ClassNotFoundException을 얻습니다 : org.aspectj.weaver.reflect.ReflectionWorld $ ReflectionWorldException
해결법
-
==============================
1.Spring AOP 구현 aspectj-weaver의 일부 클래스를 재사용한다고 생각한다. 여전히 동적 프록시를 사용합니다. 바이트 코드를 수정하지 않습니다.
Spring AOP 구현 aspectj-weaver의 일부 클래스를 재사용한다고 생각한다. 여전히 동적 프록시를 사용합니다. 바이트 코드를 수정하지 않습니다.
춘계 포럼의 다음 논평은 분명히 드러날 것이다.
-
==============================
2.AspectJ 스타일의 pointcut-expression @Aspect와 @Before는 AspectJ의 일부이다. 이 링크를 확인하십시오.
AspectJ 스타일의 pointcut-expression @Aspect와 @Before는 AspectJ의 일부이다. 이 링크를 확인하십시오.
AspectJ-weaver는로드 타임에 aspect를 클래스에 짜 넣는 바이트 코드 위버이다.
-
==============================
3.나는 최근에 aspectj에 의존하지 않는다면 스프링이 aspectj 오류를 던지는 이유는 무엇인가?
나는 최근에 aspectj에 의존하지 않는다면 스프링이 aspectj 오류를 던지는 이유는 무엇인가?
AspectJ 의존성없이 Spring AoP를 사용하려면 xml로 끝내야한다. 주석은 AspectJ의 일부이다.
또한, 정말 멋진 표현 언어는 AspectJ에서만 지원된다. 따라서 명시적인 포인트 컷을 정의해야합니다. 6.3.2 절을 보라. pointcut 선언하기 : http://static.springsource.org/spring/docs/2.0.x/reference/aop.html 섹션
이 기술에 대한 정교한 문서를 찾는 데 여전히 문제가 있습니다.
-
==============================
4.스프링 웹 사이트를 탐색하고 docs.spring.io 페이지에서 답변을 찾을 수 있습니다.
스프링 웹 사이트를 탐색하고 docs.spring.io 페이지에서 답변을 찾을 수 있습니다.
-
==============================
5.AspectJ pointcut 표현식 언어를 사용할 때는 aspectjtools 또는 aspectjweaver 의존성이 필요하다.
AspectJ pointcut 표현식 언어를 사용할 때는 aspectjtools 또는 aspectjweaver 의존성이 필요하다.
다음 수업을 참조하십시오 :
Foo.java
public interface Foo { void foo(); void baz(); }
FooImpl.java
public class FooImpl implements Foo { @Override public void foo() { System.out.println("Foo!"); } @Override public void baz() { System.out.println("Baz!"); } }
MethodBeforeAdviceBarImpl.java
import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; public class MethodBeforeAdviceBarImpl implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("Bar!"); } }
그리고 App.java 버전 -1을 참조하십시오.
import org.springframework.aop.MethodBeforeAdvice; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.NameMatchMethodPointcutAdvisor; public class App { public static void main(String[] args) { final MethodBeforeAdvice advice = new MethodBeforeAdviceBarImpl(); final NameMatchMethodPointcutAdvisor nameMatchMethodPointcutAdvisor = new NameMatchMethodPointcutAdvisor(); nameMatchMethodPointcutAdvisor.setMappedName("foo"); nameMatchMethodPointcutAdvisor.setAdvice(advice); final ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.addAdvisor(nameMatchMethodPointcutAdvisor); final Foo foo = new FooImpl(); proxyFactory.setTarget(foo); final Foo fooProxy = (Foo) proxyFactory.getProxy(); fooProxy.foo(); fooProxy.baz(); } }
이 예제를 실행 한 결과는 다음과 같습니다.
Bar! Foo! Baz!
org.springframework : spring-context.jar 만 필요합니다. 이제 NameMatchMethodPointcutAdvisor 대신 AspectJExpressionPointcutAdvisor를 사용할 수 있습니다.
import org.springframework.aop.MethodBeforeAdvice; import org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor; import org.springframework.aop.framework.ProxyFactory; public class App { public static void main(String[] args) { final MethodBeforeAdvice advice = new MethodBeforeAdviceBarImpl(); final AspectJExpressionPointcutAdvisor aspectJExpressionPointcutAdvisor = new AspectJExpressionPointcutAdvisor(); aspectJExpressionPointcutAdvisor.setAdvice(advice); aspectJExpressionPointcutAdvisor.setExpression("execution(void biz.tugay.spashe.Foo.foo())"); final ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.addAdvisor(aspectJExpressionPointcutAdvisor); final Foo foo = new FooImpl(); proxyFactory.setTarget(foo); final Foo fooProxy = (Foo) proxyFactory.getProxy(); fooProxy.foo(); fooProxy.baz(); } }
다시 말하지만, classpath에 spring-context.jar 만 있으면 다음과 같이 표시됩니다.
An exception occured while executing the Java class. null: InvocationTargetException: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
AspectJExpressionPointcutAdvisor 클래스를 조사하면 AbstractGenericPointcutAdvisor를 확장하고 AspectJExpressionPointcut의 인스턴스에 작업을 위임한다는 것을 알 수 있습니다. AspectJExpressionPointcut에는 다음과 같은 import 문이 있음을 알 수 있습니다.
import org.aspectj.weaver.patterns.NamePattern; import org.aspectj.weaver.reflect.ReflectionWorld.ReflectionWorldException; import org.aspectj.weaver.reflect.ShadowMatchImpl; import org.aspectj.weaver.tools.ContextBasedMatcher; import org.aspectj.weaver.tools.FuzzyBoolean; import org.aspectj.weaver.tools.JoinPointMatch; import org.aspectj.weaver.tools.MatchingContext; import org.aspectj.weaver.tools.PointcutDesignatorHandler; import org.aspectj.weaver.tools.PointcutExpression; import org.aspectj.weaver.tools.PointcutParameter; import org.aspectj.weaver.tools.PointcutParser; import org.aspectj.weaver.tools.PointcutPrimitive; import org.aspectj.weaver.tools.ShadowMatch;
AspectJExpressionPointcut은 필요한 클래스를로드 할 수 있도록 런타임시 클래스 경로에 aspectjtools 종속성이 필요합니다.
from https://stackoverflow.com/questions/11446893/spring-aop-why-do-i-need-aspectjweaver by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 주석을 사용하여 Spring Lookup Method Injection하는 방법? (0) | 2019.01.28 |
---|---|
[SPRING] Jackson의 @JsonView, @JsonFilter 및 Spring (0) | 2019.01.28 |
[SPRING] 봄 스케줄러가 예기치 않게 멈 춥니 다. (0) | 2019.01.28 |
[SPRING] 기존 스프링 애플리케이션을 스프링 부트로 마이그레이션하고, 스프링 부트를 수동으로 구성 하시겠습니까? (0) | 2019.01.28 |
[SPRING] Spring : 빌더 패턴을 사용하여 빈 작성하기 (0) | 2019.01.28 |