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 может загружать необходимые классы.