【问题标题】:Java + Spring + Maven - AspectJ implementation instead of SpringAOPJava + Spring + Maven - AspectJ 实现而不是 SpringAOP
【发布时间】:2014-10-28 17:53:05
【问题描述】:

Java + Spring + Maven 应用:

有人可以向我提供链接或就没有基于代理的 Spring AOP 的纯 AspectJ 实现向我提供建议吗?

我的应用程序完全基于 Spring + Maven。我目前已经使用 Spring AOP 实现了方面,但没有解决我的问题。

如果我尝试在同一 class A 中从 public method1() 访问 private method2(),则不支持此操作。

我想知道: 1)如何编写一个切入点的aspectj,支持类内方法调用? 2) 如何使用 AspectJ 加载时编织将其配置到我当前的 Spring、maven 项目中? 3) 如何在Tomcat服务器+eclipse中配置AspectJ Maven Plugin进行编译时编织。

@Controller
class A {
    public void method1() {
        method2("foo");
    }

    private String method2(String text) {
        return text;
    }
}

预期输出:

log.entering(method1)
log.entering(method2)
print abc
log.exiting(method2)
log.exiting(method1)

【问题讨论】:

  • 不清楚什么不起作用。为您的问题添加更多详细信息(例如方面)。
  • 我已经编辑了这个问题,使它有点容易理解。很明显,Spring AOP 不适用于类内方法调用,无论目标方法是公共的还是私有的,因为它们不是通过动态代理进行路由的。到目前为止,如此真实。原生 AspectJ 也确实可以解决您的问题。但是你想知道什么?如何用切入点和建议编写切面?或者如何配置 Spring 以使用 AspectJ 加载时编织?或者如何为编译时编织配置 AspectJ Maven 插件?请更新问题。
  • 我想知道: 1)如何编写一个支持类内方法调用的切入点的aspectj? 2) 如何使用 AspectJ 加载时编织将其配置到我当前的 Spring、maven 项目中? 3)Tomcat服务器+eclipse中如何配置AspectJ Maven Plugin进行编译时编织。

标签: java spring maven aspectj aspectj-maven-plugin


【解决方案1】:

我对您的建议是使用 Spring Roo 创建一个虚拟项目(这样您就可以看到 Maven pom.xml 和 Spring applicationContext.xml 文件的外观)并下载正确设置了 AspectJ 的 Spring STS 版本的 Eclipse。

【讨论】:

    【解决方案2】:

    您可以通过右键单击 - 配置 - 转换为 AspectJ 项目将 Maven 项目转换为 AspectJ 项目来同时使用 Maven 和 AspectJ 项目。从那里您可以创建没有注释的 Aspect 类或使用注释的 Aspect 的 Java 类。

    至于你想要的结果,你可以使用下面的Around方法:

        @Around("execution ( * A.method1(..))")
        public void captureMethodOne(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("log.entering(method1)");
        joinPoint.proceed();
        System.out.println("log.exiting(method1)");
        }
    

    另外别忘了在pom.xml中输入aspectj和aspectj maven插件,比如

    <properties>
        <maven.compiler.plugin.version>3.5.1</maven.compiler.plugin.version>
    </properties>
    
    <dependencies>
    
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.7</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.8</version>
        </dependency>
    </dependencies>
    
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.8</version>
                <configuration>
                    <complianceLevel>1.8</complianceLevel>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin.version}</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
    
        </plugins>
    </build>
    

    希望对您有所帮助。 PS 首先检查 AspectJ 教程,互联网上有很多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 2012-10-23
      • 1970-01-01
      相关资源
      最近更新 更多