1. 程式人生 > >spring原始碼分析(二):外部配置檔案的載入

spring原始碼分析(二):外部配置檔案的載入

@PropertySource 和@Profile

簡介:
@PropertySource:用在類上,載入一個(*.properties)的配置檔案

@Profile:用在類或者方法上,指定元件在哪個環境的情況下才能被註冊到容器中,不指定,任何環境下都能註冊這個元件

使用案例1-不同環境不同資料來源

我們以資料來源為例(當然,正常開發多寫幾個配置檔案就好了,這只是一個示例),測試、生成、開發使用不同的資料來源,使用程式碼控制如下:

配置檔案類

@PropertySource("classpath:/dbconfig.properties")
@Configuration
public class MainConfigOfProfile implements EmbeddedValueResolverAware{ @Value("${db.user}") private String user; private StringValueResolver valueResolver; private String driverClass; @Bean public Yellow yellow(){ return new Yellow(); } @Profile("test") @Bean("testDataSource") public
DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); dataSource.setDriverClass(driverClass)
; return dataSource; } @Profile("dev") @Bean("devDataSource") public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm_crud"); dataSource.setDriverClass(driverClass); return dataSource; } @Profile("prod") @Bean("prodDataSource") public DataSource dataSourceProd(@Value("${db.password}")String pwd) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/scw_0515"); dataSource.setDriverClass(driverClass); return dataSource; } @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { // TODO Auto-generated method stub this.valueResolver = resolver; driverClass = valueResolver.resolveStringValue("${db.driverClass}"); } }

測試類

public class IOCTest_Profile {
	
	//1、使用命令列動態引數: 在虛擬機器引數位置載入 -Dspring.profiles.active=test
	//2、程式碼的方式啟用某種環境;
	@Test
	public void test01(){
		AnnotationConfigApplicationContext applicationContext = 
				new AnnotationConfigApplicationContext();
		//1、建立一個applicationContext
		//2、設定需要啟用的環境
		applicationContext.getEnvironment().setActiveProfiles("dev");
		//3、註冊主配置類
		applicationContext.register(MainConfigOfProfile.class);
		//4、啟動重新整理容器
		applicationContext.refresh();	
		
		String[] namesForType = applicationContext.getBeanNamesForType(DataSource.class);
		for (String string : namesForType) {
			System.out.println(string);
		}
		
		Yellow bean = applicationContext.getBean(Yellow.class);
		System.out.println(bean);
		applicationContext.close();
	}

}

使用案例2- (結合@Value)配置屬性類

介紹:使用@PropertySource讀取外部配置檔案中的k/v儲存到執行的環境變數中;載入完外部的配置檔案以後使用${}取出配置檔案的值

@PropertySource(value={"classpath:/person.properties"})
@Configuration
public class MainConfigOfPropertyValues {
	
	@Bean
	public Person person(){
		return new Person();
	}
}
@Data
public class Person {
	
	//使用@Value賦值;
	//1、基本數值
	//2、可以寫SpEL; #{}
	//3、可以寫${};取出配置檔案【properties】中的值(在執行環境變數裡面的值)
	
	@Value("張三")
	private String name;
	@Value("#{20-2}")
	private Integer age;	
	@Value("${person.nickName}")
	private String nickName;