Spring AOP-pourquoi ai-je besoin d'un coup de pouce?

j'ai écrit un Aspect très simple avec Spring AOP. Il fonctionne, mais j'ai quelques problèmes de compréhension de ce qui se passe vraiment. Je ne comprends pas pourquoi je dois ajouter l'aspectjweaver.pot? La documentation Spring-AOP indique clairement que je n'ai pas besoin de compilateur ou de tisserand aspectj tant que J'utilise simplement Spring-AOP:

l'exécution AOP est toujours pure printemps AOP cependant, et il n'y a pas de dépendance sur le compilateur ou le tisserand AspectJ.

ma configuration ressemble à ceci:

<aop:aspectj-autoproxy />

@Aspect
@Service
public class RemoteInvocationAspect {

    @Before("execution(* at.test.mypackage.*.*(..))")
    public void test() {
        System.out.println("test");
    }
    ...

j'ai aussi essayé la configuration XML, mais je n'ai rien changé. Peut-être que je pourrais laisser tomber, mais je voudrais vraiment comprendre pourquoi aspectj-weaver est utilisé? Si je n'ajoute pas la dépendance dans maven je reçois java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException

30
demandé sur Mario B 2012-07-12 11:24:29

5 réponses

mise en œuvre printemps AOP je pense réutilise certaines classes de l'aspectj-weaver. Il utilise toujours des mandataires dynamiques - ne fait pas de modification de code octet.

le suivant commentaire du forum de printemps pourrait clarifier.

Spring n'utilise pas le tisseur AspectJ dans ce cas. Il est tout simplement je réutilise les cours de l'inspecteur jweaver.pot.

- Ramnivas

26
répondu gkamal 2012-07-12 07:51:05

j'ai récemment eu une question similaire Pourquoi est-ce que spring lance une erreur d'aspectj si elle ne dépend pas d'aspectj?

pour utiliser Spring AOP sans dépendance AspectJ, il doit être fait en xml. Les annotations font partie d'AspectJ.

de plus, le langage d'expression vraiment cool n'est pris en charge que par AspectJ. Vous devez donc définir des découpages de points explicites. Voir La Section 6.3.2. Déclaration d'un pointcut: http://static.springsource.org/spring/docs/2.0.x/reference/aop.html de la section

j'ai encore du mal à trouver une documentation élaborée sur cette technique.

4
répondu beta-brad 2017-05-23 11:53:50

vous utilisez AspectJ style pointcut-expression @Aspect et @Before font partie de AspectJ. Cochez ce lien .

en ce qui concerne le AspectJ-weaver , c'est en fait un tisserand bytecode qui tisse des aspects dans les classes au moment de la charge .

3
répondu Santosh 2012-07-12 07:42:53

vous pouvez parcourir le site Web de spring et trouver la réponse sur la page de docs.le printemps.io

le support @AspectJ peut être activé avec une configuration XML ou Java. Dans les deux cas, vous aurez également besoin de s'assurer que aspectj's aspectjweaver.la bibliothèque jar est sur le chemin de classe de votre application (version 1.6.8 ou plus récente). Cette bibliothèque est disponible dans le répertoire' lib ' d'une distribution AspectJ ou via le dépôt central Maven.

0
répondu Richard Xue 2015-07-07 01:49:27

vous avez besoin des dépendances aspectjtools ou aspectjweaver lorsque vous utilisez le langage d'expression AspectJ pointtcut.

voir les classes suivantes:

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!");
    }
}

et s'il vous plaît voir App.java version-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();
    }
}

le résultat de l'exécution de cet exemple sera:

Bar!
Foo!
Baz!

j'ai seulement besoin de la org.springfram framework: spring-context.jar dans mon cours. Maintenant, au lieu d'un NameMatchMethodPointcutAdvisor, utilisons 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();
    }
}

encore une fois, si je n'ai que le contexte de printemps.dans mon bocal classpath, je reçois:

An exception occured while executing the Java class. null: InvocationTargetException: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException

lorsque vous étudiez la classe Aspectjexpression Pointcutadvisor , vous verrez qu'elle s'étend AbstractGenericPointcutAdvisor et qui délègue le travail à une instance de AspectJExpressionPointcut . Et vous pouvez voir Qu'AspectJExpressionPointcut a les déclarations d'importation suivantes:

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;

vous aurez besoin de la aspectjtools dépendance dans votre classpath dans l'exécution afin AspectJExpressionPointcut peut charger les classes dont il a besoin.

0
répondu Koray Tugay 2017-11-01 20:00:14