Аспект Spring AOP не применяется, если он включен из внешней банки с другим именем пакета

У меня есть служба восстановления загрузки Spring, которая включала внешний проект в pom в качестве зависимости. Этот внешний проект представляет собой банку с кодом Spring AOP.

Базовый пакет в моем основном приложении, который включает эту внешнюю банку с кодом Spring AOP, - x.y.z

Класс во внешней банке, где находится совет @before, находится в пакете a.b.c С этим классом в пакете a.b.c он не распознается основным приложением, в котором я хочу использовать реализацию spring aop и применить аспект. Однако, когда я меняю его пакет с a.b.c на x.y.z (чего я действительно не могу сделать в реальной жизни), он работает нормально.

Я знаю, что в весенней загрузочной службе, которая является включающей службой, она сканирует все в корневом пакете, указанном в классе приложения, в данном случае x.y.z, и именно поэтому аспект работает нормально, если его класс находится в x.y.z.

однако проблема в том, что этот Spring app jar будет использоваться в нескольких приложениях. Так что изменить имя пакета подобным образом нельзя.

Есть ли способ сделать это, не меняя имя пакета класса, в котором находится код приложения Spring?

0
0
1 315
3

Ответы 3

Вероятно, сканирование компонентов по умолчанию активировано только для пакетов классов вашего приложения. Вы можете расширить его на несколько пакетов, включая пакет аспектов:

Конфигурация стиля XML:

<context:component-scan base-package = "x.y.z, a.b.c" />

Конфигурация стиля аннотации:

@ComponentScan(basePackages = {"x.y.z", "a.b.c"})

Отказ от ответственности: я не пользователь Spring, а только эксперт по AspectJ. Я просто знал, что вы можете настроить сканирование компонентов, погуглил за вас синтаксис и надеюсь, что он правильный.

Мне нужно воздержаться от этого решения, даже если оно сработает, потому что тогда приложениям, которые используют многоразовую банку, необходимо добавить сканирование компонентов для пакета в банке. Поражает всю цель многоразового использования

Hary 02.05.2018 16:59

Аспекты довольно навязчивы. Это скорее функция, чем ограничение, вы можете решить активировать или деактивировать их через конфигурацию. Пользователи должны решить поместить JAR в путь к классам, чтобы они также могли активировать сканирование компонентов, я думаю. Если это слишком много для вас, переключитесь на AspectJ с LTW (ткачество во время загрузки) или даже вплетите свой аспектный код в приложение с переплетением во время компиляции с использованием компилятора AspectJ.

kriegaex 02.05.2018 17:50

Еще одна мысль: библиотеки ведения журнала также можно использовать повторно, но они также не работают, если включающее приложение не предоставляет конфигурацию. Ваша библиотека по-прежнему будет многоразовой, но не настроена должным образом. Стоит ли переходить с однострочника на другой фреймворк АОП? Не поймите меня неправильно, я люблю AspectJ и никогда не использую Spring, поэтому я буду рад, если вы его тоже используете. Но с моим ответом у вас в значительной степени есть то, что вам нужно, с инструментом, который вы в настоящее время используете (Spring), и который встроен в него.

kriegaex 03.05.2018 03:46

То, что предлагает @kriegaex, правильно. Вдобавок убедитесь, что вы используете @Component вместе с @Aspect. Поскольку @Aspect не является аннотацией Spring, Spring не распознает ее, и, следовательно, ваш аспект не будет зарегистрирован. Таким образом, использование @Component обязательно для того, чтобы аспекты работали в среде Spring.

Это решение побеждает всю цель создания многоразовой банки, если каждое приложение, использующее банку, должно добавить сканирование компонентов для пакета в банке.

Hary 02.05.2018 17:00

Давайте рассмотрим анологию. Если бы вы написали 100 различных программ, демонстрирующих 100 вещей, которые можно сделать с помощью java.lang.String. вам придется импортировать java.lang.String 100 раз. Означает ли это, что написание класса String разрушает всю цель? @CompomentScan делает нечто подобное. Можно поместить все банки в путь к классам, но если Spring не знает о них, он не будет сканировать компоненты, которые присутствуют внутри.

Pranjal Gore 02.05.2018 17:28

Пожалуйста, определите bean-компонент (проекта jar) внутри основного приложения. Дайте @ComponentScan (basePackages = {"x.y.z", "a.b.c"}), а также @EnableAspectJAutoProxy. Также включите ниже фрагмент кода.

бывший:

 ` @Bean
  public  LoggingHandler loggingHandler()
  {
      return new LoggingHandler();
  }`

Также аннотируйте внешний код jar с помощью:

`@Aspect
@Component
public class LoggingHandler {`

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