Я ни в коем случае не эксперт, но пока это выглядит многообещающе:
Настройка ткачества времени загрузки с файлами aop.xml
В частности:
<aspectj>
<aspects>
...
</aspects>
<weaver options="-verbose">
<!-- Weave types that are within the javax.* or org.aspectj.*
packages. Also weave all types in the foo package that do
not have the @NoWeave annotation. -->
<include within="javax.*"/>
<include within="org.aspectj.*"/>
<include within="(!@NoWeave foo.*) AND foo.*"/>
...
</weaver>
</aspectj>
Я не уверен, как это могло бы работать, учитывая ClassPreProcessor
, используемый агентом LTW (хотя я не пробовал это). Вот начало его preProcess
метода:
public byte[] preProcess(String className, byte[] bytes, ClassLoader loader, ProtectionDomain protectionDomain) {
if (loader == null || className == null || loader.getClass().getName().equals(deleLoader)) {
// skip boot loader, null classes (hibernate), or those from a reflection loader
return bytes;
}
...
try {
synchronized (loader) {
...
WeavingAdaptor weavingAdaptor = WeaverContainer.getWeaver(loader, weavingContext);
...
}
}
}
Что делает довольно ясным, как пропускаются классы загрузчика. Кроме того, вызов WeaverContainer.getWeaver()
- это то, что запускает обработку aop.xml
, и это происходит только после обработки класса с ненулевым загрузчиком.
Не уверен, насколько это помогает с фактическим решением, но, надеюсь, это проливает некоторый свет на то, почему вещи ведут себя так, как они ...