使用Java配置时是否可以覆盖application.properties文件。例如。在我的代码中,我通过使用AppConfig类来轻松配置一些东西来启动Spring:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class);
context.refresh();
Application application = context.getBean(Application.class);
application.start();
在我的AppConfig类中,我有类似的东西,我使用application.properties文件来初始化bean:
@Autowired
Environment env;
@Bean
public ApplicationManager applicationManager(){
nodeName = env.getProperty("node.name");
ApplicationManager applicationManager = new ApplicationManager();
applicationManager.setNodeName(nodeName);
return applicationManager;
}
Environment env基于application.properties文件。但是,即使我从命令行启动应用程序,如下所示:
java -jar myJar --spring.config.location = [new application.properties location]
application.properties文件中的相同内容用于环境的基础,而不是我试图从命令行使用的文件。
在使用AnnotationConfigApplicationContext -I做实验时,似乎没有覆盖spring.config.location,并注意到如果我使用:
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
Application application = context.getBean(Application.class);
application.start();
然后像你想象的那样覆盖application.properties,但显然你会使用AppConfig.class丢失java配置。有没有办法让你的蛋糕和吃它?欢迎任何想法,谢谢!
这里要清楚的是我的Application类:
@SpringBootApplication
public class Application {
public Application(){}
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class);
context.refresh();
Application application = context.getBean(Application.class);
application.start();
}
public void start() {
...start stuff here....
}
}
只是对可能处于类似位置的任何人的更新:
这对我来说不起作用的全部原因是我在Application.class中传递的事实(不是像demin指出的配置类!)并使用AnnotationConfigApplicationContext来获取上下文 - 这很容易通过传入AppConfig.class(配置类)进行纠正,我创建并使用SpringApplication助手类来获取ConfigurableApplicationContext。然后,根据您是否在命令行传递对application.properties文件的外部引用,它将工作:)这是一个适合我的代码片段:
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(AppConfig.class, args);
SomeClass someClass = context.getBean("SomeClass.class");
someClass.doThis(); //start your app doing something here
}