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

詳解Java spring 中類注冊六種方式

 更新時間:2025年09月28日 11:49:11   作者:伯恩bourne  
在Spring中,將類注冊為容器管理的Bean有多種方式,涵蓋注解驅(qū)動、配置類、XML、動態(tài)注冊等場景,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

在 Spring 中,將類注冊為容器管理的 Bean 有多種方式,涵蓋注解驅(qū)動、配置類、XML、動態(tài)注冊等場景。以下是包含 @Component 及其派生注解在內(nèi)的完整注冊方法分類:

一、@Component及其派生注解(注解驅(qū)動自動掃描)

這是最常用的聲明式注冊方式,通過類級別注解讓 Spring 自動掃描并注冊 Bean,適合自定義業(yè)務類(無需手動配置,依賴 Spring 的組件掃描機制)。

核心注解:

  • @Component:基礎注解,標識一個“組件”,適用于任何層;
  • @Service@Component 的派生注解,標識“業(yè)務邏輯層”(如 UserService);
  • @Controller@Component 的派生注解,標識“控制層”(如 Spring MVC 的 UserController);
  • @Repository@Component 的派生注解,標識“數(shù)據(jù)訪問層”(如 DAO 類),并支持自動轉(zhuǎn)換數(shù)據(jù)庫異常。

用法:

  1. 在類上添加上述注解;
  2. 在配置類中通過 @ComponentScan 指定掃描路徑(Spring Boot 項目默認掃描主類所在包及其子包)。
// 1. 用 @Service 注冊業(yè)務層類
@Service
public class UserService {
    // 業(yè)務邏輯...
}
// 2. 用 @Controller 注冊控制層類
@Controller
public class UserController {
    // 請求處理...
}
// 3. 配置類指定掃描路徑(非 Spring Boot 項目需顯式配置)
@Configuration
@ComponentScan(basePackages = "com.example.service") // 掃描指定包下的注解類
public class AppConfig {
}

特點:

  • 自動掃描注冊,無需手動創(chuàng)建實例;
  • 默認是單例 Bean,可通過 @Scope("prototype") 改為多例;
  • 派生注解僅用于語義區(qū)分,功能與 @Component 一致。

二、通過 Java 配置類(@Configuration+@Bean)

這是手動聲明式注冊的核心方式,尤其適合注冊第三方類(如開源庫中的 RedisTemplate、RestTemplate,無法直接添加 @Component 注解)或需要復雜初始化邏輯的類。

用法:

  1. 創(chuàng)建標注 @Configuration 的配置類;
  2. 在方法上標注 @Bean,方法返回值即為要注冊的 Bean 實例。
@Configuration
public class AppConfig {
    // 注冊第三方類(如 RedisTemplate)
    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory()); // 依賴其他 Bean
        return template;
    }
    // 注冊自定義類,支持復雜初始化
    @Bean(name = "userService") // 自定義 Bean 名稱
    public UserService createUserService() {
        UserService service = new UserService();
        service.setDao(userDao()); // 調(diào)用其他 @Bean 方法注入依賴
        return service;
    }
}

特點:

  • 方法名默認作為 Bean 名稱(可通過 @Bean(name = "xxx") 自定義);
  • 支持依賴注入:方法參數(shù)會自動從容器中獲取對應的 Bean;
  • 靈活性高,可在方法內(nèi)編寫任意初始化邏輯(如設置屬性、調(diào)用初始化方法)。

三、通過 XML 配置文件(傳統(tǒng)配置方式)

這是 Spring 早期的經(jīng)典注冊方式,通過 XML 標簽定義 Bean,適合需要集中管理配置的傳統(tǒng)項目(現(xiàn)在已較少使用,但仍需了解)。

用法:

在 XML 配置文件中使用 <bean> 標簽:

<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 注冊自定義類 -->
    <bean id="userService" class="com.example.UserService">
        <!-- 通過 setter 注入依賴 -->
        <property name="userDao" ref="userDao"/>
    </bean>
    <!-- 注冊第三方類 -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="redisConnectionFactory"/>
    </bean>
</beans>

特點:

  • 通過 id 指定 Bean 名稱,class 指定全類名;
  • 支持構(gòu)造器注入(<constructor-arg>)、setter 注入(<property>);
  • 需要在 Spring 啟動時加載 XML 配置文件(如 new ClassPathXmlApplicationContext("applicationContext.xml"))。

四、通過@Import注解(批量/動態(tài)導入)

@Import 用于批量導入 Bean 定義,可直接導入類、配置類或通過接口動態(tài)選擇類,適合模塊化開發(fā)或動態(tài)注冊場景。

用法:

  1. 直接導入普通類:被導入的類會被直接注冊為 Bean(默認名稱為全類名);
  2. 導入 @Configuration 配置類:合并多個配置類的 Bean 定義;
  3. 導入 ImportSelector 實現(xiàn)類:動態(tài)返回需要注冊的類名數(shù)組;
  4. 導入 ImportBeanDefinitionRegistrar 實現(xiàn)類:手動注冊 Bean 定義。
// 1. 直接導入普通類
@Import({UserService.class, OrderService.class})
@Configuration
public class MainConfig {
    // UserService 和 OrderService 會被注冊為 Bean
}
// 2. 導入配置類(合并 AppConfig 的 Bean 定義)
@Import(AppConfig.class)
@Configuration
public class MainConfig2 {
}
// 3. 動態(tài)導入(實現(xiàn) ImportSelector)
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata metadata) {
        // 根據(jù)條件返回要注冊的類的全類名
        return new String[]{"com.example.RoleService", "com.example.PermissionService"};
    }
}
@Import(MyImportSelector.class)
@Configuration
public class MainConfig3 {
}

五、通過BeanDefinitionRegistryPostProcessor(底層動態(tài)注冊)

這是最靈活的底層注冊方式,可在 Spring 容器初始化過程中手動向 BeanDefinitionRegistry 注冊 Bean 定義,適合動態(tài)生成 Bean(如根據(jù)數(shù)據(jù)庫配置創(chuàng)建數(shù)據(jù)源、框架開發(fā)中動態(tài)注冊組件)。

用法:

實現(xiàn) BeanDefinitionRegistryPostProcessor 接口,重寫 postProcessBeanDefinitionRegistry 方法:

@Component
public class MyBeanRegistry implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        // 1. 定義 Bean 信息(類、作用域、初始化方法等)
        RootBeanDefinition definition = new RootBeanDefinition(UserService.class);
        definition.setScope(BeanDefinition.SCOPE_SINGLETON); // 單例
        definition.getPropertyValues().add("userDao", new UserDao()); // 設置屬性
        // 2. 注冊 Bean(參數(shù):Bean 名稱、Bean 定義)
        registry.registerBeanDefinition("userService", definition);
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // 無需額外實現(xiàn)
    }
}

特點:

  • 完全手動控制 Bean 的定義(如構(gòu)造器參數(shù)、屬性、初始化/銷毀方法);
  • 執(zhí)行時機早于其他注冊方式,可覆蓋已注冊的 Bean 定義。

六、通過@Conditional系列注解(條件注冊)

這是條件篩選式注冊,可結(jié)合上述任意方式(如 @Component、@Bean根據(jù)條件決定是否注冊 Bean,適合多環(huán)境適配(如開發(fā)/生產(chǎn)環(huán)境注冊不同實現(xiàn)類)。

常見條件注解:

  • @ConditionalOnClass:類路徑中存在指定類時注冊;
  • @ConditionalOnMissingBean:容器中不存在指定 Bean 時注冊;
  • @ConditionalOnProperty:配置文件中存在指定屬性且值匹配時注冊;
  • @ConditionalOnWebApplication:在 Web 應用環(huán)境中注冊。

用法:

@Configuration
public class AppConfig {
    // 僅當類路徑中有 RedisTemplate 時注冊
    @Bean
    @ConditionalOnClass(RedisTemplate.class)
    public CacheService cacheService() {
        return new CacheService();
    }
    // 僅當配置文件中 "feature.enabled=true" 時注冊
    @Component
    @ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
    public class FeatureService {
    }
}

總結(jié):不同注冊方式的適用場景

注冊方式核心場景靈活性推薦度
@Component 及其派生自定義業(yè)務類(控制層、服務層、數(shù)據(jù)層)★★★★★
@Configuration + @Bean第三方類、復雜初始化邏輯的類★★★★★
XML 配置傳統(tǒng)項目、需要集中管理配置的場景★★☆☆☆
@Import 及動態(tài)選擇器批量注冊、模塊化配置、動態(tài)條件注冊★★★☆☆
BeanDefinitionRegistryPostProcessor底層動態(tài)生成 Bean(框架開發(fā))極高★★☆☆☆
@Conditional 系列多環(huán)境適配、條件性注冊★★★★☆

實際開發(fā)中,優(yōu)先使用 @Component 系列(自定義類)和 @Bean(第三方類),其他方式根據(jù)特殊需求(如動態(tài)注冊、多環(huán)境適配)選擇。

到此這篇關于詳解Java spring 中類注冊六種方式的文章就介紹到這了,更多相關java spring類注冊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot結(jié)合ehcache防止惡意刷新請求的實現(xiàn)

    springboot結(jié)合ehcache防止惡意刷新請求的實現(xiàn)

    這篇文章主要介紹了springboot結(jié)合ehcache防止惡意刷新請求的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • springboot多數(shù)據(jù)源配置及切換的示例代碼詳解

    springboot多數(shù)據(jù)源配置及切換的示例代碼詳解

    這篇文章主要介紹了springboot多數(shù)據(jù)源配置及切換,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 詳解Mybatis極其(最)簡(好)單(用)的一個分頁插件

    詳解Mybatis極其(最)簡(好)單(用)的一個分頁插件

    這篇文章主要介紹了詳解Mybatis極其(最)簡(好)單(用)的一個分頁插件,非常具有實用價值,需要的朋友可以參考下。
    2016-12-12
  • Springboot整合LangChain4j 全流程

    Springboot整合LangChain4j 全流程

    LangChain4j是一個專為Java生態(tài)打造的大語言模型應用開發(fā)框架,支持多種模型提供商,具備豐富的功能模塊,如對話記憶、RAG管道支持、結(jié)構(gòu)化輸出等,這篇文章給大家介紹Springboot整合LangChain4j的全流程,感興趣的朋友跟隨小編一起看看吧
    2026-05-05
  • Jmeter對接口測試入?yún)崿F(xiàn)MD5加密

    Jmeter對接口測試入?yún)崿F(xiàn)MD5加密

    這篇文章主要介紹了Jmeter對接口測試入?yún)崿F(xiàn)MD5加密,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 使用Jackson-json解析一個嵌套的json字符串

    使用Jackson-json解析一個嵌套的json字符串

    這篇文章主要介紹了使用Jackson-json解析一個嵌套的json字符串,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Boot CLI使用教程

    Spring Boot CLI使用教程

    本篇文章主要介紹了Spring Boot CLI使用教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Spring Boot 整合 Minio 實現(xiàn)高效文件存儲解決方案(本地和線上)

    Spring Boot 整合 Minio 實現(xiàn)高效文件存儲解決方案(本地和線上)

    Minio 是一個高性能的分布式對象存儲系統(tǒng),專為云原生應用而設計,本文將詳細介紹如何在Spring Boot項目中集成Minio實現(xiàn)高效文件存儲,實現(xiàn)文件的上傳、下載、刪除等核心功能,感興趣的朋友一起看看吧
    2025-08-08
  • Java 創(chuàng)建URL的常見問題及解決方案

    Java 創(chuàng)建URL的常見問題及解決方案

    這篇文章主要介紹了Java 創(chuàng)建URL的常見問題及解決方案的相關資料,需要的朋友可以參考下
    2016-10-10
  • 詳解Http協(xié)議以及post與get區(qū)別

    詳解Http協(xié)議以及post與get區(qū)別

    這篇文章主要介紹了詳解Http協(xié)議以及post與get區(qū)別,通過分別說明Http協(xié)議以及get與post各自的概念,再到兩者作比較有著詳細的說明,希望對你有所幫助
    2021-06-06

最新評論

福建省| 晋中市| 绥德县| 密山市| 大荔县| 淮南市| 法库县| 公安县| 衡山县| 乐昌市| 安多县| 竹山县| 宜丰县| 平顶山市| 龙口市| 丽水市| 阿克陶县| 通化县| 仁寿县| 扎兰屯市| 晋中市| 汉川市| 柳江县| 松江区| 衡水市| 曲阜市| 吉林市| 南乐县| 辽阳市| 乌拉特后旗| 竹山县| 开封市| 鲁甸县| 阜城县| 金昌市| 龙海市| 阜平县| 通化市| 德令哈市| 泰安市| 垦利县|