Spring启动时执行方法

时间:2017-09-23 17:02:40

标签: java spring spring-boot properties spring-config

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

5 个答案:

答案 0 :(得分:0)

您可以实施InitializingBean,其中包含名为afterPropertiesSet()的方法。在替换所有属性占位符后将调用此方法。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分: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
        }
    }

答案 4 :(得分:0)

您可以在春季启动后获得它。

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
    }

}