为什么AspectJ在包范围方法上编织不起作用?

时间:2015-03-04 04:49:42

标签: java spring aop aspectj spring-aop

我正在尝试在我的基于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 /主/ web应用/ 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.
  }
}

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

1 个答案:

答案 0 :(得分:1)

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

  • Spring AOP是一个基于代理的&#34; AOP lite&#34;通过@EnableAspectJAutoProxy激活的方法。它仅适用于Spring组件的公共非静态方法。
  • AspectJ,一个完整的AOP框架,也适用于包本地或私有方法,无论它们是否是Spring组件,都是从Spring内部通过@EnableLoadTimeWeaving和编织代理通过{{ 1}}。在这种情况下,您的方面也不需要是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