0

我想在应用程序启动期间(或更确切地说是在结束时)执行一些代码。我发现有几个资源使用@PostConstruct 注释、@EventListener(ContextRefreshedEvent.class)、实现 InitializingBean、实现 ApplicationListener...它们都在启动时执行我的代码,但应用程序属性的占位符并没有被替换片刻。因此,如果我的类有一个带有 @Value("${my.property}") 注释的成员,它会返回 "${my.property}" 而不是 yaml(或任何地方)中定义的实际值。替换发生后我如何完成执行我的代码?

4

5 回答 5

0

您可以实现InitializingBeanwhich 有一个名为afterPropertiesSet(). 在替换所有属性占位符后将调用此方法。

于 2017-09-23T17:11:50.710 回答
0

@PostConstruct 在创建 bean 时调用。Ypu 必须检查 spring 是否找到具有属性的文件。

于 2017-09-23T17:15:07.423 回答
0

如果您有一个配置类 @Configuration,那么您可以尝试通过添加以下注释来显式导入您的属性文件:

@PropertySource("classpath:your-properties-file.properties")

任何其他非配置资源都应该在您的配置类之后加载,并且您的 @Value 注释应该可以正常工作。

于 2017-09-23T18:25:56.597 回答
0

你应该ApplicationListener<ContextRefreshedEvent>这样实现:

@Component
public class SpringContextListener implements ApplicationListener<ContextRefreshedEvent> {

        @Value("${my.property}")
        private String someVal;

        /**
         * // This logic will be executed after the application has loded
         */
        public void onApplicationEvent(ContextRefreshedEvent event) {
            // Some logic here
        }
    }
于 2017-09-24T01:55:41.273 回答
0

您可以在 spring boot 启动后获取它。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

@Component
@Order(0)
class ApplicationReadyInitializer implements ApplicationListener<ApplicationReadyEvent> {

    @Autowired
    ResourceLoader resourceLoader;

    @Value("${my.property}")
    private String someVal;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        // App was started. Do something
    }

}
于 2020-02-25T00:57:55.860 回答