Spring-5.1.4 не удается автоматически определить enableAspectJWeaving (находя META-INF / aop.xml) из-за того, что getBeanClassLoader () возвращает null, почему? - PullRequest
0 голосов
/ 30 января 2019

У меня есть следующий 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, что успешно.

Кто-нибудь знает, что происходит?Мне это кажется ошибкой.

У кого-нибудь есть такая работа с "режимом автоопределения"?

Спасибо.

...