動態

詳情 返回 返回

Spring框架中的Component與Bean註解 - 動態 詳情

Spring Boot 中的 @Bean 與 @Component
![](
https://pic4.zhimg.com/v2-f957e9ec5412c87a66ccb021410eaae9_14...)
Spring 的 @Component@Bean 註解的關鍵區別在於:@Bean 註解可用於暴露您自己編寫的 JavaBeans,而 @Component 註解可用於暴露源代碼由他人維護的 JavaBeans。
Spring 框架的核心是其控制反轉 (IoC) 容器,它管理着應用程序中最重要的 JavaBeans 的生命週期。然而,IoC 容器並不管理應用程序可能需要的每一個 JavaBean。它只管理您明確要求它管理的 JavaBeans 的生命週期。
何時使用 Spring 的 @Bean 註解?
如果您自己編寫了一個 JavaBean,可以直接在源代碼中添加 Spring 的 @Bean 註解。這裏我們要求 Spring 的 IoC 容器管理 Score 類所有實例的生命週期。

@Bean
public class Score {
    int wins, losses, ties;
}

何時使用 Spring 的 @Component 註解?
但是,如果您想讓 Spring 的 IoC 容器管理來自 Jackson API 的 ObjectMapper,或者來自 JDBC API 的 DataSource 組件呢?您不能簡單地編輯 JDK 中的代碼並在標準 API 的類上添加 @Bean 註解。這就是 @Component 註解的用武之地。
如果您希望 Spring 管理一個您無法控制其代碼的 JavaBean,您可以創建一個返回該 JavaBean 實例的方法,然後用 @Component 註解裝飾該方法,如下例所示:

@Configuration
public class MyConfig {
    @Component
    public DataSource getMyHikariDataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl("jdbc:h2:mem:roshambo");
        return ds;
    }
    @Component
    public ObjectMapper getMyObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        return mapper;
    }
}

在此示例中,我們使用了 @Component 註解來告訴 Spring IoC 容器管理 DataSourceObjectMapper bean 的生命週期。
這些組件來自 Jackson 和 JDBC API,因此我們無法編輯其源代碼。這就是為什麼我們不能直接在類聲明上方添加 @Bean 註解的原因。但是,我們可以使用 @Component 註解,並結合放在類文件本身的 @Configuration 註解,來告訴 Spring 管理這些外部提供的資源。
用 @Component 代替 @Bean?
@Component 註解並不僅限於與外部 API 一起使用。開發者完全允許使用 @Component 註解代替 @Bean 註解來暴露他們自己編寫的 JavaBeans。
如果我們從上方的 Score 類中移除 @Bean 註解,我們可以像下面代碼中看到的那樣,通過使用 @Component 註解來通過 IoC 容器暴露 Score

@Configuration
public class MyRoshamboConfig {
    @Component
    public Score getTheScore() {
        return new Score();
    }
}

何時使用 @Component vs @Bean?
在具有一定規模的 Spring Boot 項目中,我實際上更傾向於使用 @Component 註解而不是 @Bean 註解。這樣,配置被限制在單個文件中,而您編寫的 JavaBeans 不會被那些將您的源代碼緊密綁定到 Spring 框架的註解所充斥。
在較小的項目和原型中?我完全支持使用 @Bean 註解。它更容易使用,並且如果您的項目不需要大量配置,它可以幫助您更快地啓動和運行您的微服務。


【注】本文譯自:Component vs. Bean annotations in Spring

user avatar u_17513518 頭像 lenve 頭像 dengjijie 頭像 xiongshihubao 頭像 snower 頭像 wuxiedekeben 頭像 sheyingshichenjian 頭像 chencaize 頭像 lindsay_bubble 頭像 javadaydayup 頭像 tangbo_5f9242f233a7e 頭像
點贊 11 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.