Почему Spring инициализирует мой аспект дважды?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему Spring инициализирует мой аспект дважды?

Сообщение Anonymous »

У меня есть простой аспект, который реализует некоторую логику вокруг одного метода. Я использую Spring Boot с AspjectJ. По какой-то причине конструктор аспекта вызывается дважды.

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

Код: Выделить всё

@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 ...
}
Аспект отлично работает с теми методами, которые я от него ожидаю, но по какой-то причине Spring Boot инициализирует мой аспект дважды. Сообщение «Инициализация HandlerLoggingAspect» появляется дважды при запуске.

Код: Выделить всё

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
Если я удалю @Component из аспекта, он вообще не инициализируется.

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

Код: Выделить всё

@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 ...
}
}
Если это имеет значение, это моя конфигурация плагина в моем pom.xml для плетения времени компиляции AspectJ.

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»