咋一看,這兩個註解給我的感覺就是有著剪不斷理還亂七顛八倒橫七豎八 的關係。
說一說這兩個的運用場景:
@ConfigurationPropertie:
比如有個配置文件config.properties文件
config.name=test_name
config.other=test_other
我們想將這些配置信息從配置文件中讀出來,映射到實體中,我們可以使用@ConfigurationPropertie。
在普通類上增加@ConfigurationProperties註解,可以獲取該配置文件的內容
要注意的是:
1)當我們想將映射後的實體作為一個bean進行注入時候,需要增加@Component註解,從而與@ConfigurationPropertie相輔相成。
2)若配置文件不是默認配置文件(application.properties和application.yml)或路徑不是默認路徑的話,則需要通過@PropertySource註解在表明配置文件地址。
3)屬性值需要getter setter方法,才能進行配置信息的映射和獲取。
4)通過prefix可設置前綴,屬性名定位前綴後的那部分,則可以直接獲取到屬性值。
// example:
//舉個例子,要獲取config.properties裡config開頭的兩個配置config.name和config.other, 我們可以通過下面的代碼方式映射。
//與此同時,還希望在其他bean中引用該實體,通過@Component註解進行Bean的注入,即可通過@Autowire進行該實體bean的獲取
@ConfigurationProperties(prefix="config")
@Component
@PropertySource("classpath:/config.properties")
public Class Config{
private String name;
private String other;
// getter setter
}
最後在啟動類上加入@EnableConfigurationProperties註解,用於將@ConfigurationProperties修飾的Bean生效。
@Configuration:
@Configuration同樣可以實現將配置文件的信息映射到類中,但它更加有意義的功能,在於他能實現<beans>的功能,也就是可以在其中通過@Bean註解來注入多個Bean到IOC容器中。
// 實現將config.properties配置文件裡的config.name和config.other屬性進行獲取的功能
@Configuration
@PropertySource("classpath:/config.properties")
public Class Config{
@Value("${config.name}")
private String name;
@Value("${config.other}")
private String other;
}
那麼是如何實現注入多個Bean到IOC容器中呢:
@Configuration
public class ExampleConfiguration {
// 獲取到application.properties裡的com.mysql.jdbc.Driver配置項
@Value("com.mysql.jdbc.Driver")
private String driverClassName;
@Value("jdbc://xxxx.xx.xxx/xx")
private String driverUrl;
@Value("${root}")
private String driverUsername;
@Value("123456")
private String driverPassword;
//通過@Configuration和@Bean註解,將注入一個名稱為dataSource的Bean,這個Bean的主體,便是dataSource()這個方法的結果
@Bean(name = "dataSource")
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(driverUrl);
dataSource.setUsername(driverUsername);
dataSource.setPassword(driverPassword);
return dataSource;
}
// 還能再繼續注入其他的Bean
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
之後在需要使用該Bean的地方,便可以使用
@Autowired
private DataSource dataSource;
來注入,並使用
可以注意到,@Configuration比起@ConfigurationProperties ,在運用過程中,是不需要增加@Componet註解的,這是因為@Configuration這個註解本身已經增加了@Component註解,所以是不需要重複增加的。
@Configuration的功能更豐富些,主要運用在需要注入自定義Bean的場景下、
如果只是單純作為獲取配置信息用處,不注入bean的話,可以不使用@Configuration,直接使用@ConfigurationProperties來進行注入,同時一樣使用@Value來獲取即可,會更加直觀些。
閱讀更多 居家程序員 的文章