【问题标题】:Why AspectJ weaving on package scoped methods not working?为什么 AspectJ 在包作用域方法上编织不起作用?
【发布时间】:2015-03-04 04:49:42
【问题描述】:

我正在尝试在基于 Spring 的应用程序中打印私有和包作用域方法(来自包作用域类)的日志。由于 Spring 的基于代理的方面不适用于私有和包范围的方法(?),我尝试按照文档使用 AspectJ 加载时间编织。详情如下:

LoggingAspect

@Component(Constants.LOGGING_ASPECT_BEAN)
@Aspect
public class LoggingAspect {
  @Around("@annotation(my.pkg.Loggable)")
  public Object doLogging(final ProceedingJoinPoint joinPoint) throws Throwable {
    // ... logging code.
  }
}

弹簧配置

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Import(AnotherBaseConfig.class)
@ComponentScan("my.pkg")
@EnableWebMvc
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.AUTODETECT)
public class AppConfiguration extends WebMvcConfigurerAdapter {
  // ... bean configs
}

src/main/webapp/META-INF/aop.xml

<aspectj>
  <weaver>
    <include within="my.pkg.*">
  </weaver>
  <aspects>
    <aspect name="my.logger.LoggingAspect"/>
  </aspects>
</aspectj>

JVM 配置

-javaagent:"/path/to/spring-instrument-4.0.6.jar" -javaagent:"/path/to/aspectjweaver-1.8.1.jar"

通过上述配置,我的包范围类为:

@Component("someClass")
class SomeClass {
  @Loggable
  void doSomething(@Loggable final String s, @Loggable final Integer i) {
    // ... do something here.
  }
}

编织不适用于此类包范围类。我做错了什么吗?

【问题讨论】:

  • 春季团队的任何人都可以在这里帮助我吗?

标签: java spring aop aspectj spring-aop


【解决方案1】:

您在这里混合了两种 AOP 样式:

  • Spring AOP 是一种基于代理的“AOP lite”方法,通过@EnableAspectJAutoProxy 激活。它仅适用于 Spring 组件的公共、非静态方法。
  • AspectJ,一个成熟的 AOP 框架,也适用于包本地或私有方法,无论它们是否是 Spring 组件,通过 @EnableLoadTimeWeaving 在 Spring 中启用,通过 -javaagent:"/path/to/aspectjweaver-1.8.1.jar" 启用编织代理。在这种情况下,您的方面也不需要是 Spring 组件。 P.S.:我建议使用最新的 AspectJ 版本 1.8.5,而不是 1.8.1。

当您想使用 package-locals 时,您需要 AspectJ LTW。请明确配置 Spring 优先于一种 AOP 类型。更多信息可以在Spring Manual, chapter 9 中找到。 AspectJ LTW 配置的具体信息在chapter 9.8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2013-01-22
    • 2018-08-06
    相关资源
    最近更新 更多