Spring之【Bean工廠后置處理器】

目錄

BeanFactoryPostProcessor

BeanDefinitionRegistryPostProcessor

使用一下Bean工廠后置處理器

定義包掃描范圍

定義一個組件Bean

定義一個普通的類

自定義一個組件類實現Bean工廠后處理器

測試類


BeanFactoryPostProcessor

  • 該接口是Spring提供的擴展點之一
  • 是一個函數式接口,只有一個抽象方法
  • Spring會在合適的時機執行方法回調,并將bean工廠作為參數傳遞進去

既然把ConfigurableListableBeanFactory類型的bean工廠傳遞過來了,那么該類型中的方法我是不是就可以為所欲為地為自己所用了啊

package org.springframework.beans.factory.config;import org.springframework.beans.BeansException;// 函數式接口
@FunctionalInterface
public interface BeanFactoryPostProcessor {// 參數為bean工廠void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;}

BeanDefinitionRegistryPostProcessor

  • 是BeanFactoryPostProcessor的子接口
  • 自身提供了一個將BeanDefinitionRegistry作為參數傳遞進來的方法

把BeanDefinitionRegistry傳遞過來了,BeanDefinitionRegistry是用來管理BeanDefinition的,提供了一系列操作BeanDefinition的方法,那么我就可以操作Spring容器中的BeanDefinition了

package org.springframework.beans.factory.support;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;// 繼承了BeanFactoryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {// 將BeanDefinitionRegistry作為參數void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;}

使用一下Bean工廠后置處理器

定義包掃描范圍

package spring.demo;import org.springframework.context.annotation.ComponentScan;// 掃描spring.demo及其子包
@ComponentScan("spring.demo")
public class SpringConfig {
}

定義一個組件Bean

package spring.demo;import org.springframework.stereotype.Component;// 這里添加了@Component注解
// Spring容器啟動過程中通過ConfigurationClassPostProcessor解析@Component注解,將Cat類的BeanDefinitoon放入容器中
@Component
public class Cat {
}

定義一個普通的類

package spring.demo;// Dog類只是一個普通的Java類,沒加任何注解
public class Dog {
}

自定義一個組件類實現Bean工廠后處理器

package spring.demo;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;@Component
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// Dog類只是一個普通的類// 在這里我通過Spring的回調拿到BeanDefinitionRegistry// 通過BeanDefinitionRegistry將Dog類的定義信息放入Spring容器中GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(Dog.class);registry.registerBeanDefinition("dog", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// Spring回調將beanFactory傳遞過來// 這里通過beanName從beanFactory中獲取到對應的BeanDefinition信息BeanDefinition catBeanDefinition = beanFactory.getBeanDefinition("cat");String beanClassName = catBeanDefinition.getBeanClassName();// 這里打印出:spring.demo.CatSystem.out.println(beanClassName);}
}

測試類

package spring.demo;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class SpringMain {public static void main(String[] args) {// 啟動Spring容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);// 從容器中獲取beanName為cat的beanObject catBean = applicationContext.getBean("cat");// 這里打印出:spring.demo.Cat@4310d43System.out.println(catBean);// 從容器中獲取beanName為cat的beanObject dogBean = applicationContext.getBean("dog");// 這里打印出:spring.demo.Dog@54a7079eSystem.out.println(dogBean);}
}

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

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

相關文章

【C++】第十八節—一文萬字詳解 | map和set的使用

嗨,我是云邊有個稻草人,與你分享C領域專業知識(*^▽^*) 《C》本篇文章所屬專欄—持續更新中—歡迎訂閱— 目錄 一、序列式容器和關聯式容器 二、set系列的使用 2.1 set和multiset參考?檔 2.2 set類的介紹 2.3 set的構造和迭代器 2.4 set的增刪查…

Java 大視界 -- Java 大數據在智能交通自動駕駛車輛與周邊環境信息融合與決策中的應用(357)

Java 大視界 -- Java 大數據在智能交通自動駕駛車輛與周邊環境信息融合與決策中的應用(357)引言:正文:一、Java 構建的環境信息融合架構1.1 多傳感器數據實時關聯1.2 動態障礙物軌跡預測二、Java 驅動的決策系統設計2.1 緊急決策與…

單細胞轉錄組學+空間轉錄組的整合及思路

一、概念 首先還是老規矩,處理一下概念問題,好將之后的問題進行分類和區分 單細胞轉錄組:指在單個細胞水平上對轉錄組(即細胞內所有轉錄出來的 RNA,主要是 mRNA)進行研究的學科或技術方向,核心…

用Python實現神經網絡(五)

這一節告訴你如何用TensorFlow實現全連接網絡。安裝 DeepChem這一節,你將使用DeepChem 機器學習工具鏈進行實驗在網上可以找到 DeepChem詳細安裝指導。Tox21 Dataset作為我們的建模案例研究,我們使用化學數據庫。毒理學家很感興趣于用機器學習來預測化學…

ReasonFlux:基于思維模板與分層強化學習的高效推理新范式

“以結構化知識壓縮搜索空間,讓輕量模型實現超越尺度的推理性能” ReasonFlux 是由普林斯頓大學與北京大學聯合研發的創新框架(2025年2月發布),通過 結構化思維模板 與 分層強化學習,顯著提升大語言模型在復雜推理任務…

PHP與Web頁面交互:從基礎表單到AJAX實戰

文章目錄 PHP與Web頁面交互:從基礎到高級實踐 1. 引言 2. 基礎表單處理 2.1 HTML表單與PHP交互基礎 2.2 GET與POST方法比較 3. 高級交互技術 3.1 AJAX與PHP交互 3.2 使用Fetch API進行現代AJAX交互 4. 文件上傳處理 5. 安全性考量 5.1 常見安全威脅與防護 5.2 數據驗證與過濾 …

OpenCV基本的圖像處理

參考資料: 參考視頻 視頻參考資料:鏈接: https://pan.baidu.com/s/1_DJTOerxpu5_dSfd4ZNlAA 提取碼: 8v2n 相關代碼 概述: 因為本人是用于機器視覺的圖像處理,所以只記錄了OpenCV的形態學操作和圖像平滑處理兩部分 形態學操作:…

Git 與 GitHub 學習筆記

本文是一份全面的 Git 入門指南,涵蓋了從環境配置、創建倉庫到日常分支管理和與 GitHub 同步的全部核心操作。 Part 1: 初始配置 (一次性搞定) 在開始使用 Git 之前,需要先配置好你的電腦環境。(由于網絡的原因,直接使用https的方式拉取倉庫大概率是失敗的,故使用ssh的方…

文件系統-文件存儲空間管理

文件存儲空間管理的核心是空閑塊的組織、分配與回收,確保高效利用磁盤空間并快速響應文件操作(創建、刪除、擴展)。以下是三種主流方法:1. 空閑表法(連續分配)原理:類似內存動態分區&#xff0c…

python爬蟲實戰-小案例:爬取蘇寧易購的好評

一、項目背景與價值1 為什么爬取商品好評? 消費者洞察:分析用戶真實反饋,了解產品優缺點 市場研究:監測競品評價趨勢,優化產品策略二.實現代碼from selenium import webdriver from selenium.webdriver.edge.options i…

Spring Boot環境搭建與核心原理深度解析

一、開發環境準備 1.1 工具鏈選擇 JDK版本:推薦使用JDK 17(LTS版本),與Spring Boot 3.2.5完全兼容,支持虛擬線程等JDK 21特性可通過配置啟用構建工具:Maven 3.8.6(配置阿里云鏡像加速依賴下載…

Java自動拆箱機制

在黑馬點評項目中,提到了一個細節,就是Java的自動拆箱機制,本文來簡單了解一下。Java 的??自動拆箱機制(Unboxing)??是一種編譯器層面的語法糖,用于簡化??包裝類對象??(如 Integer、Boo…

哈希算法(Hash Algorithm)

哈希算法(Hash Algorithm)是一種將任意長度的數據映射為固定長度的哈希值(Hash Value)的算法,廣泛應用于密碼學、數據完整性驗證、數據結構(如哈希表)和數字簽名等領域。🧠 一、哈希…

黑馬點評使用Apifox進行接口測試(以導入更新店鋪為例、詳細圖解)

目錄 一、前言 二、手動完成接口測試所需配置 三、進行接口測試 一、前言 在學習黑馬點評P39實現商鋪緩存與數據庫的雙寫一致課程中,老師使用postman進行了更新店鋪的接口測試。由于課程是22年的,按照我從24年JavaWebAI課程所學習使用的Apifox內部其實…

Ubuntu 虛擬機配置 與Windows互傳文件

在VMware中為Ubuntu虛擬機設置共享文件夾 設置共享文件夾可以傳遞大量文件 在VMware的設置中打開共享文件夾功能,并設置共享文件夾的目錄。 點擊添加后,選擇一個電腦上的文件夾,這個文件夾最好是新建的空的。 完成后在“文件夾”列表中就…

機器學習對詞法分析、句法分析、淺層語義分析的積極影響

機器學習在自然語言處理的詞法、句法及淺層語義分析中產生了革命性影響,顯著提升了各任務的精度和效率。以下是具體影響及實例說明:??一、詞法分析??1. ??中文分詞????提升歧義消解能力??:傳統方法依賴規則或統計,但深…

初學者STM32—USART

一、簡介USART(Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/異步收發器)是一種常見的串行通信協議,廣泛應用于微控制器、傳感器、模塊和其他電子設備之間的數據傳輸。本節課主要學習USART的基本結構以及其…

A316-V71-Game-V1:虛擬7.1游戲聲卡評估板技術解析

引言 隨著游戲產業的蓬勃發展,沉浸式音頻體驗成為提升游戲體驗的關鍵因素。本文將介紹一款專為游戲音頻設計的評估板——A316-V71-Game-V1,這是一款基于XMOS XU316技術的虛擬7.1游戲聲卡評估平臺。產品概述 A316-V71-Game-V1是一款專為虛擬7.1游戲聲卡設…

小白成長之路-部署Zabbix7

文章目錄一、概述二、案例三、第二臺虛擬機監控總結一、概述 二、案例 實驗開始前: systemctl disable --now firewalld setenforce 0 Rocky9.4部署Zabbix7 一、配置安裝源 rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-7.0-5.el…

飛書非正常顯示與權限問題解決方案

可能是本地緩存導致的,讓員工參考以下方法操作下:看不懂下面的建議刪除飛書再重新安裝;博主就遇到過版本低的原因,試過下面方面都不行。結果就是刪除重新安裝,博主是mac電腦。Windows 系統關閉飛書。如果不能關閉&…