回覆列表
  • 1 # 居家程式設計師

    @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)。

  • 中秋節和大豐收的關聯?
  • 碰到這種室友怎麼辦?