SpringBoot - Порядок создания Бина и инициализация PostConstruct - PullRequest
0 голосов
/ 05 июня 2018

У меня есть многорежимное веб-приложение SpringBoot от maven.У меня есть подмодуль, называемый config-module , который имеет класс конфигурации:

@Configuration
public class PropertiesConfig {

    @Bean
    public YamlPropertiesFactoryBean errorPropertiesFromYamlFile() {
        final YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        yaml.setResources(new ClassPathResource("errorMessages.yml"));
        return yaml;
    }

}

У меня есть web-app-module модуль maven, который имеетпредыдущий config-module как зависимость и как импортированное пружинное приложение.

В этом главном модуле у меня также есть класс конфигурации, который загружает новые свойства:

@Configuration
public class WebPropertiesConfig {

    @Bean
    public YamlPropertiesFactoryBean webPropertiesFromYamlFile() {
        final YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        yaml.setResources(new ClassPathResource("webProperties.yml"));
        return yaml;
    }

}

И в этом модуле у меня также есть такой класс:

@Component
@ConfigurationProperties(prefix = "webpart")
public class ConfigPropertiesMapper {

    @PostConstruct
    public void init() {
        //do something here
    }

}

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

  1. PropertiesConfig.errorPropertiesFromYamlFile() создание bean-компонента из конфигурационного модуля
  2. ConfigPropertiesMapper.init() инициализация PostConstruct из web-app-модуля
  3. WebPropertiesConfig.webPropertiesFromYamlFile() создание bean-компонента из web-app-module

Почему это так?И как я мог установить порядок в этом?:

  1. PropertiesConfig.errorPropertiesFromYamlFile()
  2. WebPropertiesConfig.webPropertiesFromYamlFile()
  3. ConfigPropertiesMapper.init()

Я попытался с аннотациями @Order, @Qualifier, @Primary, но не смог решить эту проблему.

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

1 Ответ

0 голосов
/ 05 июня 2018

Из документации API

"Хотя такие значения заказов могут влиять на приоритеты в точках впрыска, имейте в виду, что они не влияют на порядок запуска синглтона, который является ортогональной проблемой, определяемой зависимостьюСвязи и объявления @DependsOn (влияющие на график зависимостей, определяемый во время выполнения). "

Вам необходимо либо @ DependsOn , чтобы управлять порядком создания.

Или вызвать иначевсе методы init в одном бине, чтобы вы могли контролировать порядок.Если вы добавите другие bean-компоненты, вы будете уверены, что они завершили создание.

Что-то вроде:

@Component
public class InitBean {

   @Autowired
   privaPropertiesConfig propertiesConfig;

   @Autowired
   private WebPropertiesConfig webPropertiesConfig;

   @Autowired
   private ConfigPropertiesMapper configPropertiesMapper;

   @PostConstruct
   public void init() {
       propertiesConfig.errorPropertiesFromYamlFile()
       webPropertiesConfig.webPropertiesFromYamlFile()
       configPropertiesMapper.init()    
    }
}

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

@Component
@PropertySource(value={ "classpath:errorMessages.yml", "classpath:webProperties.yml"}, ignoreResourceNotFound="true))
@ConfigurationProperties(prefix = "webpart")
public class ConfigPropertiesMapper {
   ...    
}
...