gpt4 book ai didi

spring - 为可与@PropertySource 一起使用的 AbstractAnnotationConfigDispatcherServletInitializer 设置事件配置文件?

转载 作者:行者123 更新时间:2023-12-05 00:27:28 24 4
gpt4 key购买 nike

我正在使用 AbstractAnnotationConfigDispatcherServletInitializer配置我的网络应用程序。我也有一个 @Configuration我用来创建一些 bean 的类。在本课中,我使用 @PropertySource用于为各种设置加载属性文件的注释(例如数据库连接详细信息)。

目前,我使用 Maven 配置文件和 Ant 任务来为我的运行时环境创建正确的属性文件。也就是说,我让 Maven 在构建时将“prod.properties”或“dev.properties”移动到“application.properties”(该类使用)。我想做的是使用 Spring 配置文件来消除这种情况。我希望能够做到以下几点:

@PropertySource( value = "classpath:/application-${spring.profiles.active}.properties")

我还想在不使用任何 XML 的情况下设置配置文件。所以我需要根据系统属性的存在来设置配置文件。例如,
String currentEnvironment = systemProperties.getProperty("current.environment");
if (currentEnvironment == null) {
((ConfigurableEnvironment)context.getEnvironment()).setActiveProfiles("production");
} else {
((ConfigurableEnvironment)context.getEnvironment()).setActiveProfiles(currentEnvironment);
}

不过,我不确定在哪里可以做到这一点。根据 an answer对于相关问题,这可以通过覆盖 createRootApplicationContext 来完成。我的初始化程序类中的方法。但是,该答案还依赖于在设置配置文件之前加载的配置类。

我想做的可能吗?如果是这样,如何?

最佳答案

覆盖 createRootApplicationContextcreateServletApplicationContext不适合我。我收到各种错误,例如非法状态异常和“${spring.profiles.active}”无法解决。挖掘 AbstractAnnotationConfigDispatcherServletInitializer 的继承树我设计了以下解决方案:

public class ApplicationInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer
{
@Override
public void onStartup(ServletContext context) throws ServletException {
super.onStartup(context);

String activeProfile = System.getProperty("your.profile.property");
if (activeProfile == null) {
activeProfile = "prod"; // or whatever you want the default to be
}

context.setInitParameter("spring.profiles.active", activeProfile);
}
}

现在你可以创建一个像下面这样的配置类,它会工作得很好:
@Configuration
@PropertySource( value = "classpath:application-${spring.profiles.active}.properties" )
public class MyAppBeans {
@Autowired
private Environment env;

@Bean
public Object coolBean() {
String initParam = this.env.getProperty("cool.bean.initParam");
...
return coolBean;
}
}

当然,您可以通过 VM 选项( -Dyour.profile.property=dev )或容器属性(例如 Tomcat 容器属性)设置“your.profile.property”。

关于spring - 为可与@PropertySource 一起使用的 AbstractAnnotationConfigDispatcherServletInitializer 设置事件配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20617827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com