2

我希望使用 AOP 登录我们的项目。我面临的问题是,如果一个类的方法在其中调用同一类的另一个方法,那么由于代理的做事方式,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();
}

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

4

1 回答 1

0

经过一天进入这个问题,解决方案很奇怪。我做了一步调试,结果如下:

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

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

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

因此,一旦我更新了 maven 项目,.class 文件就会以某种方式恢复到它没有与方面代码交织的状态。刷新项目而不是更新 maven 项目解决了我的问题,但我无法理解其原因。

于 2015-06-30T05:27:07.953 回答