Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 即使在为编译时编织添加aspectj maven插件之后,自调用AOP问题仍然存在_Spring_Maven_Aspectj_Aop_Aspectj Maven Plugin - Fatal编程技术网

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

Spring 即使在为编译时编织添加aspectj maven插件之后,自调用AOP问题仍然存在,spring,maven,aspectj,aop,aspectj-maven-plugin,Spring,Maven,Aspectj,Aop,Aspectj Maven Plugin,我希望使用AOP登录我们的项目。我所面临的问题是,如果一个类的一个方法正在调用它内部同一个类的另一个方法,那么AOP将无法处理该调用,因为它采用代理方式。为了解决这个问题,我尝试使用aspectj maven插件进行编译时编织。我的顶级项目pom如下所示: <dependencies> <dependency> <groupId>org.aspectj</groupId> <ar

我希望使用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>
<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>
目标文件具有如下处理方法:

process() {
internalMethod();
}

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

在解决此问题一天后,解决方案非常奇怪。我进行了逐步调试,结果如下:

  • 我在aspectj插件中将showWeaveInfo和verbose检查为true,在maven构建期间,我可以正确地看到在正确的连接点应用了该特性

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

  • 然后我单击Maven->updatemaven项目并再次检查字节码。现在编织的部分已经从.class文件中消失了


  • 因此,只要我完成了一个更新maven项目,.class文件就会以某种方式恢复到一种状态,在这种状态下,它不会与方面代码交织在一起。刷新项目而不是更新maven project解决了我的问题,但我无法理解其原因。

    能否提供一个简洁、最少、可复制的版本?Maven配置很有趣,但是实际的代码和Spring配置呢?它可能会帮助别人帮助你。:-)@我对kriegaex进行了编辑,并做了一些相关修改。我只想做编译时编织。为了让AspectJ编译器“看到”您的方面,它们或者需要与您想要将它们编织到的代码位于同一个Maven模块中,或者您需要配置AspectJ Maven插件,以便在另一个模块中找到它们作为编织依赖项,因为Codehaus已经关闭了它的大门,目前正在迁移到Mojohaus,那里仍然没有插件文档页面,但我发现了一个。
    @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();
    }