@bean和@component的理解

進擊的小猴子發表於2018-04-01

Spring幫助我們管理Bean分為兩個部分,一個是註冊Bean,一個裝配Bean。
完成這兩個動作有三種方式,一種是使用自動配置的方式、一種是使用JavaConfig的方式,一種就是使用XML配置的方式。
在自動配置的方式中,使用@Component去告訴Spring,我是一個bean,你要來管理我,然後使用@AutoWired註解去裝配Bean(所謂裝配,就是管理物件直接的協作關係)。然後在JavaConfig中,@Configuration其實就是告訴spring,spring容器要怎麼配置(怎麼去註冊bean,怎麼去處理bean之間的關係(裝配))。那麼久很好理解了,@Bean的意思就是,我要獲取這個bean的時候,你spring要按照這種方式去幫我獲取到這個bean。到了使用xml的方式,也是如此。君不見<bean>標籤就是告訴spring怎麼獲取這個bean,各種<ref>就是手動的配置bean之間的關係。

用@Bean註解的方法:會例項化、配置並初始化一個新的物件,這個物件會由spring IoC 容器管理。

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

}

相當於在 XML 檔案中配置

<beans>
    <bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>

生成物件的名字:預設情況下用@Bean註解的方法名作為物件的名字。但是可以用 name屬性定義物件的名字.

@Configuration
public class AppConfig {

    @Bean(name = "myFoo")
    public Foo foo() {
        return new Foo();
    }

}

而且還可以使用name為物件起多個名字。

    @Configuration
    public class AppConfig {
    
        @Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" })
        public DataSource dataSource() {
            // instantiate, configure and return DataSource bean...
        }
    
    }

在 @Component 註解的類中不能定義 類內依賴的@Bean註解的方法。@Configuration可以。
@Configuration
public class AppConfig {

@Bean
public Foo foo() {
    return new Foo(bar());
}

@Bean
public Bar bar() {
    return new Bar();
}

}

相關文章