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