当前位置: 首页 > 知识库问答 >
问题:

AspectJ Spring Boot未编织aop中包含的类。xml

祝灼光
2023-03-14

我在使用LoadTimeWiven策略将AspectJ与SpringBoot集成时遇到了很多问题(因为SpringAOP不适合我的情况)。

我配置了以下许多指南AspectJ。以下是我在与pom AspectJ相关的

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>${ascpectj.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-instrument</artifactId>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>${ascpectj.version}</version>
    </dependency>

这是我的aop。xml

<aspectj>


    <weaver options="-showWeaveInfo -debug -Xlintfile:pathToAResource -verbose">
        <include within="foo.*"/>
    </weaver>


    <aspects>
        <aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
        <aspect name="org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect"/>
        <aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect"/>
        <aspect name="org.springframework.cache.aspectj.AnnotationCacheAspect"/>
        <aspect name="it.poste.energy.aspects.TaskAspect"/>
    </aspects>

</aspectj>

我确信它在项目结构中的位置是正确的,因为它实际上是在读取weaver标记中传递的选项(我知道xlintoption显然不正确,但我认为现在它并不重要)java

我在基本配置类上配置了自定义LoadTimeWeaver,如下所示:

@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class CustomLoadTimeWeaverConfig implements LoadTimeWeavingConfigurer {

    @Override
    @NonNull
    public LoadTimeWeaver getLoadTimeWeaver() {
        return new TomcatLoadTimeWeaver();
    }

    @Bean
    public InstrumentationLoadTimeWeaver loadTimeWeaver()  throws Throwable {
        return new InstrumentationLoadTimeWeaver();
    }

}

然后,我启动Spring应用程序,传递以下2个用于java代理的vm参数-javaagent: C:\用户\foo-user. m2\repository\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar-javaagent: C:\用户\foo-user. m2\repository\org\springFramework\spring-Instrt-5.2.10。RELEASE\spring-Instrt-5.2.10。RELEASE. jar

(我尝试删除Spring仪器的地方建议和EnableLoadTimeWeave注释,但没有改变)

该应用程序启动良好,但它并没有在aop中编织一个包含包的类。xml。这是weaver调试日志的一个示例

    [URLClassLoader@1efee8e7] debug not weaving 'foo.energy.domain.client.crmu.Foo1'
    [URLClassLoader@1efee8e7] debug not weaving 'foo.energy.domain.client.crmu.Foo2'
    [URLClassLoader@1efee8e7] debug not weaving 'foo.energy.domain.client.Foo3'
    [URLClassLoader@1efee8e7] debug not weaving 'fooo.energy.domain.client.Foo4'

让我感到困扰的是,它正确地注册了所有方面,因此:

[InspectionClassLoader@3db65c0d] info AspectJ Weaver Version 1.9.6 built on Tuesday Jul 21, 2020 at 13:30:08 PDT
[InspectionClassLoader@3db65c0d] info register classloader org.springframework.data.jpa.repository.config.InspectionClassLoader@3db65c0d
[InspectionClassLoader@3db65c0d] info using configuration /C:/Work/Workspaces/foo-project/target/classes/META-INF/aop.xml
[InspectionClassLoader@3db65c0d] info using configuration file:/C:/Users/foo-user/.m2/repository/org/springframework/spring-aspects/5.2.10.RELEASE/spring-aspects-5.2.10.RELEASE.jar!/META-INF/aop.xml
[InspectionClassLoader@3db65c0d] warning Cannot access resource for -Xlintfile:pathToAResource
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.transaction.aspectj.AnnotationTransactionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.cache.aspectj.AnnotationCacheAspect
[InspectionClassLoader@3db65c0d] info register aspect foo.energy.aspects.TaskAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.transaction.aspectj.AnnotationTransactionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.transaction.aspectj.JtaAnnotationTransactionAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.cache.aspectj.AnnotationCacheAspect
[InspectionClassLoader@3db65c0d] info register aspect org.springframework.cache.aspectj.JCacheCacheAspect
[InspectionClassLoader@3db65c0d] info deactivating aspect 'org.springframework.cache.aspectj.JCacheCacheAspect' as it requires type 'org.springframework.cache.jcache.interceptor.JCacheAspectSupport' which cannot be found on the classpath
[InspectionClassLoader@3db65c0d] info deactivating aspect 'org.springframework.cache.aspectj.JCacheCacheAspect' as it requires type 'javax.cache.annotation.CacheResult' which cannot be found on the classpath

问题是这些最后一行日志(方面的注册)被调用了3/4次,我不知道它是否异常或什么

我错过什么了吗?

SN:我正在使用Spring Boot v2.3.5。RELEASE,Spring v5.2.10。对于aspectjrt和aspectjweaver,RELEASE和tomcat 9.0.39和1.9.6

共有1个答案

饶曦之
2023-03-14

请注意,foo.*仅直接匹配foo包中的类,而不是子包中的类。为此,您需要foo...*。因此,您应该替换

<include within="foo.*"/>

通过

<include within="foo..*"/>

我想知道为什么这么多指南使用com.*来编织子包。

我称这种现象为“复制”

 类似资料:
  • 但我的问题是,如果它不使用AspectJ进行编织,那么Spring AOP是否有自己的编织,它是在加载时还是编译时执行? 我的Spring配置XML文件的相关部分是:

  • 如果我使用的是基于AspectJ的Spring AOP,那么我是否需要配置我的方面来使用加载时间编织?或者Spring AOP在使用基于AspectJ的方法时也支持运行时/编译时编织吗?

  • 我需要创建Gradle任务,它可以在Gradle构建之前替换.java文件。分级在.war文件中构建包应用程序。我需要在构建后替换字节码。我试过sourceSets Gradle任务,但它只能排除文件。 但我需要在同一地方也包括文件。我怎么能和Gradle在一起?

  • 这意味着我们正在使用编译时编织。 哪一个优先?使用的是编译时编织,还是代理?

  • 我想请你帮忙。我有两张桌子。在表1中,我有client_num和personal data。我想把tab1和tab2连接起来,其中也有client_nums,但一个客户机号可以在更多行上。本表2的第二列是以数字1-5写成的产品。 表1 CLIENT_NUM;性别 表2 CLIENT_NUM;产品 现在我只想要那些没有4号产品的客户 你能帮我一下吗?谢谢

  • 阅读文档(链接)时,我很难理解这些段落(可能也是因为英语不是我的母语)。 首先,我读 此外,在某些环境中,这种支持允许加载时编织,而不需要对应用程序服务器的启动脚本进行任何修改,以添加或(如我们在本节后面所述)(以前命名为)。 而且 哪些档案?类和文件? 然后,在同一子章中描述一个例子时,他们说 我们还有最后一件事要做。本节的介绍确实说过,可以在Spring的每个基础上有选择地打开LTW,这是事实