Springboot基礎篇(3):Bean管理

前言:Spring 通過掃描類路徑(Classpath)來查找帶有特定注解(如 @Component、@Service、@Repository 等)的類,并將它們注冊為 Spring 容器中的 Bean。

1 Bean掃描

  1. Bean 掃描是 Spring 框架的核心功能之一,通過注解和配置可以靈活控制 Bean 的注冊和掃描范圍
  2. Bean的掃描范圍:Spring Boot 默認會掃描主應用程序類(即帶有 @SpringBootApplication 注解的類)所在包及其子包中的所有組件【原因在第四點】
  3. 自定義掃描范圍:使用 @ComponentScan 注解指定要掃描的包路徑。
@SpringBootApplication
@ComponentScan(basePackages = {"com.example", "com.anotherpackage"})
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
  1. @SpringBootApplication 是一個組合注解,包含以下三個核心注解:
    @SpringBootConfiguration:標記該類為 Spring Boot 的配置類。
    @EnableAutoConfiguration:啟用 Spring Boot 的自動配置功能。
    @ComponentScan: 啟用組件掃描功能,默認掃描主應用程序類所在的包及其子包。
    在這里插入圖片描述

2 Bean注冊

2.1 概念

Bean 注冊是指將 Java 對象交給 Spring 容器管理,使其成為 Spring Bean 的過程

2.2 注冊方式

  1. 基于注解的注冊
/*
用于標注普通組件類。
Spring 會自動掃描并注冊該類為 Bean
*/
@Component
public class MyComponent {// 組件邏輯
}
/*
用于標注服務層組件。
是 @Component 的特化形式,語義上更明確
*/
@Service
public class MyService {// 服務邏輯
}
/*
很少用
用于標注數據訪問層(DAO)組件。
是 @Component 的特化形式,支持異常轉換
*/
@Repository
public class MyRepository {// 數據訪問邏輯
}
/*
用于標注控制器層組件(如 Spring MVC 控制器)。
是 @Component 的特化形式。
*/
@Controller
public class MyController {// 控制器邏輯
}
  1. 基于 XML 的 Bean 注冊:在早期的 Spring 版本中,Bean 通常通過 XML 配置文件注冊。雖然現在推薦使用注解,但 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 注冊一個 Bean --><bean id="myService" class="com.example.MyService"/>
</beans>
  1. 基于 Java 配置的 Bean 注冊:如果要注冊的bean對象來自于第三方(不是自定義的),是無法用 @Component 及衍生注解聲明bean的,此時需要在配置類中進行注冊

CommonConfig.java

@Configuration// 配置注解
public class CommonConfig {/*** @Bean注解標注的方法會被 Spring容器調用,并將返回值注冊為一個 Bean*/@Beanpublic Country country(){return new Country();}/*** 默認情況下,Bean 的名稱是方法名。你可以通過name或value屬性指定Bean的名稱。*/@Bean(name = "customService")public MyService myService() {//Bean 的名稱為 customService,而不是默認的 myService。return new MyService();}
}

SpringbootBeanRegisterApplication.java


/*
1@Import 是 Spring 框架中的一個注解,用于將其他配置類或組件類導入到當前配置類中
2@Import 可以標注在 @Configuration 類或 @Component 類上,用于導入其他配置類或組件類
3@Import 可以同時導入多個配置類。
4@Import 還可以導入實現了 ImportSelector 接口的類,用于動態選擇需要導入的配置類或組件類
*/
@Import(com.wfs.config.CommonImportSeletor.class)//使用@Import導入ImportSelector
//@Import(com.wfs.config.CommonConfig.class)
@SpringBootApplication
public class SpringbootBeanRegisterApplication {public static void main(String[] args) {ApplicationContext context =  SpringApplication.run(SpringbootBeanRegisterApplication.class, args);//獲取ioc容器Country country = context.getBean(Country.class);//獲取beanSystem.out.println(country);System.out.println(context.getBean("aa"));}

CommonImportSeletor.java

package com.wfs.config;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;/*** @ImportSelector:導入選擇器* 作用:導入指定配置類*/
public class CommonImportSeletor implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.wfs.config.CommonConfig"};}
}
  1. 條件化的 Bean 注冊:可以結合條件注解(如 @ConditionalOnProperty、@ConditionalOnClass 等)實現條件化的 Bean 注冊
@Configuration
public class CommonConfig {/*** 1 Bean對象的名字默認是方法名* 2 @Bean("aa")自定義對象名* 3 方法注入:Spring會自動將容器中的 Bean 注入到方法的參數中。* 4 使用@ConditionalOnProperty 條件注入:配置文件中前綴是province,屬性名為name的值若是wfs,則聲明此Bean* 5 @ConditionalOnMissingBean 當不存在當前類型的bean時,才聲明該bean* 6 @ConditionalOnClass 當classpath下存在指定類時,才聲明該bean* @return*/@Bean("aa")@ConditionalOnProperty(prefix = "province",name = "name" ,havingValue = "wfs")@ConditionalOnMissingBean@ConditionalOnClass(name = "com.wfs.config.CommonConfig")public Province province(@Value("${province.name}") String name,@Value("${province.direction}") String direction) {Province province = new Province();province.setName(name);province.setDirection(direction);return province;}
}

3 Bean的依賴注入

  1. 構造器注入:推薦的方式,適用于強制依賴。
@Service
public class MyService {private final MyRepository repository;@Autowiredpublic MyService(MyRepository repository) {this.repository = repository;}
}
  1. Setter 注入:適用于可選依賴
@Service
public class MyService {private MyRepository repository;@Autowiredpublic void setRepository(MyRepository repository) {this.repository = repository;}
}
  1. 字段注入:不推薦,因為不利于測試和代碼可讀性。
@Service
public class MyService {@Autowiredprivate MyRepository repository;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70736.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70736.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70736.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Metal 學習筆記二:3D模型

是什么讓一個好游戲更好玩&#xff1f;漂亮的圖像&#xff01;就像《神界&#xff1a;原罪2》&#xff0c;《暗黑破壞神3》以及《巫師3》等大作一樣&#xff0c;需要一個強大的程序團隊以及3D美術團隊強強合作。你在屏幕中看到正是3D模型使用自定義渲染繪制的結果。就像上一章你…

【算法】797. 差分

題目 797. 差分 思路 差分的實質是通過構造數組b減少時間復雜度&#xff0c;數組a為初始數據&#xff0c;構造數組b&#xff0c;數組a是b的前綴和&#xff0c;通過對數組b操作就可以實現數組a每個數加上c&#xff0c;而對數組b的操作在單位時間內即可完成&#xff0c;對數組…

解鎖狀態模式:Java 編程中的行為魔法

系列文章目錄 后續補充~~~ 文章目錄 一、狀態模式&#xff1a;概念與原理二、狀態模式的深度剖析&#xff08;一&#xff09;模式定義與核心思想&#xff08;二&#xff09;模式結構與角色 三、狀態模式的實際應用場景&#xff08;一&#xff09;電商系統中的訂單狀態管理&…

php 獲取head參數

php 獲取head參數 在PHP中&#xff0c;獲取HTTP頭部&#xff08;head&#xff09;參數可以通過不同的方式實現&#xff0c;下面為你詳細介紹幾種常見的方法。 1. 使用$_SERVER超全局變量 $_SERVER 是PHP中的一個超全局變量&#xff0c;它包含了諸如頭信息、路徑、腳本位置等…

數據結構與算法-圖論-最短路-拓展運用

選擇最佳路線 分析&#xff1a; 這是一道圖論中的最短路徑問題&#xff0c;目標是在給定的公交網絡中&#xff0c;找到從琪琪家附近的車站出發&#xff0c;到她朋友家附近車站&#xff08;編號為 s &#xff09;的最短時間。以下是對該問題的詳細分析&#xff1a; 問題關鍵信息…

AI知識架構之神經網絡

神經網絡:這是整個內容的主題,是一種模擬人類大腦神經元結構和功能的計算模型,在人工智能領域廣泛應用。基本概念:介紹神經網絡相關的基礎概念,為后續深入理解神經網絡做鋪墊。定義與起源: 神經網絡是模擬人類大腦神經元結構和功能的計算模型,其起源于對生物神經系統的研…

【江科協-STM32】5. 輸出比較

1. 輸出比較簡介 OC(Output Compare)輸出比較。 輸出比較可以通過CNT&#xff08;CNT計數器&#xff09;與CCR寄存器值的關系&#xff0c;來對輸出電平進行置1、置0或翻轉的操作&#xff0c;用于輸出一定頻率和占空比的PWM波形。 :::tip CNT計數器是正向計數器。它只能正向累…

C++ Primer 再探迭代器

歡迎閱讀我的 【CPrimer】專欄 專欄簡介&#xff1a;本專欄主要面向C初學者&#xff0c;解釋C的一些基本概念和基礎語言特性&#xff0c;涉及C標準庫的用法&#xff0c;面向對象特性&#xff0c;泛型特性高級用法。通過使用標準庫中定義的抽象設施&#xff0c;使你更加適應高級…

排查和解決線程池瓶頸問題案例

在分布式系統中&#xff0c;線程池的使用非常普遍&#xff0c;尤其是在處理異步任務時。然而&#xff0c;線程池的配置不當可能會導致性能瓶頸&#xff0c;進而影響系統的整體性能。本文將分享一個實際案例&#xff0c;介紹如何通過日志分析和線程池優化來解決系統中的性能瓶頸…

影響板材的熱導率有哪些因素?

板材熱導率受多種因素左右&#xff0c;可劃分為內部材料特性與外部環境條件兩大方面 內部材料特性 化學構成&#xff1a;不同化學元素及化合物組合形成的板材&#xff0c;熱導率表現大相徑庭&#xff1b;金屬板材&#xff0c;像銅與鋁&#xff0c;熱導率優異&#xff0c;這是…

給字符串加密解密

加密規則&#xff1a;輸入1a2b3c 輸出 abbccc 解密&#xff1a;輸入abbccc 輸出 1a2b3c 代碼&#xff1a; using System;namespace 加密解密 {class Program{static void Main(string[] args){Encryption("4b2a8p");Decryption("ppppppoovvv");Console.…

人工智能中的特征是什么?

什么是人工智能中的特征&#xff1f; 在人工智能中&#xff0c;特征&#xff08;feature&#xff09;是指從原始數據中提取出的、能夠代表數據關鍵信息并用于模型訓練的屬性或變量。特征通常是對原始數據的抽象或轉換&#xff0c;目的是捕捉數據中的模式、結構或相關性&#x…

20250226-代碼筆記05-class CVRP_Decoder

文章目錄 前言一、class CVRP_Decoder(nn.Module):__init__(self, **model_params)函數功能函數代碼 二、class CVRP_Decoder(nn.Module):set_kv(self, encoded_nodes)函數功能函數代碼 三、class CVRP_Decoder(nn.Module):set_q1(self, encoded_q1)函數功能函數代碼 四、class…

洛谷 P3628/SPOJ 15648 APIO2010 特別行動隊 Commando

題意 你有一支由 n n n 名預備役士兵組成的部隊&#xff0c;士兵從 1 1 1 到 n n n 編號&#xff0c;你要將他們拆分成若干特別行動隊調入戰場。出于默契的考慮&#xff0c;同一支特別行動隊中隊員的編號應該連續&#xff0c;即為形如 i , i 1 , ? , i k i, i 1, \cdo…

PCL源碼分析:曲面法向量采樣

文章目錄 一、簡介二、源碼分析三、實現效果參考資料一、簡介 曲面法向量點云采樣,整個過程如下所述: 1、空間劃分:使用遞歸方法將點云劃分為更小的區域, 每次劃分選擇一個維度(X、Y 或 Z),將點云分為兩部分,直到劃分區域內的點少于我們指定的數量,開始進行區域隨機采…

Go語言--語法基礎2--下載安裝

2、下載安裝 1、下載源碼包&#xff1a; go1.18.4.linux-amd64.tar.gz。 官方地址&#xff1a;https://golang.google.cn/dl/ 云盤地址&#xff1a;鏈接&#xff1a; https://pan.baidu.com/s/1N2jrRHaPibvmmNFep3VYag 提 取碼&#xff1a; zkc3 2、將下載的源碼包解壓…

lowagie(itext)老版本手繪PDF,包含頁碼、水印、圖片、復選框、復雜行列合并等。

入口類&#xff1a;exportPdf ? package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowa…

3-2 WPS JS宏 工作簿的打開與保存(模板批量另存為工作)學習筆記

************************************************************************************************************** 點擊進入 -我要自學網-國內領先的專業視頻教程學習網站 *******************************************************************************************…

Ubuntu20.04之VNC的安裝使用與常見問題

Ubuntu20.04之VNC的安裝與使用 安裝圖形桌面選擇安裝gnome桌面選擇安裝xface桌面 VNC-Server安裝配置開機自啟 VNC Clientroot用戶無法登入問題臨時方案永久方案 安裝圖形桌面 Ubuntu20.04主流的圖形桌面有gnome和xface兩種&#xff0c;兩種桌面的安裝方式我都會寫&#xff0c…

Day46 反轉字符串

I. 編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。 不要給另外的數組分配額外的空間&#xff0c;你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 class Solution {public void reverseString(char[] s) {int i …