【问题标题】:Spring AspectJ loadtimeweaving not invoked未调用 Spring AspectJ loadtimeweaving
【发布时间】:2017-07-22 10:01:35
【问题描述】:

Spring AspectJ 加载时间编织配置正在构建和加载服务器,没有任何错误,但方面没有被调用。

这里是配置列表 1) JDK 8 2) 服务器码头

@Configuration
@ComponentScan(basePackages = {..})
@EnableSpringConfigured
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
@PropertySource(...)
@ImportResource(value = { "classpath:META-INF/aop.xml", ..})
class config {
...
}

aop.xml

<aspectj>     
      <weaver options="-Xlint:ignore -Xset:weaveJavaPackages=true -Xset:weaveJavaxPackages=true">
        <include within="com.proj.*"/>
        <include within="java.*"/>
        <include within="javax.*"/>
        <include within="org.springframework.*"/>
        <include within="org.aspectj.*"/>
    </weaver>
    <aspects>
        <aspect name="com.proj.SampleAspect"/>
    </aspects>
</aspectj>

也尝试过使用 aop.xml 中的选项

options="-XnoInline -verbose -showWeaveInfo -debug -Xlint:ignore -Xset:weaveJavaPackages=true -Xset:weaveJavaxPackages=true"

方面

@Component
@Aspect
public class SampleAspect {
    @Autowired
    private RequestContextFilter interceptRequestContext;

    @Around("@annotation(ExecuteByContext)")
    public Object interceptByContext(final ProceedingJoinPoint pjp) throws Throwable {
        if(SampleUtil.applyForRequest(interceptRequestContext.getRequestContext()) {
            LOGGER.info(String.format("Intercept context for method %s", pjp.getSignature().getName()));
            return null;
        }
        return pjp.proceed();
    }
}

注释

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecuteByContext {

}

@Component
@Configurable
class TestClass implements ISomeInterface{

  ...
  @ExecuteByContext
  public void method() {
    ..
  }

  @ExecuteByContext
  private void method1() {
    ..
  }
}

Jetty 服务器以 MAVEN_OPTS 设置启动

-javaagent:/path_to/.m2/repository/org/springframework/spring-instrument/4.2.0.RELEASE/spring-instrument-4.2.0.RELEASE.jar

我的 maven 中有以下依赖项

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-instrument</artifactId>
</dependency>

SampleAspect 没有被调用。我有几个用 @ExecuteByContext 注释的方法(公共的、私有的和受保护的)。

【问题讨论】:

    标签: java spring aspectj spring-aop


    【解决方案1】:

    我终于通过以下更改解决了上面的问题

    当我启动我的码头服务器时,包括 -javaagent:/pathto/aspectjweaver-1.8.9.jar 确保编织发生。

    但我确实有几个方面具有@Autowired bean,我需要评估方面中的某些条件。返回 NullPointerException 的这些方面。原因是 spring 组件扫描发生并且类已经加载并且加载时间编织没有机会编织,因为类已经加载。

    为了在我添加的配置类中解决这个问题

    @Bean 
    public SampleAspect sampleAspect() {
        SampleAspect aspect = Aspects.aspectOf(SampleAspect.class);
        return aspect;
    }
    

    添加此代码解决了 NPE。

    这篇文章很有用——https://www.credera.com/blog/technology-insights/open-source-technology-insights/aspect-oriented-programming-in-spring-boot-part-3-setting-up-aspectj-load-time-weaving/

    并添加

    -verbose -showWeaveInfo -debug
    

    对 aop.xml 很有帮助

    我还尝试了编织类的转储,以查看是否编织了一个类。更多细节在这里——https://eclipse.org/aspectj/doc/released/pdguide/printable.html#ltwdump

    【讨论】:

      【解决方案2】:

      可能您的目标类不直接在包com.proj 中,而是在子包中。包含子包的语法是..*,而不仅仅是.*,即在你的aop.xml中你应该有

      <include within="com.proj..*"/>
      

      等等。

      【讨论】:

      • 我在 aop.xml 中更改了正则表达式,但在运行时方法调用期间没有调用 Aspect。
      • 您已激活-showWeaveInfo。那么你看到编织代理的任何输出了吗?如果您没有看到任何与 AspectJ 相关的输出,则表明存在配置错误。例如。你确定你 META-INF/aop.xml 真的可以被类加载器在那个名字下找到吗? P.S.:AspectJ 切入点语法不要和正则表达式混淆,两者有很大区别。
      • Aspect 正在注册,但编织没有发生。我一直认为包括 -javaagent:/path_to/spring-instrument-4.2.0.RELEASE.jar 就足够了。但是添加 -javaagent:/path_to/aspectjweaver-1.8.9.jar 修复了它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多