У меня есть следующий xml-config, который вместе с META-INF / aop.xml находится в упакованном jar-файле в большом веб-модуле (Maven):
<context:spring-configured />
<context:load-time-weaver/>
Ииспользуйте javaagent для включения аспектного-ткачества:
-javaagent:$HOME/.m2/repository/org/springframework/spring-instrument/5.1.4.RELEASE/spring-instrument-5.1.4.RELEASE.jar
Это должно, в соответствии с документами, включить AspectJ-ткачество, если на пути к классам найдено META-INF/aop.xml
.Однако в Spring-5 он не работает.
В Spring-4.x это работало нормально, но после обновления до 5.1.x «автоопределение» больше не работает, поэтому я должен указать aspectj-weaving="on"
<context:load-time-weaver aspectj-weaving="on"/>
Я прошел через процесс начальной загрузки и обнаружил, что этот вызов в LoadTimeWeaverBeanDefinitionParser.isAspectJWeavingEnabled
возвращает null
: parserContext.getReaderContext().getBeanClassLoader()
Тело метода выглядит так:
protected boolean isAspectJWeavingEnabled(String value, ParserContext parserContext) {
if ("on".equals(value)) {
return true;
}
else if ("off".equals(value)) {
return false;
}
else {
// Determine default...
ClassLoader cl = parserContext.getReaderContext().getBeanClassLoader();
return (cl != null && cl.getResource(AspectJWeavingEnabler.ASPECTJ_AOP_XML_RESOURCE) != null);
}
}
То есть cl
равно null
, поэтому методы возвращают false
, что фактически отключает AspectJ-ткачество.
В Spring-4.3.x этот метод выглядит следующим образом (обратите внимание, как вызов получаетClassLoader отличается от версии 5.1 выше):
protected boolean isAspectJWeavingEnabled(String value, ParserContext parserContext) {
if ("on".equals(value)) {
return true;
}
else if ("off".equals(value)) {
return false;
}
else {
// Determine default...
ClassLoader cl = parserContext.getReaderContext().getResourceLoader().getClassLoader();
return (cl.getResource(AspectJWeavingEnabler.ASPECTJ_AOP_XML_RESOURCE) != null);
}
}
Обратите внимание, что эта версия вызывает getResourceLoader().getClassLoader()
вместо getBeanClassLoader()
на ReaderContext
, что успешно.
Кто-нибудь знает, что происходит?Мне это кажется ошибкой.
У кого-нибудь есть такая работа с "режимом автоопределения"?
Спасибо.