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
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
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.
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.
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.