Spring Boot - 在@Configuration类中使用Externalized Configuration值

时间:2015-02-18 07:46:44

标签: spring spring-boot

我需要外部化会话存储,所以使用了spring-session。

按照https://github.com/spring-projects/spring-session/blob/master/samples/boot/src/main/java/sample/config/EmbeddedRedisConfiguration.java上的示例,我创建了我的EmbeddedRedisConfiguration,一切正常。

我决定在预先存在的本地redis服务器的情况下,我需要可选支持来指定Redis可执行路径,因此我已将/resources/config/application.properties添加到以下键值redis.embedded.executable.path==/path/to/redis

我当时的想法是在配置中使用@Value注释,并且可以访问值

static class RedisServerBean implements InitializingBean, DisposableBean, BeanDefinitionRegistryPostProcessor {
    private RedisServer redisServer;

    @Value("${redis.embedded.executable.path}")
    String executablePath;

    public void afterPropertiesSet() throws Exception {
        if (executablePath != null) {
            redisServer = new RedisServer(new File(executablePath), Protocol.DEFAULT_PORT);    
        } else {
            redisServer = new RedisServer(Protocol.DEFAULT_PORT);
        }
        redisServer.start();
    }

    public void destroy() throws Exception {
        if(redisServer != null) {
            redisServer.stop();
        }
    }

    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {}

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
}

但是,executablePath始终为空。如您所知,如果您在@Value类或同等级别中使用@Service,则会填充该值。

我假设在加载属性的bean之前调用此配置,但我也知道这是可能的,因为例如@DatasourceAutoConfiguration可以使用spring.datasource.*属性

我显然在这里忽略了一些简单的事情。我需要自己的@ConfigurationProperties

吗?

1 个答案:

答案 0 :(得分:-1)

将您的属性文件更改为:

redis.embedded.executable.path=/path/to/redis