只是a当使用Java Configuration的AnnotationConfigApplicationContext时如何覆盖Spring中的application.properties

时间:2017-09-20 13:41:07

标签: java spring configuration

使用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
}

0 个答案:

没有答案