Spring底層原理之bean的加載方式八 BeanDefinitionRegistryPostProcessor注解

BeanDefinitionRegistryPostProcessor注解

這種方式和第七種比較像

要實現兩個方法

第一個方法是實現工廠

第二個方法叫后處理bean注冊

package com.bigdata1421.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}}

跟之前的寫法一樣

package com.bigdata1421.bean;import com.bigdata1421.bean.service.impl.BookServiceImpl1;
import com.bigdata1421.bean.service.impl.BookServiceImpl2;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;public class MyRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {BeanDefinition beanDefinition= BeanDefinitionBuilder.rootBeanDefinition(BookServiceImpl2.class).getBeanDefinition();registry.registerBeanDefinition("yellow",beanDefinition);}}

我們操作配置類

我們首先Config8注入一個新的

類加載器

package com.bigdata1421.config;import com.bigdata1421.bean.service.BookService;
import com.bigdata1421.bean.service.impl.BookServiceImpl1;
import org.springframework.context.annotation.Import;@Import(BookServiceImpl1.class)
public class SpringConfig8 {
}

我寫一個APP8去拿bean

package com.bigdata1421.bean.app;import com.bigdata1421.bean.service.BookService;
import com.bigdata1421.config.SpringConfig7;
import com.bigdata1421.config.SpringConfig8;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App8 {public static void main(String[] args) {ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig8.class);BookService bookService = ctx.getBean("bookService", BookService.class);bookService.check();}
}

看一下業務層的實現類

package com.bigdata1421.bean.service.impl;import com.bigdata1421.bean.service.BookService;
import org.springframework.stereotype.Service;@Service("bookService")
public class BookServiceImpl1 implements BookService {@Overridepublic void check() {System.out.println("1");}
}

名字叫bookService

運行

打印

這里我們導入一個bean

這就相當于有人在系統中已經定義好了

我們現在用register注冊bean

我們這時候注入兩個bean

package com.bigdata1421.config;import com.bigdata1421.bean.MyRegistrar;
import com.bigdata1421.bean.service.BookService;
import com.bigdata1421.bean.service.impl.BookServiceImpl1;
import org.springframework.context.annotation.Import;@Import({BookServiceImpl1.class, MyRegistrar.class})
public class SpringConfig8 {}

Myregistrar里面是這樣寫的

思考

我們在這邊注入的是兩個類加載器

bean是同一個bean

但無論我們怎么調換順序

都是打印的這個

這種加載bean的順序是有講究的

小結

在Spring框架中,Bean的底層數據結構通常是使用HashMap或ConcurrentHashMap來存儲的。具體來說,Spring使用一個名為BeanFactory的接口來管理Bean,其默認實現是DefaultListableBeanFactory,它內部使用一個ConcurrentHashMap來存儲所有的Bean實例,以及它們的相關信息。

這種設計使得Spring能夠高效地管理大量的Bean,并且支持并發訪問。通過HashMap或ConcurrentHashMap,Spring能夠根據Bean的名稱或類型快速查找和訪問相應的Bean實例,同時還能夠處理Bean的依賴注入和生命周期管理等功能。

ConcurrentHashMap 是 Java 中的一個線程安全的哈希表實現,它是對 HashMap 的改進版本,專門用于在多線程環境下進行并發操作。

主要特點包括:

  1. 分段鎖設計

    • ConcurrentHashMap 內部通過將整個 Map 分割為多個 Segment(段),每個 Segment 默認是一個 HashEntry 數組,各自維護一部分數據,因此不同 Segment 的數據可以同時被多個線程訪問,提高了并發訪問效率。

    • 每個 Segment 內部都是一個類似于 HashMap 的結構,使用 synchronized 關鍵字來保證線程安全。

  2. 線程安全性

    • ConcurrentHashMap 允許多個線程同時讀取,不會出現讀取數據時的阻塞情況(非阻塞讀取)。

    • 對于寫操作(put、remove 等),只會鎖住相關的 Segment,而不是整個 Map,因此多個線程可以同時執行寫操作,從而提高了寫操作的并發性能。

  3. 適用場景

    • ConcurrentHashMap 特別適用于多線程并發訪問的場景,例如在高并發的 Web 應用中,作為緩存或者共享數據的存儲結構,能夠提供較好的性能表現。

    • 在 Java 并發框架中,ConcurrentHashMap 是非常重要的組成部分,被廣泛應用于各種需要高效并發訪問的場景。

  4. 迭代器特性

    • ConcurrentHashMap 的迭代器是弱一致性的(Weakly Consistent),即迭代器可以讀取到其他線程改變后的數據,但不會拋出 ConcurrentModificationException 異常,因此可以在遍歷的同時進行修改操作,但可能會讀取到一些舊數據。

總體來說,ConcurrentHashMap 通過分段鎖和優化的數據結構設計,實現了在高并發情況下的高效讀寫操作,是 Java 并發編程中常用的工具之一。

個人號推廣

博客主頁

朱道陽-CSDN博客

Web后端開發

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端開發

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

數據庫開發

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

項目實戰

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法與數據結構

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

計算機基礎

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回憶錄

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

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

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

相關文章

解決idea中git無法管理項目中所有需要管理的文件

點擊文件->設置 選擇版本控制—>目錄映射 點擊加號 設置整個項目被Git管理

【python入門】自定義函數

文章目錄 定義自定義函數的基本語法參數類型示例代碼函數作用域匿名函數(Lambda)閉包裝飾器 Python中的自定義函數允許你編寫一段可重用的代碼塊,這段代碼可以帶參數(輸入),并可能返回一個值(輸…

MySQL高級-事務-并發事務演示及隔離級別

文章目錄 0、四種隔離級別1、創建表 account2、修改當前會話隔離級別為 read uncommitted2.1、會出現臟讀 3、修改當前會話隔離級別為 read committed3.1、可以解決臟讀3.2、會出現不可重復讀 4、修改當前會話隔離級別為 repeatable read(默認)4.1、解決…

解決docker鏡像pull失敗的有效

機器環境 本實踐將在 Ubuntu 22.04.3LTS 系統上進行測試 docker 版本Docker Engine - Community 24.0.6 ,原則上docker版本無影響 本實踐進僅學習研究使用,無作他用途。 背景 曾幾何時,docker鏡像的拉去會失敗,網速會慢&#xff0…

代碼隨想錄算法訓練營第五十三天| 739. 每日溫度、 496.下一個更大元素 I、503.下一個更大元素II

LeetCode 739. 每日溫度 題目鏈接:https://leetcode.cn/problems/daily-temperatures/description/ 文章鏈接:https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html 思路 * 單調棧的本質是空間換時間,因為在遍歷的過…

【論文閱讀】transformer及其變體

寫在前面: transformer模型已經是老生常談的一個東西,以transformer為基礎出現了很多變體和文章,Informer、autoformer、itransformer等等都是頂刊頂會。一提到transformer自然就是注意力機制,變體更是數不勝數,一提到…

【目標檢測】DN-DETR

一、引言 論文: DN-DETR: Accelerate DETR Training by Introducing Query DeNoising 作者: IDEA 代碼: DN-DETR 注意: 該算法是在DAB-DETR基礎上的改進,在學習該算法前,建議掌握DETR、DAB-DETR等相關知識…

TCP和UDP的區別以及應用場景

TCP(傳輸控制協議)和UDP(用戶數據報協議)是兩種不同的傳輸層協議 區別 TCP是面向連接的,UDP是無連接的; TCP是可靠的,UDP是不可靠的; TCP是面向字節流的,UDP是面向數據…

如何高效配置與使用Pip換源

目錄 1. Pip源的基本概念 1.1 常見的國內鏡像源 2. 臨時換源 2.1 使用命令行參數指定鏡像源 2.2 安裝多個包時指定鏡像源 3. 永久換源 3.1 修改用戶級配置文件 3.1.1 創建和編輯配置文件 3.2 修改全局配置文件 3.2.1 創建和編輯全局配置文件 4. 驗證換源配置 5. 切…

VMamba: Visual State Space Model論文筆記

文章目錄 VMamba: Visual State Space Model摘要引言相關工作Preliminaries方法網絡結構2D-Selective-Scan for Vision Data(SS2D) VMamba: Visual State Space Model 論文地址: https://arxiv.org/abs/2401.10166 代碼地址: https://github.com/MzeroMiko/VMamba 摘要 卷積神…

防火墻共性檢測技術

防火墻共性檢測技術 防火墻共性檢測技術是指防火墻在監控和控制網絡流量時,共同采用的一些檢測和過濾方法。無論是哪種類型的防火墻,這些技術都可以用于識別和阻止惡意流量,確保網絡安全。以下是防火墻共性檢測技術的詳細介紹,包…

axios的基本使用和vue腳手架自帶的跨域問題解決

axios的基本使用和vue腳手架自帶的跨域問題解決 1. axios 1.1 導入axios npm i axios1.2 創建serve1.js serve1.js const express require(express) const app express()app.use((request,response,next)>{console.log(有人請求服務器1了);console.log(請求來自于,re…

go Channel 原理 (一)

Channel 設計原理 不要通過共享內存的方式進行通信,而是應該通過通信的方式共享內存。 在主流編程語言中,多個線程傳遞數據的方式一般都是共享內存。 Go 可以使用共享內存加互斥鎖進行通信,同時也提供了一種不同的并發模型,即通…

npm ci vs npm i

npm ci vs npm i 幾個關鍵區別:該選擇哪個? 通過 npm ci 和 npm i 兩個命令,都可安裝項目的依賴。那么這兩個命令有什么區別呢? 幾個關鍵區別: 目的和用途: npm ci :根據項目中的 package-lock…

AI奏響未來樂章:音樂界的革命性變革

AI在創造還是毀掉音樂 引言 隨著科技的飛速發展,人工智能(AI)正在逐漸滲透到我們生活的每一個角落,音樂領域也不例外。AI技術的引入,不僅為音樂創作、教育、體驗帶來了革命性的變革,更為整個音樂產業注入了…

順序表應用——通訊錄

在本篇之前的順序表專題我們已經學習的順序表的實現,了解了如何實現順序表的插入和刪除等功能,那么在本篇當中就要學習基于順序表來實現通訊錄,在通訊錄當中能實現聯系人的增、刪、查改等功能,接下來就讓我們一起來實現通訊錄吧&a…

grpc學習golang版( 五、多proto文件示例 )

系列文章目錄 第一章 grpc基本概念與安裝 第二章 grpc入門示例 第三章 proto文件數據類型 第四章 多服務示例 第五章 多proto文件示例 第六章 服務器流式傳輸 第七章 客戶端流式傳輸 第八章 雙向流示例 文章目錄 一、前言二、定義proto文件2.1 公共proto文件2.2 語音喚醒proto文…

解決Vue3項目中跨域問題的步驟

決Vue3項目中跨域問題的步驟可以按照以下方式清晰地分點表示和歸納: 1. 使用代理服務器(Proxy) 步驟: 在Vue項目的根目錄下找到或創建vue.config.js文件。在vue.config.js中配置devServer的proxy選項。設定需要代理的接口前綴&a…

基于局域網下的服務器連接、文件傳輸以及內網穿透教程 | 服務器連接ssh | 服務器文件傳輸scp | 內網穿透frp | 研究生入學必備 | 深度學習必備

🙋大家好!我是毛毛張! 🌈個人首頁: 神馬都會億點點的毛毛張 📌本篇博客分享的是基于局域網下的服務器連接🔗、文件傳輸以及內網穿透教程,內容非常完備?,涵蓋了在服務器上做深度學…

樹莓派3B讀寫EEPROM芯片AT24C256

AT24C256是一個Atmel公司的EEPROM存儲芯片,容量是256K個bit(也就是32K字節),I2C接口,而樹莓派正好有I2C接口,如下圖藍框中的4個IO口, 把AT24C256和這4個口接在一起,這樣硬件就準備好…