Bean的一些屬性信息總結

? ? ? ? 我們知道,在Spring中,一個Bean可以理解為一個對象,但是二者之間肯定是有區別的,比如一個Bean可以實例化成很多個對象、Bean中可以帶有某些描述信息。

? ? ? ? 學習Bean,能更好地使用Bean。

1、Spring兩個核心概念的由來【可忽略】

? ? ? ? Spring最關鍵的功能就是實現IOC依賴翻轉,其依賴翻轉的實現靠的是設計模式“工廠模式”,所以,Spring中有一個核心概念,叫做工廠“Factory”。【當然,我們一般使用BeanFactory接口】

? ? ? ? 只有工廠,那么每次客戶端(如果我們把Spring的客戶---即程序員,看成客戶端)調用某個對象,就可能要重新new一個對象(或者靠反射實例化一個對象)。

? ? ? ? new對象沒有關系,最核心的是我們是在XML文件(或者Java配置類,又或者注解開發)里配置bean屬性的,如果每次new對象,都要解析XML文件,那么性能會很低。

? ? ? ? 那么,為什么不用一個倉庫,把所有的對象實例化后,存儲起來呢?

????????【保持疑問:懶加載lazy--load屬性,能支持每次使用bean時,才創建,好像和new對象沒區別?(目標:找出它們的區別)】

? ? ? ? 既然想要一個倉庫,就得有一個統一的“商品”,否則,我們沒法用一種統一的方法,存儲某個對象(比如自定義的3個類Student、Teacher、Course,3個類是有區別的)

? ? ? ? 由于Java里,所有的類都指向Object,所以用Object當“商品”是個好主意。

? ? ? ? 不過,Object想強轉為某個類型(比如student),也得事先知道這是student。

? ? ? ? 在Spring的早期版本,程序員使用BeanFactory創建Bean時,調用getBean方法,都要強轉,這沒什么問題。

? ? ? ? 然而,隨著Spring的發展,我們逐漸摒棄這種做法,更多采用@Autowired注解自動實例化,這時候,強轉就是一個問題了。

? ? ? ? 先分析這個問題。第一,強轉的關鍵在于,我們事先不知道這個bean,是不是Student類,所以需要交給程序員手動處理。第二,@Autowired注解的關鍵是,我們要找到@Autowired對象和某個類的聯系。【比如你在Student類中,用@Autowired注解了下面的語句“private Teacher tea”,那么要找到Student和Teacher的關系】(當然,這通過反射好像也能解決,不過也許性能問題吧。)

? ? ? ? 所以,我們需要一個類,至少有2個屬性。第一,標注這個bean指向哪個類;第二,標注這個bean,可能需要哪個類(當然,現在要求指向另一個bean,不過也說得通,如果Spring能夠直接拿到另一個非bean的對象,那么其侵入性就太強了)

? ? ? ? 當然,這不是BeanDefinition誕生的原因,我們也能發現,早期Spring版本是需要手動強轉的。

? ? ? ? 不過,舉了這個例子,我們能發現,如果用Object類作為“商品”,其拓展性就很低。

? ? ? ? 如果用某個類X,繼承Object呢?可行,不過問題在于,X會繼承Object的所有屬性和方法,某種情況下我們不希望這么做。(比如性能損耗、或者希望內外部溝通的方法唯一)

? ? ? ? 所以,干脆一不做二不休,采用一個接口BeanDefinition,作為“商品”。

? ? ? ? 可能你會問了:Object是所有類和接口的基類,所有類和接口,都直接或間接指向Object,那定義這個接口,不也是一樣?

? ? ? ? 其實,Java這樣定義是為了統一的類結構,在實際使用時,會發現接口無法調用Object的方法,所以其實并沒有繼承。【這也符合Java中,接口不能繼承自具體類的原則】

? ? ? ? (當然了,為了保持拓展性,Spring還定義了一個接口AttributeAccessor,使接口BeanDefinition繼承AttributeAccessor)【Spring很多其它概念,都繼承了這個接口】

? ? ? ? 此時,問題解決了一些,另一個在Java語法層面的問題是:

? ? ? ? 接口不能定義變量,任何屬性在接口里,都必須是public、static和final的。

? ? ? ? 所以,我們需要在BeanDefinition接口的某個實現類中,定義這些屬性。

? ? ? ? 實現了BeanDefinition接口的抽象類AbstractBeanDefinition中,就定義了這些屬性。

? ? ? ? 其它實現BeanDefinition接口的類,直接或間接都繼承了AbstractBeanDefinition類。【可以說這是最重要的類之一】

2、Spring中,BeanDefinition定義的信息

? ? ? ? 其實在應用層面,我們很少使用BeanDefinition,一般都是配置后@Autowired。

? ? ? ? 當然,了解BeanDefinition的一些屬性,對開發也大有幫助。

第一,BeanDefinition的類特征信息定義

? ? ? ? 類信息定義,主要功能是,外部拿bean和內部找到類。

? ? ? ? 1.類名:bean的唯一名稱,依靠此名稱,從工廠Factory找到bean【getBean方法的字符串就是它的名字】

? ? ? ? 2.指向的類:bean對應的類,一般是從工程目錄java往下的相對路徑。

第二,BeanDefinition的內部屬性信息定義

? ? ? ? 主要功能是,實現內部的一些功能。

? ? ? ? 1.Scope作用域(我個人覺得應該叫類型):原生Spring有2種,單例singleton和原型prototype。(在其它情況可能會多出幾種)【這定義了,當外部使用bean時,我們Spring是每次重新new一個bean(原型),還是永遠返回同一個bean(單例)】

? ? ? ? 2.primary主要的:

????????????????假設有1接口叫FX,他有n個實現類。

????????????????其中,類X的配置中,設置了這個屬性。

????????????????那么,如果Spring內部某個類AAA有成員變量FX,使用@Autowired時,默認實例化類X。

? ? ? ? 3.依賴信息:比如該bean需要依賴哪些類。

? ? ? ? 4.懶加載lazy-load:如果定義了這個,Spring不會一開始就實例化bean。

第三,行為信息定義

? ? ? ? 主要功能是,定義外部使用bean時,可以做的操作。

? ? ? ? 1.初始化方法:在bean實例化后,會調用該方法。

? ? ? ? 2.銷毀方法:在bean銷毀前,會調用該方法。

此外,BeanDefinition還有一些其它屬性,所以我用得不多,在此不說明。

?????????我是蚊子碼農,如有補充或者疑問,歡迎在評論區留言。個人的知識體系可能沒有那么完善,希望各位多多指正,謝謝大家。

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

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

相關文章

Git和plink

安裝git的話首先進入到git官網進行下載Git - Downloading Package (git-scm.com) ,點擊便會自動進行下載。 安裝plink時也是根據自己電腦的版本號選擇進行安裝,我的是windows的64位,由此選擇以上版本進行安裝,這一個下載完成之后不…

python lxml安裝失敗怎么解決

通過pip install lxml 安裝lxml多次失敗,失敗原因總結如下: 1、pip版本未更新 解決方法:通過pip安裝時,需保證pip的版本沒有問題。 更新方法:在系統框輸入:python -m pip install --upgrade pip 2、下載…

oracle 還原被覆蓋的視圖

1.現在的視圖 select to_lob(text) from SYS.DBA_views where view_nameXXX; 2.查舊數據 --as of timestamp to_date(2024-05-28 10:30:00,yyyy-mm-dd hh24:mi:ss) select to_lob(text) from SYS.DBA_views as of timestamp to_date(2024-05-28 10:30:00,yyyy-mm-dd hh24:mi:s…

好消息!DolphinScheduler官網集成LLM模型問答AI kapa.ai

不少小伙伴可能發現了,Apache DolphinScheduler官網最近默默上線了kapa.ai作為LLM的問答AI。 集成kapa.ai之后,社區用戶可以點擊Apache DolphinScheduler官網首頁右下角的「Ask AI」模塊,在接下來彈出的問答框輸入自己的問題,即可…

python uiautomator2 常用操作

uiautomator2 安裝 python uiautomator2 安裝及使用-CSDN博客 一, 通過包名可以打開app d.app_start(com.gacne.www) 打開app運行后執行代碼,查看app具體信息獲取包名 d.info二,執行等待點擊 # 160秒內等待xpath定位的出現執行點擊 d.xpat…

mysql中單表查詢的成本

大家好。我們知道MySQL在執行一個查詢時,經常會有多個執行方案,然后從中選取成本最低或者說代價最低的方案去真正的執行查詢。今天我們來聊一聊單表查詢的成本。 那么到底什么是成本呢?這里我們說的成本或者代價是由兩方面組成的&#xff1a…

【踩坑】編譯opencv將python (for build) python2.7改為python3

轉載請注明出處:小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你,歡迎[點贊、收藏、關注]哦~ 出現問題 默認是2.7 解決方案 cmake時候添加: -D PYTHON_DEFAULT_EXECUTABLE$(which python3)

詳盡的Ubuntu 24.04 LTS安裝指南

Ubuntu安裝過程涉及多個步驟,下面是一個詳盡的Ubuntu 24.04 LTS安裝指南 ### 一、準備工作 **1. 系統要求** * **CPU**:至少2GHz雙核處理器。 * **內存**:推薦4GB或以上。 * **硬盤**:建議至少預留25GB可用空間。 * **U盤**&am…

02 Prometheus入門安裝教程

02 Prometheus入門安裝教程 大家好,我是秋意零。今天分享一篇入門級Prometheus安裝教程。 環境準備 三臺Linux虛擬機(一臺也可以) 準備Prometheus、相關組件安裝包 Prometheus官網下載安裝包比較慢,如果沒有魔法。可關注公眾號…

【UnityUI程序框架】The PureMVC Framework核心你會用嗎

👨?💻個人主頁:元宇宙-秩沅 👨?💻 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?! 👨?💻 本文由 秩沅 原創 👨?💻 收錄于專欄:Uni…

Python | Leetcode Python題解之第105題從前序與中序遍歷序列構造二叉樹

題目: 題解: class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:if not preorder:return Noneroot TreeNode(preorder[0])stack [root]inorderIndex 0for i in range(1, len(preorder)):preorderVal pr…

rxjava BehaviorProcessor特性和使用說明

概念和說明 BehaviorProcessor 的定義 BehaviorProcessor 是 FlowableProcessor 的一個具體實現,它同時具備發布和訂閱的能力。它會保存最新的一個事件,并在新訂閱者訂閱時,立即將該事件發送給新訂閱者。 主要特性 緩存最新事件&#xff…

計算機畢業設計python+spark天氣預測 天氣可視化 天氣大數據 空氣質量檢測 空氣質量分析 氣象大數據 氣象分析 大數據畢業設計 大數據畢設

摘 要 近些年大數據人工智能等技術發展迅速,我國工業正努力從“制造”邁向“智造”實現新跨越。神經網絡(NeuronNetwork)是一種計算模型,通過大量數據的學習,來發現數據之間的模式和規律,模仿人腦神經元的工作方式。隨著算力的提…

音視頻集市應用融合平臺方案

音視頻應用即有深度又有廣度,如何讓一個平臺擁有更多功能更靈活的拓展能力,從單體模塊化,多插件到微服務都有大量的實踐。 筆者在實際開發過程也同樣面對這些紛繁復雜而又必須共容共通需求的挑戰。 在實戰開發了大量從服務端到設備端再到瀏覽…

vos3000外呼系統如何查詢授權信息和系統并發

要查詢VOS3000外呼系統的授權信息和系統并發情況,您可以按照以下步驟進行: 登錄系統管理界面: 使用管理員賬號登錄VOS3000外呼系統的管理界面。 查找系統信息: 尋找系統信息或授權管理的相關選項或標簽。 查詢授權信息&#xff…

五篇季度思想匯報

季度思想匯報一 尊敬的黨組織: 時光荏苒,轉眼間一個季度又過去了。在這一季度里,我經歷了許多,也有了不少的感悟和成長。 在工作中,我積極投入,努力提升自己的專業技能,面對各種任務和挑戰&am…

Linux:IPC - System V

Linux:IPC - System V 共享內存 shm創建共享內存shmgetshmctlftok 掛接共享內存shmatshmdt shm特性 消息隊列 msgmsggetmsgctlmsgsndmsgrcv 信號量 semSystem V 管理機制 System V IPC 是Linux系統中一種重要的進程間通信機制,它主要包括共享內存 shm&am…

物理內存與虛擬內存的區別

物理內存和虛擬內存是計算機系統中重要的概念,它們有著不同的特點和作用。 物理內存: 物理內存是計算機實際存在的內存,通常指的是RAM(隨機存取存儲器)。物理內存直接映射到計算機的物理地址空間,可以直接被…

? 傳知代碼 ? 高速公路車輛速度檢測軟件

💛前情提要💛 本文是傳知代碼平臺中的相關前沿知識與技術的分享~ 接下來我們即將進入一個全新的空間,對技術有一個全新的視角~ 本文所涉及所有資源均在傳知代碼平臺可獲取 以下的內容一定會讓你對AI 賦能時代有一個顛覆性的認識哦&#x…

【NumPy】全面解析NumPy的where函數:高效條件操作指南

🧑 博主簡介:阿里巴巴嵌入式技術專家,深耕嵌入式人工智能領域,具備多年的嵌入式硬件產品研發管理經驗。 📒 博客介紹:分享嵌入式開發領域的相關知識、經驗、思考和感悟,歡迎關注。提供嵌入式方向…