Библиотека с автоконфигурацией Spring: spring.factories и что еще? - PullRequest
0 голосов
/ 18 июня 2020

Мы намерены разработать библиотеку с Компонентами Spring, которые должны быть во всех наших приложениях Spring, например, Beans, которые подключаются к нашим службам мониторинга, администрирования и контроля. Механизм «Автоконфигурация».

Для стартера я написал класс com.mycorp.project.basic.startup-notification.StartupNotificationPublisher.class, который после «ApplicationStartedEvent» отправляет сообщение через наш любимый брокер сообщений (который, например, должен быть файлом журнала), здороваясь в мир.

Экземпляр этого класса должен быть создан через класс конфигурации com.mycorp.project.basic.startup-notification.autoconfiguration.StartupNotificationAutoConfiguration.class

package com.mycorp.project.basic.startup-notification
// ... Imports
@RequiredArgsConstructor
public class StartupNotificationPublisher {
    private final String topic;

    private final Logger messagePublisher = LoggerFactory.getLogger(StartupNotificationPublisher.class);

    @EventListener
    public void onApplicationStartedEvent(ApplicationStartedEvent event) {
        messagePublisher.info("{}: Hello, Attention, I am here!", topic);
    }
}

package com.mycorp.project.basic.startup-notification.autoconfiguration
// ... Imports
@Configuration
public class StartupNotificationAutoConfiguration {

    @ConditionalOnMissingBean
    @Bean
    StartupNotificationPublisher startupNotificationPublisher()
    {
        return new StartupNotificationPublisher("helloTopic");
    }
}

Наконец, чтобы автоконфигурация работала, я поместил файл spring.factories в META-INF -папка банки ( да, она есть! ), содержащая:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.mycorp.project.basic.startup-notification.autoconfiguration.StartupNotificationAutoConfiguration

Я предполагал, что это заставит пружину творить чудеса c, найти этот файл, когда я добавляю зависимость, запускаю конфигурацию и создаю этот bean-компонент для публикации sh сообщения.

Однако этого не происходит. Только когда я добавлю пакет в путь сканирования моего @SpringBootApplication, я получу свое сообщение.

Что я пропустил? Есть ли более конкретные c требования, такие как специальные структуры проекта? Нужна ли мне библиотека под названием spring-boot-starter или что-то в этом роде?

ProjectStructure:

rootDirectory
|-src
|  |-main
|    |-java
|    | |-com/mycorp/project/basic/startup-notification
|    |                            |-autoconfiguration
|    |                            | |-StartupNotificationAutoConfiguration.java
|    |                            |-StartupNotificationPublisher.java
|    |-resources
|      |-META-INF
|        |-spring.factories
|-build.gradle
|-...etc...

Результирующая структура Jar:

.jar
|-META-INF
| |-spring.factories
|-com
  |-mycorp
    |-project
      |-basic
        |-startup-notification
          |-autoconfiguration
          | |-StartupNotificationAutoConfiguration.class
          |-StartupNotificationPublisher.class

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Spring Factories, если они настроены правильно, не имеют никакого отношения к сканированию компонентов.

Я могу подтвердить, что вы все сделали правильно, одна и та же конфигурация работала для моих проектов много раз. Итак, чтобы отслеживать, что происходит:

  1. Убедитесь, что с учетом модуля «ab c» вы помещаете файл spring.factories в:

abc/src/main/resources/META-INF/spring.factories

Убедитесь, что jar библиотеки действительно содержит этот файл и действительно находится в артефакте (вашем приложении для загрузки Spring). Для этого откройте приложение с помощью WinRar (или аналогичного инструмента) и введите BOOT-INF/lib - банка должна быть там - откройте банку и убедитесь, что папка META-INF/spring.factories там. Если здесь что-то не так, проверьте зависимости в pom.xml, модуль автоконфигурации должен быть определен как зависимость вашего приложения загрузки Spring.

Убедитесь, что конфигурация действительно загружается (что, в свою очередь, означает, что модуль autoconfig распознан):

Перепишите конфигурацию следующим образом :

@Configuration
public class StartupNotificationAutoConfiguration {

    public StartupNotificationAutoConfiguration() {
          System.out.println("Loading the configuration StartupNotificationAutoConfiguration"); // or use logging framework
    }

   @ConditionalOnMissingBean
   @Bean
   StartupNotificationPublisher startupNotificationPublisher()
   {
    return new StartupNotificationPublisher("helloTopic");
   }
}

Если вы видите это сообщение, значит модуль автоконфигурации присутствует и загружается пружиной.

Попробуйте удалить аннотацию @ConditionalOnMissingBean. Если bean-компонент определен в вашем приложении, он в любом случае будет иметь приоритет над bean-компонентами, определенными в модулях автоконфигурации. Это также может быть источником вашей проблемы.
0 голосов
/ 18 июня 2020
@RequiredArgsConstructor
public class StartupNotificationPublisher {
private final String topic;

private final Logger messagePublisher = LoggerFactory.getLogger(StartupNotificationPublisher.class);

@PostConstruct
public void postConstruct() {
    messagePublisher.info("publisher constructed");
}


@EventListener
public void onApplicationStartedEvent(ApplicationStartedEvent event) {

    messagePublisher.info("{}: Hello, Attention, I am here!", topic);
}}
...