簡體   English   中英

在初始化SpringBootApplication之前尋找一種方法來解析springboot application.yml文件中的值

[英]Looking for a way to parse values in springboot application.yml file before SpringBootApplication is initialized

所以我的問題如下:

我正在使用Spring AMQP連接到使用SSL的RabbitMQ實例。 不幸的是,spring AMQP當前不支持全長amqps URI,並且在優先級列表上添加支持的程度也不高(請參閱問題: https : //github.com/spring-projects/spring-boot/issues/6401 )。 他們需要分開。

連接application.yml時需要以下字段:

spring:
  rabbitmq:
    host: hostname
    port: portnumber
    username: username
    password: password
    virtual-host: virtualhost
    ssl:
      enabled: true

我的RabbitMQ實例的VCAP_Services環境僅以以下格式提供虛擬主機和全長uri: amqps://username:password@hostname:portnumber/virtualhost

現在將這些值復制並粘貼到我的application.yml中是可以的,但從長遠來看是不可行的。 它們將需要來自vcap_services。

我的@SpringBootApplication具有@Beans,這些@Beans在啟動時會初始化與rabbitMQ實例的連接,因此我正在尋找一種方法來解析各個值並在應用程序啟動之前進行設置。

只需覆蓋Boot的自動配置的連接工廠...

@SpringBootApplication
public class So46937522Application {

    public static void main(String[] args) {
        SpringApplication.run(So46937522Application.class, args);
    }

    @Bean
    public CachingConnectionFactory rabbitConnectionFactory(RabbitProperties config)
            throws Exception {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.getRabbitConnectionFactory()
            .setUri("amqps://guest:guest@10.0.0.3:5671/virtualhost");
        return connectionFactory;
    }

    @RabbitListener(queues = "si.test.queue")
    public void listen(Message in) {
        System.out.println(in);
    }

}

如果您只想在初始化Spring Boot應用程序之前讀取屬性,則可以在調用SpringApplication.run之前使用Spring的YamlPropertiesFactoryBean解析yaml文件。 例如,

@SpringBootApplication
public class Application {

    public static void main(String[] args) {       
        YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
        yamlFactory.setResources(new ClassPathResource("application.yml"));
        Properties props = yamlFactory.getObject();

        String hostname = props.getProperty("spring.rabbitmq.hostname");
        ...

        SpringApplication.run(Application.class, args);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM