@Component和@Configuration都屬於Spring所提供的註解,兩者可謂各司其職。
@Component這個註解,從剛開始的SpringMVC到現在的SpringBoot,我們都一直有接觸到,我們也知道它的功能,它幫我們實現了宣告一個bean注入到IOC容器中。
另一個註解@Configuration,它們有個共同點,便是它也可以宣告一個bean注入到IOC容器中。
那這樣的話,@Configuration的意義是什麼呢?
在我看來,@Configuration這個註解,是最能詮釋Spring的去配置檔案這個工作的註解,因為這個註解有一個很大的作用,它可以代替xml檔案,生成類似<beans>的結果。
也就是除了本身外,它可以在類中透過@Bean註解來注入多個Bean到IOC容器中。
如下:
之後在需要使用該Bean的地方,便可以使用
來注入,並使用。
在使用@Configuration這個註解的時候,有幾點是需要注意的,我們順便提一下:
配置類必須以類的形式提供(不能是工廠方法返回的例項),允許透過生成子類在執行時增強(cglib 動態代理)。
@Component和@Configuration都屬於Spring所提供的註解,兩者可謂各司其職。
共同點@Component這個註解,從剛開始的SpringMVC到現在的SpringBoot,我們都一直有接觸到,我們也知道它的功能,它幫我們實現了宣告一個bean注入到IOC容器中。
另一個註解@Configuration,它們有個共同點,便是它也可以宣告一個bean注入到IOC容器中。
特別點那這樣的話,@Configuration的意義是什麼呢?
在我看來,@Configuration這個註解,是最能詮釋Spring的去配置檔案這個工作的註解,因為這個註解有一個很大的作用,它可以代替xml檔案,生成類似<beans>的結果。
也就是除了本身外,它可以在類中透過@Bean註解來注入多個Bean到IOC容器中。
如下:
@Configurationpublic 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@Beanpublic PlatformTransactionManager transactionManager() {return new DataSourceTransactionManager(dataSource());}}之後在需要使用該Bean的地方,便可以使用
@Autowiredprivate DataSource dataSource;來注入,並使用。
注意點在使用@Configuration這個註解的時候,有幾點是需要注意的,我們順便提一下:
配置類必須以類的形式提供(不能是工廠方法返回的例項),允許透過生成子類在執行時增強(cglib 動態代理)。
配置類不能是 final 類(沒法動態代理)。配置註解通常為了透過 @Bean 註解生成 Spring 容器管理的類,配置類必須是非本地的(即不能在方法中宣告,不能是 private)。任何巢狀配置類都必須宣告為static。@Bean 方法可能不會反過來建立進一步的配置類(也就是返回的 bean 如果帶有 @Configuration,也不會被特殊處理,只會作為普通的 bean)。