Время загрузки Spring Boot не работает во встроенном коте

Я не могу заставить LTW работать в Spring Boot 1.2.2 с Embedded Tomcat.

Мое приложение - это файл WAR, а не файл.JAR. Когда я запускаю в DEBUG, он никогда не останавливается в моем аспекте, даже когда я нажимаю на вызовы, которые должны соответствовать точечным вызовам, поэтому я считаю, что это не работает...

Мой скрипт запуска делает это:

-javaagent:path/to/spring-instrument-xxx.jar -javaagent:path/to/aspectjweaver-1.2.8.jar

В Spring Boot я загружаю этот AOP Config как ApplicationInitializer, так что он сразу находится в родительском ApplicationContext и должен быть там для всего остального контекста моего встроенного веб-приложения tomcat.

@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
@Configuration
public class AopConfig {
    private Log log = LogFactory.getLog(AopConfig.class);

    public AopConfig() {
        log.info("Creating AopConfig");
    }

    @Bean
    public LoadTimeWeaver loadTimeWeaver() {
        log.info("Creating InstrumentationLoadTimeWeaver");
        return new InstrumentationLoadTimeWeaver();
    }
}

Мой аспект выглядит так:

package my.aop.profiler.MethodTimerAspect;

@Aspect
public class MethodTimerAspect {
    private static final String DELIMITER = "|";
    private static final String PROFILER = "profiler";
    private static final String DATE_FORMAT = "h:mm:ss";
    private static final Log LOG = LogFactory.getLog(PROFILER);

    public MethodTimerAspect() {}

    @Pointcut("execution (* my.web.*Controller.*(..))")
    protected void controllers() {}

    @Pointcut("execution (* my.services..*Facade.*(..))")
    protected void services() {}

    @Pointcut("execution (* my.services..*Exchange.*(..))")
    protected void data() {}

    /**
     * If profiling is enabled with trace, it will log the amount of time
     * spent in the method
     *
     * @param joinPoint
     * @return Object
     * @throws Throwable
     */
    @Around("controllers() || services() || data()")
    public Object doProfiling(ProceedingJoinPoint joinPoint) throws Throwable {
        // (...)
    }
}

META-INF/aop.xml моей встроенной WAR это:

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <!-- only weave classes in our application-specific packages -->
        <include within="cdot.*"/>
    </weaver>
    <aspects>
        <!-- weave in just this aspect -->
        <aspect name="my.aop.profiler.MethodTimerAspect"/>
    </aspects>
</aspectj>

1 ответ

Две идеи:

  • Возможно, вы хотите изменить одно из ваших pointcut, чтобы также найти подпакеты (используйте .. синтаксис вместо .):

    @Pointcut("execution (* my.web..*Controller.*(..))")
    
  • То же самое относится к вашему aop.xml:

    <include within="cdot..*"/>
    

Я предполагаю что my.web был изменен вами сознательно и фактически читает cdot.something, потому что в противном случае pointcuts не будет совпадать.

Другие вопросы по тегам