Spring AOP-зачем мне нужен aspectjweaver?
Я написал очень простой аспект с Spring AOP. Это работает, но у меня есть некоторые проблемы с пониманием того, что происходит на самом деле. Я не понимаю, почему я должен добавить aspectjweaver.банку? В документации Spring-AOP четко указано, что мне не нужен компилятор aspectj или Ткач, пока я просто использую Spring-AOP:
среда выполнения AOP по-прежнему является чистой весной 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
5 ответов
реализация Spring AOP я думаю, что повторно использует некоторые классы из aspectj-weaver. Он по - прежнему использует динамические прокси-серверы-не делает модификацию байтового кода.
следующее комментарий из весеннего форума может уточнить.
Spring не использует AspectJ weaver в этом случае. Это просто повторное использование некоторых классов из aspectjweaver.сосуд.
-Ramnivas
недавно у меня был аналогичный вопрос почему spring выдает ошибку aspectj, если она не зависит от aspectj?
чтобы использовать Spring AoP без зависимости AspectJ, это должно быть сделано в xml. Аннотации являются частью AspectJ.
кроме того, действительно классный язык выражений поддерживается только AspectJ. Таким образом, вы должны определить явные точечные разрезы. См. Раздел 6.3.2. Объявления точек: http://static.springsource.org/spring/docs/2.0.x/reference/aop.html раздел
У меня все еще есть проблемы с поиском какой-либо подробной документации по этой технике.
вы используете AspectJ стиль pointcut-expression @Aspect
и @Before
являются частью AspectJ. Проверка этой ссылке.
о AspectJ-weaver
, его на самом деле байт-код Ткач, который плетет аспекты в классы во время загрузки.
вы можете просмотреть веб-сайт spring и найти ответ на страницедокументы.весна.io
поддержка @AspectJ может быть включена с конфигурацией стиля XML или Java. В любом случае вам также нужно будет убедиться, что AspectJ aspectjweaver.jar библиотеки в classpath вашего приложения (версия 1.6.8 или позже). Эта библиотека доступна в каталоге " lib " дистрибутива AspectJ или через центральный репозиторий Maven.
вам нужны зависимости aspectjtools или aspectjweaver при использовании языка выражения AspectJ pointcut.
пожалуйста, смотрите следующие классы:
Фу.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:весна-контексте.Джар в моем classpath. Теперь вместо 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();
}
}
опять же, если у меня есть только весна-контексте.jar в моем classpath, я получу:
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 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;
вам понадобится aspectjtools зависимость в пути к классам во время выполнения, поэтому AspectJExpressionPointcut может загружать необходимые классы.