Мой аспект выглядит так:
Код: Выделить всё
@Aspect
@Component
public class HandlerLoggingAspect {
private static final Logger log = LoggerFactory.getLogger(HandlerLoggingAspect.class);
public HandlerLoggingAspect() {
log.info("Initialising HandlerLoggingAspect");
}
@Around("execution (* io.netty.handler.codec.ByteToMessageDecoder+.decode(*,*,*)) && args(ctx,byteBuf,outList)")
public void interceptByteDecoding(ProceedingJoinPoint joinPoint, ChannelHandlerContext ctx, ByteBuf byteBuf, List outList) throws Throwable {
setupMdcAroundJoinPoint(joinPoint, ctx);
}
//... rest of the code ...
}
Код: Выделить всё
2016-09-25 18:36:26.041 [main] DEBUG Running with Spring Boot v1.4.0.RELEASE, Spring v4.3.2.RELEASE
2016-09-25 18:36:26.041 [main] INFO No active profile set, falling back to default profiles: default
2016-09-25 18:36:29.891 [main] INFO Initialising HandlerLoggingAspect
2016-09-25 18:36:29.892 [main] INFO Initialising HandlerLoggingAspect
Мой основной класс выглядит так:
Код: Выделить всё
@ComponentScan
@Configuration
@EnableAutoConfiguration
@EnableAspectJAutoProxy
@SpringBootApplication
public class Launcher implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(Launcher.class);
public static void main(String[] args) {
SpringApplication.run(Launcher.class, args);
}
@Override
public void run(String... strings) throws Exception {
//... logic performed by the class ...
}
}
Код: Выделить всё
UTF-8
1.8
3.5.1
1.8
1.8.9
1.4.0.RELEASE
...
org.apache.maven.plugins
maven-compiler-plugin
${maven-compiler-plugin.version}
${java.version}
${java.version}
none
org.codehaus.mojo
aspectj-maven-plugin
${aspectj-maven-plugin.version}
${java.version}
${java.version}
${java.version}
true
${project.build.directory}/classes
compile
test-compile
org.aspectj
aspectjtools
${org.aspectj.version}
В чем может быть причина такой двойной инициализации?
** ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ **
Похоже, что в документации Spring , что-то упоминается о двойной инициализации аспектов.
http://docs.spring.io/spring-framework/ ... p-proxying p>
Однако там написано следующее (я использую Spring 4.3.2):
Начиная с Spring 4.0, конструктор вашего прокси-объекта НЕ будет
вызываться дважды, поскольку экземпляр прокси-сервера CGLIB будет создан
через Objenesis. Только если ваша JVM не допускает обхода конструктора
, вы можете увидеть двойные вызовы и соответствующие записи журнала отладки
из-за поддержки Spring AOP.
Там также написано следующее, и поскольку я использую аннотацию @EnableAspectJAutoProxy, это тоже должно применяться, поэтому я знаю, что использую прокси-сервер CGLIB:
Для ясности: использование proxy-target-class="true" на
, < Элементы aop:aspectj-autoproxy/> или
заставят использовать прокси-серверы CGLIB для всех трех из них.
Я использую Java 1.8. Существует ли какая-либо известная несовместимость между комбинацией компонентов, которую я использую, которая препятствует обходу конструктора, упомянутому выше?
Подробнее здесь: https://stackoverflow.com/questions/396 ... pect-twice