В Spring Boot какой класс будет инициализироваться первым @Component или @Configuration - PullRequest
1 голос
/ 31 октября 2019

У меня есть класс, помеченный @Component, который используется для инициализации свойств конфигурации application.yml. Служба classe использует свойство конфигурации. Но иногда мой экземпляр класса Service создается до класса Configuration, и я получаю нулевое значение свойства в классе обслуживания, его случайный не конкретный шаблон.

Класс инициализации конфигурации ..

@Component
public class ConfigInitializer implements InitializingBean {
    private static final Logger log = LoggerFactory.getLogger(ConfigInitializer.class);
    @Autowired
    ProxyConfig proxyConfig;

    /*@PostConstruct
    public void postConstruct(){
        setProperties();
    }
    */
    @Override
    public void afterPropertiesSet() {
        setProperties();
    }
    private void setSystemProperties(){
        log.debug("Setting properties...");
        Properties props = new Properties();
        props.put("PROXY_URL", proxyConfig.getProxyUrl());
        props.put("PROXY_PORT", proxyConfig.getProxyPort());
        System.getProperties().putAll(props);
    }
} 


@Component
@ConfigurationProperties(prefix = "proxy-config")
public static class ProxyConfig {
    private String proxyUrl;
    private String proxyPort;

    public String getProxyUrl() {
        return proxyUrl;
    }

    public void setProxyUrl(String proxyUrl) {
        this.proxyUrl = proxyUrl;
    }

    public String getProxyPort() {
        return proxyPort;
    }

    public void setProxyPort(String proxyPort) {
        this.proxyPort = proxyPort;
    }

}

Класс обслуживания ..

@Service("receiverService")
public class ReceiverService {

    private static final Logger logger = LoggerFactory.getLogger(ReceiverService.class);
    private ExecutorService executorService = Executors.newSingleThreadExecutor();

    @Autowired
    public ReceiverService() {
        initClient();
    }

    private void initClient() {
        Future future = executorService.submit(new Callable(){
            public Object call() throws Exception {
                String value = System.getProperty("PROXY_URL"); **//Here I am getting null**    
                logger.info("Values : " + value); 
            }
        });

        System.out.println("future.get() = " + future.get());
    }
}  

Выше Класс обслуживания получает null значения String value = System.getProperty("PROXY_URL") Когда я использую @DependsOnаннотация на Сервисный класс, работает отлично. Насколько я знаю, я знаю, что у Spring нет определенного порядка создания бина.

Я хочу знать, если я использую @Configuration вместо @Component в классе ConfigInitializer, как показано ниже, Spring инициализирует ConfigInitializerкласс перед другими бобами?.

  @Configuration    
  public class ConfigInitializer implements InitializingBean { 
    //code here
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...