即使在为编译时编织添加 aspectj maven 插件后,自调用 AOP 问题仍然存在

Self call AOP issue still persisting even after adding aspectj maven plugin for compile time weaving

我希望使用 AOP 登录我们的项目。我面临的问题是,如果 class 的方法在其中调用相同 class 的另一个方法,那么 AOP 将无法处理该调用,因为代理的处理方式。为了解决这个问题,我正在尝试使用 aspectj maven 插件进行编译时编织。我的顶级项目 pom 如下所示:

<dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.1</version>
        </dependency>
 </dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.7</version>
            <configuration>
                <complianceLevel>1.7</complianceLevel>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我有 6 个子项目,但我希望只在其中一个中进行基于 AOP 的登录。该项目的 pom 如下所示:

<dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.1.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.1</version>
    </dependency>

<build>
    <plugins>           
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
        </plugin>           
    </plugins>
</build>

我虽然这样可以解决问题,但它仍在执行基于代理的方法调用。还有什么需要做的?

编辑:Spring context.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd">

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!--  Allow proxys -->
<!-- <aop:aspectj-autoproxy />  -->

<context:component-scan base-package="com.relevant.package" ></context:component-scan>
   </beans:beans>

LoggingAspect.java

@Named
@Aspect
public class LoggingAspect {

@Before("execution(public * com.relevant.package.*.process(..))")
public void beforeProcessAdvice() {
    System.out.println("AOP");
    System.out.println("Before");

    }

@Before("execution(public * com.relevant.package.*.internalMethod(..))")
public void beforeProcessAdvice() {
    System.out.println("Internal");
    System.out.println("Method");

    }
}

目标文件的处理方法如下:

process() {
internalMethod();
}

因为我已经评论了自动代理部分,所以我说不要使用代理。但是,现在没有日志出现(无论是在调用 process 方法时还是在调用 internalMethod 时)。如果 autoproxy 打开,则会显示 process 方法的日志,但不会显示 internalMethod 的日志,这是可以理解的。

进入这个问题一天后,解决办法很奇怪。我进行了一步一步的调试,结果如下:

  1. 我在 aspectj 插件中检查了 showWeaveInfo 和 verbose 为 true,并且在 maven 构建期间我可以正确地看到在正确的连接点应用了方面。

  2. 然后我检查了编译后的.class文件,看编织是否确实完成了,令我惊讶的是.class被正确编织了。

  3. 然后点了Maven->Update maven projects,再次查看了字节码。现在编织部分已经从 .class 文件中消失了。

因此,一旦我更新了 maven 项目,.class 文件就会以某种方式恢复到未与方面代码交织在一起的状态。刷新项目而不是更新maven项目解决了我的问题,但我不明白这是为什么。