是否可以创建一个具有自动应用于客户端项目中的类的方面的JAR?

时间:2013-12-19 11:51:51

标签: java servlets aspectj spring-aop aspect

我希望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依赖来使方面工作吗?

可能很重要的事情很少:

  1. 我打算使用AspectJ(如有必要,可能是Spring AOP),
  2. 客户端可能是正常web.xml
  3. 的网络应用程序
  4. 客户端使用Maven构建
  5. 我希望客户端尽可能容易配置 - 在我最初的想法中,Maven依赖就足够了。
  6. “注释JAR”将包含一个网络片段,因此可以在那里声明一些自定义ServletContextListener ..
  7. 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

不,这是不可能的,因为必须在任何客户端类之前启动AspectJ。所有客户端类都应该通过一个特殊的增强类加载器加载,它将处理注释。

另一件事是Spring的AOP 。它在应用程序上下文启动期间编织bean,不需要特殊的类加载器。如果他使用spring,这对客户来说是最简单的方法。添加maven依赖项,然后在应用程序上下文中配置AOP。

There are four types of weaving:

  • 编译时编织是最简单的方法。当你有 应用程序的源代码,ajc将从源代码编译而来 生成编织类文件作为输出。编织者的调用是 ajc编译过程的组成部分。方面本身可以 是源或二进制形式。如果方面是必需的 受影响的类要编译,那么你必须在编译时编织。 例如,当他们将成员添加到班级时,需要方面 正在编译的其他类引用添加的成员。
  • 使用编译后编织(有时也称为二元编织) 编织现有的类文件和JAR文件。和编译时一样 编织时,用于编织的方面可以是源或二进制 形式,并且可以自己编织方面。
  • 加载时间编织(LTW)简单地是二元编织,直到 指出类加载器加载一个类文件并将类定义为 JVM。为了支持这一点,还有一个或多个“编织类装载机” 由运行时环境明确提供或通过 “编织剂”是必需的。
  • 运行时编织,这就是Spring正在做的事情。我们 将此定义为已经定义的类的编织。 到JVM

答案 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依赖项而起作用