最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring創(chuàng)建Bean的八種主要方式詳解

 更新時間:2025年08月19日 09:00:34   作者:小兔兔吃蘿卜  
Spring(尤其是 Spring Boot)提供了多種方式來讓容器創(chuàng)建和管理 Bean,@Component、@Configuration + @Bean、@EnableConfigurationProperties 都是常見方式,下面我為你系統(tǒng)地梳理 Spring 創(chuàng)建 Bean 的所有主要方式,并說明它們的使用場景和區(qū)別,需要的朋友可以參考下

引言

Spring(尤其是 Spring Boot)提供了多種方式來讓容器創(chuàng)建和管理 Bean。@Component、@Configuration + @Bean@EnableConfigurationProperties 都是常見方式。

下面我為你系統(tǒng)地梳理 Spring 創(chuàng)建 Bean 的所有主要方式,并說明它們的使用場景和區(qū)別。

一、Spring 創(chuàng)建 Bean 的 8 種主要方式

方式注解/方法適用場景
1@Component 及其衍生注解掃描普通類為 Bean
2@Configuration + @Bean手動配置第三方類或復(fù)雜對象
3@EnableConfigurationProperties + @ConfigurationProperties將配置文件映射為 Bean
4@Import導(dǎo)入配置類或直接注冊 Bean
5實現(xiàn) FactoryBean<T>創(chuàng)建復(fù)雜或條件性對象
6使用 @Conditional 系列注解條件化注冊 Bean
7編程式注冊:BeanDefinitionRegistryPostProcessor動態(tài)注冊 Bean(高級)
8XML 配置(傳統(tǒng)方式)老項目兼容

1. @Component 及其衍生注解(最常用)

@Component
@Service
@Repository
@Controller
@RestController
@Configuration // @Configuration 也是 @Component
  • 原理:配合 @ComponentScan,Spring 會掃描這些類并注冊為 Bean。
  • 適用:你自己寫的業(yè)務(wù)類(Service、DAO、Controller 等)。
@Service
public class UserService {
    public void save() { ... }
}

? 自動注冊為 userService Bean。

2. @Configuration + @Bean(手動注冊)

用于注冊不能加 @Component 的類(如第三方庫的類)。

@Configuration
public class RedisConfig {
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        return template;
    }
}
  • 適用:數(shù)據(jù)源、RedisTemplate、RabbitMQ、RocketMQ、OkHttp、HttpClient 等第三方組件。

3. @EnableConfigurationProperties + @ConfigurationProperties

application.yml 中的配置自動綁定為 Bean。

app:
  title: MyApp
  version: 1.0.0
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private String title;
    private String version;
    // getter/setter
}
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {
}

? AppProperties 會被 Spring 創(chuàng)建并注入配置值,且可被 @Autowired。

在 Spring Boot 2.2+ 中,@EnableConfigurationProperties 通??梢允÷裕灰惣恿?@ConfigurationProperties 并被掃描到即可。

4. @Import(導(dǎo)入配置類或直接注冊)

三種用法:

(1) 導(dǎo)入 @Configuration 類

@Import(DatabaseConfig.class)
@SpringBootApplication
public class Application { }

(2) 導(dǎo)入 @Component 類

@Import(UserService.class)

(3) 導(dǎo)入 ImportSelector 或 ImportBeanDefinitionRegistrar

@Import(MyImportSelector.class)
public class Application { }

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{MyService.class.getName()};
    }
}

? 用于實現(xiàn)“條件導(dǎo)入”、“SPI 擴展”等高級功能。

5. 實現(xiàn) FactoryBean<T>(創(chuàng)建復(fù)雜對象)

當你需要復(fù)雜的創(chuàng)建邏輯時使用。

public class MyFactoryBean implements FactoryBean<MyService> {

    @Override
    public MyService getObject() throws Exception {
        MyService service = new MyService();
        service.init(); // 復(fù)雜初始化
        return service;
    }

    @Override
    public Class<?> getObjectType() {
        return MyService.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
@Component
public class MyFactoryBean { } // Spring 會調(diào)用 getObject() 創(chuàng)建 MyService Bean

? 適合創(chuàng)建代理對象、動態(tài)對象、SPI 實現(xiàn)等。

6. @Conditional 系列注解(條件化注冊)

只有滿足條件時才創(chuàng)建 Bean。

@Bean
@ConditionalOnMissingBean(DataSource.class)
public DataSource dataSource() {
    return new HikariDataSource();
}

常見條件注解:

注解說明
@ConditionalOnClass類路徑存在某個類
@ConditionalOnMissingBean容器中沒有某個 Bean
@ConditionalOnProperty配置文件中有某個屬性
@ConditionalOnWebApplication是 Web 應(yīng)用
@ConditionalOnExpressionSpEL 表達式為 true

? 這是 Spring Boot 自動配置的核心機制。

7. 編程式注冊:BeanDefinitionRegistryPostProcessor

最強大、最靈活的方式,可以在容器啟動時動態(tài)注冊 Bean。

@Component
public class DynamicBeanRegistrar implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(UserService.class);
        AbstractBeanDefinition definition = builder.getBeanDefinition();
        registry.registerBeanDefinition("userService", definition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // do nothing
    }
}

? 適合插件化、動態(tài)加載、AOP 增強等場景。

8. XML 配置(傳統(tǒng)方式)

<bean id="userService" class="com.example.UserService"/>
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

? 現(xiàn)在已不推薦,但在老項目中仍可見。

總結(jié)對比

方式何時使用推薦度
@Component自己寫的類?????
@Configuration + @Bean第三方類、復(fù)雜配置?????
@ConfigurationProperties配置文件映射????
@Import模塊化導(dǎo)入???
FactoryBean復(fù)雜對象創(chuàng)建???
@Conditional條件注冊????(自動配置核心)
BeanDefinitionRegistryPostProcessor動態(tài)注冊??(高級)
XML老項目?

最佳實踐建議

  1. 優(yōu)先使用 @Component@Bean,簡單直接;
  2. 配置參數(shù)用 @ConfigurationProperties,類型安全;
  3. 避免重復(fù)注冊,善用 @ConditionalOnMissingBean
  4. 復(fù)雜邏輯用 @ImportFactoryBean;
  5. 動態(tài)場景用 BeanDefinitionRegistryPostProcessor(謹慎使用)。

以上就是Spring創(chuàng)建Bean的八種主要方式詳解的詳細內(nèi)容,更多關(guān)于Spring創(chuàng)建Bean方式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Maven?打包跳過Test目錄的三種解決方法

    Maven?打包跳過Test目錄的三種解決方法

    本文主要介紹了Maven?打包跳過Test目錄的三種解決方法,包括修改pom.xml跳過測試、命令行執(zhí)行跳過、IDEA設(shè)置跳過test目錄,感興趣的可以了解一下
    2025-05-05
  • 基于SpringBoot實現(xiàn)代碼在線運行工具

    基于SpringBoot實現(xiàn)代碼在線運行工具

    這篇文章主要介紹了如何利用SpringBoot實現(xiàn)簡單的代碼在線運行工具(類似于菜鳥工具),文中的示例代碼講解詳細,需要的可以參考一下
    2022-06-06
  • java eclipse 整個項目或包查找只定字符串并替換操作

    java eclipse 整個項目或包查找只定字符串并替換操作

    這篇文章主要介紹了java eclipse 整個項目或包查找只定字符串并替換操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 實例解析Java關(guān)于static的作用

    實例解析Java關(guān)于static的作用

    只要是有學(xué)過Java的都一定知道static,也一定能多多少少說出一些作用和注意事項。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Mybatis-plus中QueryWrapper的多種用法小結(jié)

    Mybatis-plus中QueryWrapper的多種用法小結(jié)

    本文主要介紹了Mybatis-plus中QueryWrapper的多種用法小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java工程使用ffmpeg進行音視頻格式轉(zhuǎn)換的實現(xiàn)

    Java工程使用ffmpeg進行音視頻格式轉(zhuǎn)換的實現(xiàn)

    FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序,本文主要介紹了Java工程使用ffmpeg進行音視頻格式轉(zhuǎn)換的實現(xiàn)
    2024-02-02
  • 淺談Springmvc中的頁面跳轉(zhuǎn)問題

    淺談Springmvc中的頁面跳轉(zhuǎn)問題

    這篇文章主要介紹了淺談Springmvc中的頁面跳轉(zhuǎn)問題,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • Java初學(xué)者常問的問題(推薦)

    Java初學(xué)者常問的問題(推薦)

    本文介紹一些Java初學(xué)者常問的問題,很多朋友對可以用%除以一個小數(shù)嗎? a += b 和 a = a + b 的效果有區(qū)別嗎? 聲明一個數(shù)組為什么需要花費大量時間? 為什么Java庫不用隨機pivot方式的快速排序?等等一系列問題有疑惑,下面就通過本文給大家詳細介紹下
    2017-03-03
  • SpringBoot集成RabbitMQ和概念介紹

    SpringBoot集成RabbitMQ和概念介紹

    這篇文章主要介紹了SpringBoot集成RabbitMQ和概念介紹,RabbitMQ即一個消息隊列,主要是用來實現(xiàn)應(yīng)用程序的異步和解耦,同時也能起到消息緩沖,消息分發(fā)的作用。更多相關(guān)內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-05-05
  • Java創(chuàng)建多線程異步執(zhí)行實現(xiàn)代碼解析

    Java創(chuàng)建多線程異步執(zhí)行實現(xiàn)代碼解析

    這篇文章主要介紹了Java創(chuàng)建多線程異步執(zhí)行實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07

最新評論

宜城市| 山东省| 云梦县| 合阳县| 芜湖县| 海阳市| 荣成市| 鄂尔多斯市| 宜阳县| 富宁县| 蒙阴县| 东台市| 大同县| 武宁县| 土默特左旗| 金堂县| 沁阳市| 永定县| 望都县| 万源市| 乌兰浩特市| 闽侯县| 宁南县| 九龙坡区| 云南省| 长兴县| 绥江县| 万全县| 万盛区| 台湾省| 日照市| 陇南市| 邵阳市| 肇源县| 汝阳县| 明星| 肇源县| 莱西市| 武陟县| 华容县| 文安县|