Spring-boot構成ファイルのロード順序とカスタム構成ファイル名

序文:

spring-boot構成ファイルはデフォルトでapplication.propertiesまたはapplication.yml構成ファイルを使用し、spring.profiles.active = devを指定します。追加のapplication-dev.propertiesをロードできます。これらは常識的な知識です。 application.properties以外のファイルを設定ファイルとしてロードする方法はありますか?

 

1.構成ファイルをロードする方法をカスタマイズします

構成ファイルのロードをカスタマイズする方法は3つあります

 

1. @ PropertySource経由

スタートアップクラスで@PropertySource( "test.properties")を使用します。注:複数のスタートアップクラスを使用して起動時に異なる構成ファイルをロードする場合、このメソッドは、開始されていないスタートアップクラスの構成ファイルをロードします。 、および存在する場合メイン構成ファイルが存在し(メイン構成ファイルはapplication.propertiesまたはprofilesで指定された構成ファイルです)、プロパティが競合する場合はメイン構成ファイルが優先されます。

 

2. springApplication.setDefaultProperties(prop)を介して

このメソッドとメソッド1の構成の重みも同じであり、メイン構成によって上書きされます。設定方法については、次のコードを参照してください。

		newSpringApplicationSetDefProps(Application.class, "test.properties").run()
	}
	
	/**
	 * 自定义配置文件方式二:优先级小于主配置文件 (需要在主配置文件不存在使用)
	 */
	public static SpringApplication newSpringApplicationSetDefProps(Class<?> clazz, String path) {
		SpringApplication springApplication = new SpringApplication(clazz);
		Properties prop = new Properties();
		InputStream in = clazz.getClassLoader().getResourceAsStream(path);
		try {
			prop.load(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
		springApplication.setDefaultProperties(prop);
		return springApplication;
	}

 

3.プログラム独立変数の方法を介して

引数値:-spring.config.name = test
設定方法:

    1)eclipseのmainメソッドの実行またはデバッグ構成で、2番目のタブを見つけて、プログラム引数を追加します。

    2)mainメソッドを使用してargs配列を設定します

 args = new String[] {"--spring.config.name=test"};

 SpringApplication.run(Application.class, args);

 

第二に、優先順位

1.優先テスト

/**
 * spring-boot资源文件加载方式和优先级等测试demo
 * 
 * 			ShowController代码
 * 
 *			 @Autowired private User user; // 通过@ConfigurationProperties加载配置属性
 * 
 * 			@Value("${server.port}") // 通过@value加载配置属性 private int port;
 * 
 * 			@GetMapping("/show") public String show() {
 *            System.out.println(user.getName());
 *            System.out.println(user.getTitle()); System.out.println(port);
 *            return "结果"; 
 *          }
 *
 *            1、测试方案1: 主资源文件端口设置server.port=8088, 附属资源文件也设置端口server.port=8090, 运行时查看启动端口值 
 *            结论: 主资源文件端口配置会覆盖掉附属增加的资源文件配置。
 * 
 *            2、测试方案2:去掉PropertySource,采用properties加载资源文件并且设置到SpringApplication,进行运行。
 *            结论:和测试方案1一致。 通过setDefaultProperties端口会被主配置覆盖。
 * 
 *            3、测试方案3:删除掉默认的application.properties,只从properties或@PropertySource进行加载资源文件 
 *            结论:端口设置会按照指定的properties文件加载
 *            
 *            ------1-3总结: 配置文件分为主配置文件,和附属配置文件,主配置文件优先级高于附属配置,另外setDefaultProperties加载的也是附属的配置(会被主配置覆盖)。
 *
 * 			  4、测试方案4:设置--spring.config.name=test2的程序自变量,并且改回默认的application.proerties文件。
 * 			   结论:设置--spring-config.name=test2的程序自变量,会重新设定主配置文件的名称为test2.properties的文件
 * 
 * 			 另外通过--server.port=9090程序自变量方式设置的配置,优先级高于配置文件。
 * 			
 */
@SpringBootApplication
// @PropertySource("test.properties")
public class Application {

	/**
	 * --spring.config.name=test2  指定配置文件的自变量 (可替换主配置文件名)
	 * --server.port=9090  指定启动端口的自变量 (优先级高于配置文件)
	 */
	public static void main(String[] args) {
		
		for (String string : args) {
			System.out.println(string);
		}
		
		SpringApplication.run(Application.class, args);
		 
//		runSetDefaultProperties("test.properties", args);
	}

	public static void runSetDefaultProperties(String path, String[] args) {
		Properties props = new Properties();
		InputStream inputStream = Application.class.getClassLoader().getResourceAsStream(path);
		try {
			props.load(inputStream);
		} catch (IOException e) {
			e.printStackTrace();
		}
		SpringApplication app = new SpringApplication(Application.class);
		app.setDefaultProperties(props);
		app.run(args);
	}

}

 

2.優先順位の結論

プログラム引数>メイン構成ファイル(--spring.config.name = testで変更可能)>その他の設定構成ファイル

 

 

 

 

おすすめ

転載: blog.csdn.net/shuixiou1/article/details/114377317