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