AspectJ 加载时间编织器无法检测到所有类
我在“aspectj”模式下使用Spring的声明性事务(@Transactional注释)。在大多数情况下,它的工作方式与它应该的完全一样,但对于一个人来说,它没有。我们可以称之为(因为这就是它的实际名称)。Lang
我已经能够将问题精确定位到加载时间编织器。通过在 aop.xml 中打开调试和详细日志记录,它会列出所有正在编织的类。有问题的类确实根本没有在日志中提及。Lang
然后我在 的顶部放了一个断点,导致 Eclipse 在加载类时挂起线程。此断点在 LTW 编织其他类时被命中!所以我猜它要么试图编织,但失败了,没有输出,要么其他一些类有一个引用,迫使它在实际有机会编织它之前加载它。Lang
Lang
Lang
Lang
但是,我不确定如何继续调试它,因为我无法以较小的规模重现它。关于如何继续的任何建议?
更新:其他线索也欢迎。例如,LTW实际上是如何工作的?似乎有很多魔术在发生。是否有任何选项可以从 LTW 获得更多的调试输出?我目前有:
<weaver options="-XnoInline -Xreweavable -verbose -debug -showWeaveInfo">
我忘了汤姆之前提到过:弹簧剂被用来允许LTW,即.InstrumentationLoadTimeWeaver
根据安迪·克莱门特(Andy Clement)的建议,我决定检查AspectJ变压器是否曾经通过过该课程。我在 中放置了一个断点,似乎该类甚至从未到达该方法,尽管它由与其他类相同的类加载器(Jetty 的 WebAppClassLoader 的实例)加载。ClassPreProcessorAgent.transform(..)
Lang
然后,我继续在 中放置了一个断点。甚至没有那个被击中.而且我认为应该为所有已装入的类调用该方法,无论它们使用什么类装入器。这开始看起来像这样:InstrumentationLoadTimeWeaver$FilteringClassFileTransformer.transform(..)
Lang
- 我的调试有问题。可能在 Eclipse 报告时未加载,它是
Lang
- Java 错误?牵强附会,但我想它确实发生了。
下一个线索:我打开了,它似乎过早地加载了 - 可能是在将变压器添加到仪器仪表之前。奇怪的是,我的 Eclipse 断点没有捕获此加载。-verbose:class
Lang
这意味着春天是新的嫌疑人。似乎有一些处理,加载类来检查它们。这可能与我的问题有关。ConfigurationClassPostProcessor
中的这些行会导致类被读取:ConfigurationClassBeanDefinitionReader
Lang
else if (metadata.isAnnotated(Component.class.getName()) ||
metadata.hasAnnotatedMethods(Bean.class.getName())) {
beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE);
return true;
}
特别是,调用类,该类加载该类中所有方法的所有参数类。我猜这可能不是问题的结束,因为我认为这些类应该被卸载。JVM 是否出于不可知的原因缓存类实例?metadata.hasAnnotatedMethods()
getDeclaredMethods()