學習springboot-Bean管理(Bean 注冊,Bean 掃描)

Bean?掃描

可以瀏覽下面的博客鏈接 :spring 學習 (注解)-CSDN博客

在學習spring 注解時,我們使用 @Component ,@Service,@Controller等 這樣的注解,將目標類信息,傳遞給IOC容器,為其創建對象


那時候掃描,解析為目標類創建對象的注解 有兩者辦法

1 spring 配置文件 中 使用<context :component-scan >標簽 ,在標簽,表明需要掃描哪一個包下的注解,明確 包名。

<context:component-scan base-package="fs">
</context:component-scan>

2 使用注解 掃描

// @Configuration 注解表示當前類是一個配置類,用來代替xml配置文件
@Configuration
// @ComponentScan 注解表示掃描包,用來代替xml配置文件
// basePackages 屬性表示掃描的包
@ComponentScan(basePackages ="fs.exerise")

學習 springBoot 時,發現我們同樣也需要使用很多注解像@Mapper,@RestController,@RequstMapping等...?


思考

1springboot 是spring 家族中的,按理來說也應該存在 掃描注解的。比如@ComponentScan ?

答:在springboot 中確實存在 掃描?,解析的注解。只是被隱藏在 @SpringBootApplication 組成注解中

啟動類

鼠標點擊, @SpringBootApplication 組成注解 按ctrl+b? ,看到 該注解的底層代碼


demo(案例)

驗證 :使用的注解的可以被掃描的范圍是啟動類所在包及其子包

  • 啟動類所在包在 springboot01 包下

  • 運行截圖


修改:移動 controller 包到 heima 包下和 springboot 01包平級

發現:controller 包掃描不到。因此報了一個404 錯誤 !表示服務器 無法訪問


解決辦法

擴大 掃描范圍,將范圍擴展到heima 包下

運行截圖


總結

1 在springboot 項目中,我們只管寫各自注解 ,至于被使用的注解的掃描,解析過程,將交由springboot 自動完成,不需要我們人為操作。

2 springboot 項目中可以被掃描的范圍是 默認是 啟動類所在包及其子包


Bean 注冊

目的:這里主要研究第三方 jar 對象【非自定義 對象】怎么注入到loc容器

看到這里,我們知道在學習 spring 時使用注解來注冊bean 有:

思考

1 把三方jar 包 bean 對象注入到loc容器 使用這些注解 是否可行呢?

舉例:打開springboot項目的外部庫,任意一個 字節碼文件,都是只讀的。你無法在該類上使用上面說的 bean 注冊的注解。

解決辦法

1 @Bean 注解

功能:將目的對象以方法返回值的形式,傳遞給ioc 容器

@Bean 的使用

1?@Bean 默認方法名就是bean的id 將方法的返回值傳遞給ioc 容器

demo(案例)

目的:使用@ Bean 注解,將Country 對象傳遞給spring 容器

項目準備

1? 使用 黑馬視頻教學使用的第三方jar 包 ,通過網盤分享的文件:02_Bean注冊資料.rar
鏈接: https://pan.baidu.com/s/1rYC0mgIp_eWvdD6h2k015Q 提取碼: mdpv

2 解壓 文件

3 打開 本地倉庫文件 修改jar包的所在路徑

4 打開命令行在確保maven 環境配置好的情況下,運行該命令

  • 把這個jar 包下載到本地倉庫

5 打開自己的本地倉庫,可以看到 已經下好的jar包

6 打開IDEA 構建springboot 項目,在pom 文件添加已經下載的jar包坐標,最好加載成功

        <dependency><groupId>cn.itcast</groupId><artifactId>common-pojo</artifactId><version>1.0</version></dependency>

7 使用@ Bean 注解,將Country ,Provice對象傳遞給spring 容器

正式步驟

1 一個config 包,創建ComonConfig 類作為配置類

package com.it.heima.springboot03.config;import cn.itcast.pojo.Country;
import cn.itcast.pojo.Province;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ComonConfig {@Beanpublic Country getCountry(){return new Country();}@Beanpublic Province getProvince() {return new Province();}
}

2 啟動類中,調用getBean方法,id為默認的方法名

package com.it.heima.springboot03;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Springboot03Application {public static void main(String[] args) {ApplicationContext run = SpringApplication.run(Springboot03Application.class, args);System.out.println(run.getBean("getCountry"));System.out.println("--------------------------------");System.out.println(run.getBean("getProvince"));}}

3 運行截圖

  • 發現 Country 對象,Province 對象已經創建成功


2 @import 注解

使用方式

1 導入配置類

問題: 假設 我們把之前創建的配置類移動到啟動類所在包之外,再一次運行代碼很顯然因為掃描不到配置類,從而無法從ioc容器 獲得 對象,而報錯

解決辦法:在啟動類 使用@import 注解,注解中寫入 配置類的字節碼文件


2 導入ImportSelector 接口實現類

應用場景:如果存在許多 配置類需要導入

  • CommonImportSelector 接口實現類

  • 啟動類中使用 @Import 注解 ,注解中使用接口實現類的字節碼文件

package com.it.heima.springboot03;import com.it.heima.config.ComonConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;//@Import(ComonConfig.class)
@Import(CommonImportSelector.class)
@SpringBootApplication
public class Springboot03Application {public static void main(String[] args) {ApplicationContext run = SpringApplication.run(Springboot03Application.class, args);System.out.println(run.getBean("getCountry"));System.out.println("--------------------------------");System.out.println(run.getBean("getProvince"));}}
  • 運行截圖


更新

在ImportSelector 接口實現類 中把配置類的權限定類名存儲在 配置文件

package com.it.heima.springboot03;import com.it.heima.config.ComonConfig;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;public class CommonImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {InputStream resourceAsStream = CommonImportSelector.class.getClassLoader().getResourceAsStream("config.properties");BufferedReader in = new BufferedReader(new InputStreamReader(resourceAsStream));String line = null;List<String> list = new ArrayList<>();try {while ((line = in.readLine()) != null) {list.add(line);}} catch (Exception e) {e.printStackTrace();}finally {if (in != null){try {in.close();} catch (Exception e) {e.printStackTrace();}}}return list.toArray(new String[0]);}
}

運行截圖


修改啟動類中的 @Import(CommonImportSelector.class),把它試圖變成 組合注解

  • 如下圖所示 allCommon組合注解 具備以下三個注解的所有功能
package com.it.heima.springboot03;import org.springframework.context.annotation.Import;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 作用在類上
@Target({ElementType.TYPE})
// 保留到運行時
@Retention(RetentionPolicy.RUNTIME)
@Import(CommonImportSelector.class)
public @interface allCommon {
}

啟動類中

運行截圖

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

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

相關文章

spring中將yaml文件轉換為Properties

文章目錄 一 &#xff0c;概述二&#xff0c;源碼 一 &#xff0c;概述 借助于spring框架&#xff0c;將yaml文件轉換為Properties 二&#xff0c;源碼 import java.util.Properties;import org.junit.Test; import org.springframework.beans.factory.config.YamlPropertie…

c++ 中的float和double 的區別 開發過程中使用哪個更好

在 C 中&#xff0c;float 和 double 都是用于表示浮點數的數據類型&#xff0c;但它們在精度、存儲空間和性能方面有所不同。 1. float 和 double 的主要區別 特性floatdouble占用內存4 字節&#xff08;32 位&#xff09;8 字節&#xff08;64 位&#xff09;精度約 6-7 位有…

OpenAI智能體初探:使用 OpenAI Responses API 在 PDF 中實現檢索增強生成(RAG)

大家好,我是大 F,深耕AI算法十余年,互聯網大廠技術崗。 知行合一,不寫水文,喜歡可關注,分享AI算法干貨、技術心得。 歡迎關注《大模型理論和實戰》、《DeepSeek技術解析和實戰》,一起探索技術的無限可能! 引子 在信息爆炸的時代,從大量 PDF 文檔中快速準確地檢索信息…

【MySQL】基本操作 —— DDL

目錄 DDLDDL 常用操作對數據庫的常用操作查看所有數據庫創建數據庫切換、顯示當前數據庫刪除數據庫修改數據庫編碼 對表的常用操作創建表數據類型數值類型日期和時間類型字符串類型 查看當前數據庫所有表查看指定表的創建語句查看指定表結構刪除表 對表結構的常用操作給表添加字…

工廠模式加策略模式 -- 具體實現

這里寫目錄標題 定義接口定義抽象類定義主處理器分支處理器定義工廠demo 定義接口 public interface EntityHandler extends InitializingBean {MatchContentDTO match(MatchEntityDTO matchEntityDTO);String supportEntityType(); }定義抽象類 public abstract class Abstr…

基于Spring Boot的網上寵物店系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

PHPCMS V9 登錄加密改造

要改造 phpcms 的后臺登錄&#xff0c;使其前端使用加密方式提交&#xff0c;后端解密&#xff0c;你可以采用 RSA 非對稱加密 或 AES 對稱加密 方式來增強安全性。 方案設計 前端加密 生成公私鑰對&#xff08;推薦使用 RSA&#xff09;。前端使用公鑰加密密碼&#xff0c;然…

LeetCode 滑動數組統計+至少 2962. 統計最大元素出現至少 K 次的子數組

2962. 統計最大元素出現至少 K 次的子數組 給你一個整數數組 nums 和一個 正整數 k 。 請你統計有多少滿足 「 nums 中的 最大 元素」至少出現 k 次的子數組&#xff0c;并返回滿足這一條件的子數組的數目。 子數組是數組中的一個連續元素序列。 示例 1&#xff1a; 輸入&#…

FANUC機器人幾種常用的通訊網絡及接口

FANUC機器人幾種常用的通訊網絡及接口 Devicenet 網絡通訊接口&#xff0c;接口為5針線 (規定用的機架為 81-84&#xff09; PROFIBUS 網絡通訊接口&#xff0c;針腳為2針&#xff08;規定用的機架為 67&#xff09; Intemet 網絡通訊接口&#xff08;常用的網線接口&#xf…

CentOS8+Zabbix7.2.4解決中文顯示問題

#cd /usr/share/zabbix/ui/include/ #grep graphfont defines.inc.php define(‘ZBX_GRAPH_FONT_NAME’, ‘graphfont’); // font file name define(‘ZBX_FONT_NAME’, ‘graphfont’); #ll /usr/share/zabbix/ui/assets/fonts/graphfont.ttf lrwxrwxrwx. 1 root root 36 3…

AI自動化編程初探

先說vscodeclinemodelscope方案&#xff0c;后面體驗trae或者cursor再寫寫其它的。vscode和trae方案目前來說是免費的&#xff0c;cursor要用claud需要付費&#xff0c;而且不便宜&#xff0c;當然效果可能是最好的。 vscode方案&#xff0c;我的經驗是最好在ubuntu上&#xff…

101.在 Vue 3 + OpenLayers 使用 declutter 避免文字標簽重疊

1. 前言 在使用 OpenLayers 進行地圖開發時&#xff0c;我們經常需要在地圖上添加點、線、區域等圖形&#xff0c;并給它們附加文字標簽。但當地圖上的標注較多時&#xff0c;文字標簽可能會發生重疊&#xff0c;導致用戶無法清晰地查看地圖信息。 幸運的是&#xff0c;OpenL…

18天 - 常見的 HTTP 狀態碼有哪些?HTTP 請求包含哪些內容,請求頭和請求體有哪些類型?HTTP 中 GET 和 POST 的區別是什么?

常見的 HTTP 狀態碼有哪些&#xff1f; HTTP 狀態碼用于指示服務器對客戶端請求的響應結果&#xff0c;常見的 HTTP 狀態碼可以分為以下幾類&#xff1a; 1. 信息類&#xff08;1xx&#xff09; 100 Continue&#xff1a;客戶端應繼續發送請求。101 Switching Protocols&…

IXTUR氣控永磁鐵:以高精度氣控和穩定磁場,為機器人應用提供穩定抓取力

在現代工業生產和物流領域&#xff0c;物料的抓取與搬運是影響生產效率和成本控制的重要環節。傳統夾爪在面對不同材質、形狀和重量的物體時&#xff0c;常常存在適應性差、抓取不穩定、操作復雜等問題&#xff0c;導致生產流程中頻繁出現停機調整&#xff0c;增加了人工干預成…

江科大51單片機筆記【16】AD/DA轉換(下)

寫在前言 此為博主自學江科大51單片機&#xff08;B站&#xff09;的筆記&#xff0c;方便后續重溫知識 在后面的章節中&#xff0c;為了防止篇幅過長和易于查找&#xff0c;我把一個小節分成兩部分來發&#xff0c;上章節主要是關于本節課的硬件介紹、電路圖、原理圖等理論知識…

【C++】 —— 筆試刷題day_4

刷題day_4 繼續加油&#xff01;&#xff01;&#xff01; 一、Fibonacci數列 題目鏈接&#xff1a;Fibonacci數列 題目解析 題目要求&#xff0c;輸入一個數N&#xff0c;我們可以對N進行1/-1操作&#xff1b;題目讓我們輸出對N進行至少多少步可以變成Fibonacci數。 這里題目…

IP層之分片包的整合處理---BUG修復

在之前章節中&#xff0c;筆者就IP層之分片包的整合處理進行了概念介紹&#xff0c;以及代碼編寫和仿真&#xff0c;在整體代碼調試環節&#xff0c;筆者發現了一個問題&#xff0c;在本文中&#xff0c;筆者將就這個BUG進行說明&#xff0c;以及進行修復&#xff0c;講解代碼實…

修復Electron項目Insecure Content-Security-Policy(內容安全策略CSP)警告的問題

將以下代碼粘貼進html的<header>標簽內 <metahttp-equiv"Content-Security-Policy"content"default-src self; style-src self unsafe-inline; img-src self data:; "> 解釋一下上面代碼中的屬性含義 default-src self&#xff1a;配置加載策…

linux 的免密切換用戶PAM配置

/etc/pam.d/su是Linux系統中與用戶切換&#xff08;su命令&#xff09;相關的PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插拔認證模塊&#xff09;配置文件。以下是對它的詳細介紹&#xff1a; 簡介 作用 PAM是一種用于管理系統認證的機制&#xff0c;…

pyspark 數據處理的三種方式RDD、DataFrame、Spark SQL案例

目錄 一、淺語二、三種數據處理方式比較2.1 RDD2.2 DataFrame2.3 Spark SQL 三、三種方法的創建方式3.1 創建RDD3.2 創建DataFrame3.2.1 創建sqlContext3.2.2 定義Schema3.2.3 創建DataFrame 3.3 創建SparkSQL3.3.1 登錄臨時表3.3.2 使用sparkSQL 四、三種方法顯示部分字段4.1 …