Весной Аннотации Импорт Конфиг не вызывается - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь создать приложение, которое использует аннотации Spring для импорта конфигураций.Для этого вопроса я сузил его до двух файлов.Класс запуска:

package core;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Slf4j
@Configuration
@Import(ConfigSettings.class)
public class Startup {
    public static void main (String args[]) {
    log.info("main class");
    }
}

и ядро ​​пакета ConfigSettings;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Slf4j
@Configuration
@ComponentScan({"connections", "filter"})
@PropertySource({"classpath:config/${env.config:dev}.application.properties"})
public class ConfigSettings {

    public ConfigSettings() {
    log.info("Constructor ConfigSettings");
    }
}

Я ожидал, что результат будет:

[INFO]Constructor ConfigSettings
[INFO]main class

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

Может кто-нибудь объяснить, что происходит не так?Заранее спасибо!

1 Ответ

2 голосов
/ 20 марта 2019

Лучше всего сделать так, чтобы класс конфигурации возвращал объект конфигурации, содержащий ваши значения.Обычно я не склонен добавлять всеобъемлющий объект конфигурации, но у меня есть файл конфигурации для каждого компонента (базы данных, контроллеров и т. Д.).

Затем можно вернуть настроенный объект в виде компонентаи пусть весна впрыснет это.Если бы мне пришлось создать файл конфигурации для RestTemplate (в качестве простого примера):

@Service
public class RestClientConfig {

    @Value("${your.config.value}")
    private String yourValue;


    private final RestTemplate restTemplate = new RestTemplate();

    @Bean
    public RestTemplate restTemplate() {
      // Configure it, using your imported values
      // ...

      return restTemplate;
   }
}

Однако метод main находится вне контейнера Spring, и вы не сможете его загрузитьтаким образом, но с помощью вышеуказанного метода вы можете вызывать настроенный компонент непосредственно там, где вам нужно его использовать.

...