我希望JAR的方面可以拦截所有方法调用,例如
@Aspect
public class CoolAspect {
@Pointcut("execution(public * *(..))")
public void anyPublicMethod() { }
@Before("anyPublicMethod()")
public void advice(JoinPoint point) {
System.out.println("sign:\t" + point.getSignature());
}
}
假设以上是我所拥有的方面并希望客户使用。我把它编译成JAR并提供给Maven。
现在客户端将此jar用作依赖项,例如
<dependency>
<groupId>cool-group</groupId>
<artifactId>cool-artifact</artifactId>
<version>1.0.0</version>
</dependency>
此工件(JAR)具有上述方面。
现在可以通过声明Maven依赖来使方面工作吗?
可能很重要的事情很少:
web.xml
等ServletContextListener
.. 有什么想法吗?
答案 0 :(得分:1)
不,这是不可能的,因为必须在任何客户端类之前启动AspectJ。所有客户端类都应该通过一个特殊的增强类加载器加载,它将处理注释。
另一件事是Spring的AOP 。它在应用程序上下文启动期间编织bean,不需要特殊的类加载器。如果他使用spring,这对客户来说是最简单的方法。添加maven依赖项,然后在应用程序上下文中配置AOP。
There are four types of weaving:
答案 1 :(得分:0)
如果您使用的是spring-boot,请找到一个简单的解决方案:
在罐子中,您可以将外观定义为组件:
package com.xxx.yy.zz.aspect;
@Aspect
@Component
public class CoolAspect {
// code like the question
}
然后,您需要在spring.factories
中创建文件/resources/META-INF/
。
启动时,Spring将扫描该文件。
文件spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xxx.yy.zz.aspect.CoolAspect
然后,将它们包装成罐子。
这将通过声明Maven依赖项而起作用