寫一寫Spring裡@Configuration和@ConfigurationProperties的區別

咋一看,這兩個註解給我的感覺就是有著剪不斷理還亂七顛八倒橫七豎八

的關係。

說一說這兩個的運用場景:


寫一寫Spring裡@Configuration和@ConfigurationProperties的區別

@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來獲取即可,會更加直觀些。


分享到:


相關文章: