在 Spring 开始时执行方法

Execute Method on Spring start

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

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

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

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

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

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

您应该像这样实施 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
        }
    }

开机后spring即可获取

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
    }

}