Spring常見問題

如何理解spring屬于低侵入式設計?

  • 在代碼中不需要寫明具體依賴對象,在運行時進行自動注入,降低了組件的耦合
  • 依賴的是接口,而接口的實現類具有拓展性

Spring IOC 實現了什么功能,談談你對IOC的理解。

負責創建對象,管理對象(通過依賴注入(DI)裝配對象、配置對象)并且管理這些對象的整個生命周期。

功能:
依賴注入(DI): 生命周期管理:Spring
控制反轉:將對象的創建權交由外部容器,將Bean加入IOC容器 Spring IOC
IOC容器還負責管理Bean的生命周期。它會根據配置來創建Bean,初始化Bean,以及在不再需要時銷毀Bean。
配置集中管理:Spring IOC容器允許將應用的配置集中到一個或多個地方,使得配置的管理更加方便。

Spring提供了哪些實現DI的方式?

Spring提供了以下幾種實現依賴注入(DI)的方式:

  1. Setter注入:這是最常用的注入方式。Spring IOC容器通過調用Bean的setter方法,將依賴注入到Bean中。

  2. 構造器注入:Spring IOC容器通過調用Bean的構造器,并傳入所需的依賴,來完成依賴注入。

  3. 注解注入:Spring還支持基于注解的依賴注入。例如,可以使用@Autowired注解來自動注入依賴。

  4. 自動裝配注入:Spring IOC容器可以自動裝配Bean的依賴。例如,如果一個Bean需要另一個Bean,Spring IOC容器可以自動找到并注入所需的Bean。

  5. 靜態工廠注入:通過靜態工廠方法返回的實例進行依賴注入。

  6. 實例工廠注入:通過實例工廠方法返回的實例進行依賴注入。

DI注入如何實現單例變多例,這個過程中產生的現象都是誰在管理?

[在Spring中,Bean默認是單例模式,也就是說,Spring IOC容器在初始化時會創建Bean的一個實例,并在整個應用中復用這個實例。但是,我們可以通過配置將單例模式變為多例模式]

實現單例變多例的方式主要有以下幾種:

  1. XML配置:在Bean的XML配置中,可以通過設置scope="prototype"來實現多例模式

    例如:

    <bean id="xxx" class="全類名" scope="prototype"></bean>
    
  2. 注解:可以使用@Scope("prototype")注解來使對象成為多例模式

    例如:

    @Component
    @Scope("prototype")
    public class SomeClass {// ...
    }
    

[在這個過程中,所有的現象都是由Spring IOC容器來管理的。當我們將一個Bean配置為多例模式后,每次從Spring IOC容器中獲取該Bean時,都會創建一個新的實例。

需要注意的是,多例模式在進行注入時,不能使用@Autowired,否則注入的還是單例模式。實現多例模式需要使用工廠模式例如,可以通過實現BeanFactoryAware接口來獲得factory

此外,如果你想在一個請求的生命周期內保持Bean的實例是唯一的,你可以使用@Scope("request")@Scope("session")。這兩種模式分別表示在一次HTTP請求中和在一個會話中,被注解的Bean都是同一個Bean

OOP 和 AOP 的區別是什么?

OOP面向對象編程,縱向結構關系,關注類之間的關系.OOP引入封裝、繼承、多態等概念來建立一種對象層次結構,用于模擬公共行為的一個集合。它導致了大量代碼的重復,而不利于各個模塊的重用。
AOP可以說是OOP(Object Oriented
Programming,面向對象編程)的補充和完善。AOP面向切面編程,橫向結構關系,關注類的內容.
剖解開封裝的對象內部,并將那些影響了多個類的公共行為封裝到一個可重用模塊.使用AOP,可以在不修改原來代碼的基礎上添加新功能。

Spring 通過AOP實現了什么功能?這項技術你是如何使用的?

【實現功能】
使用AOP,可以在不修改原來代碼的基礎上添加新功能。 模塊化橫切關注點:Spring
AOP將橫切關注點(例如日志記錄、事務管理、安全性檢查等)從主業務邏輯代碼中分離出來,以模塊化的方式實現對這些關注點的管理和重用
動態代理:Spring AOP使用動態代理技術,在目標對象方法執行時將切面的邏輯織入到目標對象的方法中

【使用】
定義普通業務組件:這是我們的主業務邏輯,它包含了我們的核心功能。[切面類]
定義切入點:切入點定義了哪些連接點上應該應用通知。切點通過表達式進行定義,如匹配所有 public
方法或匹配某個包下的所有方法等。[編寫切入表達式]
定義增強處理:增強處理就是在AOP框架為普通業務組件織入的處理動作。這包括前置增強(Before Advice)、后置增強(After
Advice)、環繞增強(Around Advice)、異常增強(After Throwing Advice)等。[書寫通知]

AOP的實現用到了哪種設計模式,它有哪些實現方式?

Spring AOP(面向切面編程)的實現主要用到了以下設計模式:

  1. 代理模式:Spring AOP是圍繞著代理模式設計的。這里的代理模式,其實就是指使用一個代理對象來控制對原對象的訪問,這個代理對象在原對象的基礎上增加了一些額外的功能。
  2. 工廠模式:在Spring AOP中,工廠模式主要用于創建代理對象和目標對象。

Spring AOP的實現方式主要有以下幾種:

  1. JDK動態代理:JDK動態代理主要針對目標對象的接口進行代理,動態生成接口的實現類25。這種方式需要目標對象實現一個或多個接口,否則不能使用JDK動態代理)。
  2. CGLIB代理:CGLIB代理可以針對類進行代理,生成目標類的子類25。這種方式不需要目標對象實現接口,也可以進行代理。
  3. Spring API實現AOP:通過實現Spring提供的AOP接口,如MethodBeforeAdviceAfterReturningAdviceMethodInterceptor等,來實現AOP。
  4. 自定義類實現AOP:通過自定義切入類和配置,來實現AOP。通過使用Spring的@Aspect@Pointcut@Before@After等注解,來實現AOP

理解什么是連接點、切面、切點、通知、目標對象、織入、引入。

  • 連接點 JoinPoint:要增強的哪些方法(目標方法)

  • 通知 Advice:進行增強的重復邏輯,也就是共性的功能。(增強方法) 通知是切面在連接點處執行的代碼,例如在方法調用前、方法調用后、方法拋出異常時執行的代碼。通知可以分為
    Before、After、AfterReturning、AfterThrowing 和 Around 五種類型

  • 切入點 PointCut:匹配連接點的條件,通知僅會在切入點方法執行時被應用(為共性的功能標記目標方法)

  • 切面 Aspect:,描述通知與切入點的對應關系(通知+切入點)【切面所在的類,我們一般稱為切面類(被@Aspect注解標識的類)】

  • 目標對象:Target,通知所應用的對象(要增強目標方法所在對象)

  • 織入 weave:指把通知應用到目標上,生成代理對象的過程。

  • 引入(Introduction):引入允許我們向現有類添加新方法或屬性

Spring是如何實現事務的?它和以往的實現有什么區別?

實現:

Spring實現事務的方式主要是通過AOP(面向切面編程)和事務管理器

事務管理器(PlatformTransactionManager):Spring的事務管理器是事務管理的頂層接口,它規定了事務的基本操作:創建事務,提交事務和回滾事務。
事務攔截器(TransactionInterceptor):Spring的事務攔截器負責攔截帶有@Transactional注解的方法。當這些方法被調用時,攔截器會在方法執行前后應用事務邏輯。
代理對象:Spring會為帶有@Transactional注解的類生成一個代理對象,并將這個代理對象作為bean。【aop操作】 當這個代理對象的方法被調用時,如果該方法上存在@Transactional注解,那么代理邏輯會先把事務的自動提交設置為false,然后再去執行原本的業務邏輯方法。如果執行過程中沒有出現異常,那么代理邏輯就會將事務提交,如果出現了異常,那么就會將事務進行回滾

區別:

  • 具體事務的實現由第三方框架實現,避免我們直接進行事務操作!
  • 聲明式事務管理:Spring支持聲明式事務管理,通過@Transactional注解或XML配置來聲明開啟事務,讓Spring來接管事務的實現邏輯。這使得開發者只需要關注業務邏輯,而無需手動管理事務的生命周期。
  • 事務傳播行為和隔離級別:Spring提供了豐富的事務傳播行為和隔離級別設置,可以更精細地控制事務的行為

事務的傳播機制都有哪些?

  1. Propagation.REQUIRED:如果當前存在事務,則加入當前事務,否則創建一個新事務。【默認】
  2. Propagation.REQUIRES_NEW:創建一個新事務,并在新事務中執行。如果當前存在事務,則掛起當前事務,即使新事務拋出異常,也不會影響當前事務
  3. Propagation.NESTED:如果當前存在事務,則在該事務中嵌套一個新事務,如果沒有事務,則與Propagation.REQUIRED一樣。
  4. Propagation.SUPPORTS:如果當前存在事務,則加入該事務,否則以非事務方式執行。
  5. Propagation.NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,掛起該事務。
  6. Propagation.MANDATORY:必須在一個已有的事務中執行,否則拋出異常。
  7. Propagation.NEVER:必須在沒有事務的情況下執行,否則拋出異常。

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

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

相關文章

【云原生】K8s管理工具--Kubectl詳解(一)

一、陳述式管理 1.1、陳述式資源管理方法 kubernetes 集群管理集群資源的唯一入口是通過相應的方法調用 apiserver 的接口kubectl 是官方的 CLI 命令行工具&#xff0c;用于與 apiserver 進行通信&#xff0c;將用戶在命令行輸入的命令&#xff0c;組織并轉化為apiserver 能識…

Elasticsearch集群和Logstash、Kibana部署

1、 Elasticsearch集群部署 服務器 安裝軟件主機名IP地址系統版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.56centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 軟件版本&#xff1a;elasticsearch-7.13.2.tar.gz 示…

ubuntu18 安裝python3.8

在Ubuntu 18.04上安裝Python 3.8可以通過以下步驟完成&#xff1a; 1.更新包列表和已安裝的包&#xff1a; sudo apt update sudo apt upgrade 2.安裝依賴項&#xff1a; sudo apt install -y software-properties-common 3.添加Python 3.8的PPA&#xff08;個人包歸檔&am…

【Docker系列】 Docker容器具體信息查詢

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

Python函數進階:四大高階函數、匿名函數、枚舉、拉鏈與遞歸詳解

系列文章目錄 Python數據類型&#xff1a;編程新手的必修課深入探索Python字符串&#xff1a;技巧、方法與實戰Python 函數基礎詳解Python正則表達式詳解&#xff1a;掌握文本匹配的魔法Python文件操作寶典&#xff1a;一步步教你玩轉文件讀寫Python面向對象基礎與魔法方法詳解…

databricks~Unity Catalog

Unity Catalog hierarchy 包含了用戶授權管理信息和元數據信息 workspace with unity catalog hierarchy unity metastore Ref: https://www.youtube.com/playlist?listPLY-V_O-O7h4fwcHcXgkR_zTLvddvE_GfC

[力扣題解] 494. 目標和

題目&#xff1a;494. 目標和 思路 01背包 轉換為01背包問題 難點在于看出可以用背包問題解決本題&#xff1b; 題目字面意思是劃分出一堆再減去另一堆&#xff0c;得到的結果想要等于target&#xff0c;設定一堆為正&#xff0c;記為left&#xff0c;另一堆為負&#xff0…

ChatGPT類大模型應用入門了解與使用

一 前言 ChatGPT大眾熱情逐漸褪去&#xff0c;但在后臺技術人的探索還處于熱火朝天狀態。如果我們生活的世界是一杯清水&#xff0c; 那類似ChatGPT的語言大模型技術的橫空出世就如滴入水杯的一滴墨汁&#xff0c;第一滴很顯眼&#xff0c;但實際上是后續墨汁慢慢擴散滲透才是…

Windows11下使用Qt5.14.2編譯QtXlsx驅動詳細步驟

原有&#xff1a;由于系統需要將QTableWidget表格中的數據導出、在Windows下最開始使用Excel.Application組件實現了導出功能&#xff0c;后面將代碼轉換到Ubuntu20.04下進行編譯&#xff0c;發現項目.pro文件中的QT axcontainer和代碼.h文件中的#include <QAxObject>跟…

基于圖鳥UI的資訊名片模版開發與應用

一、引言 在前端技術日新月異的今天&#xff0c;快速、高效、美觀的UI組件庫和模板成為了開發者們關注的焦點。圖鳥UI作為一款集成了基礎布局元素、配色體系、圖標icon和精選組件的UI框架&#xff0c;為前端開發者提供了極大的便利。本文將以圖鳥UI為基礎&#xff0c;探討基于…

接口測試工具有哪些,哪些比較火

接口測試工具可以幫助開發人員和測試人員更高效地進行接口測試&#xff0c;以下是一些常用的接口測試工具&#xff1a; 1. **Postman** Postman 是一款廣受歡迎的接口測試工具&#xff0c;它提供了豐富的功能和直觀的用戶界面&#xff0c;幫助開發人員和測試人員輕松進行 API…

如何讓外網訪問內網服務?

隨著互聯網的快速發展&#xff0c;越來越多的企業和個人需要將內網服務暴露給外網用戶訪問。由于安全和隱私等因素的考慮&#xff0c;直接將內網服務暴露在外網是非常不安全的做法。如何讓外網用戶安全訪問內網服務成為了一個重要的問題。 在這個問題上&#xff0c;天聯公司提供…

golang rune類型解析,與byte,string對比,以及應用

Golang中的rune類型是一個32位的整數類型(int32)&#xff0c;它是用來表示Unicode碼點的。rune類型的值可以是任何合法的Unicode碼點&#xff0c;它通常用來處理字符串中的單個字符。 在Golang中&#xff0c;字符常量使用單引號來表示&#xff0c;例如 a。使用單引號表示的字符…

rust - 使用 cargo-nextest 替代 cargo test

cargo-nextest 是新一代的rust測試程序&#xff0c;能夠極大提升測試性能&#xff0c;可以完全替代 cargo test 命令。 1. 安裝 cargo install cargo-nextest2. 執行測試 project ├── Cargo.toml ├── LICENSE ├── README.md ├── build.rs ├── core_utils │ …

K-means聚類模型

目錄 1.定義 2.K-means聚類模型的優點 3.K-means聚類模型的缺點 4.K-means聚類模型的應用場景 5.對K-means聚類模型未來的展望 6.小結 1.定義 什么是 K-means 聚類模型&#xff1f;K-means 聚類模型是一種無監督學習算法&#xff0c;用于將數據劃分為不同的組或簇&#…

Lumines推出RGBL彩色混合LED

Luminus Devices傾心打造了一款嶄新的4合1 RGBL&#xff08;紅綠藍綠石灰&#xff09;LED系列&#xff0c;專為舞臺與建筑照明領域量身打造&#xff0c;滿足對高顯色指數&#xff08;CRI&#xff09;與高輸出顏色混合的苛刻需求。這一創新之舉&#xff0c;無疑是照明技術的一次…

使用HiBurn燒錄鴻蒙.bin文件到Hi3861開發板

鴻蒙官方文檔的“Hi3861開發板第一個示例程序”中描述了——如何使用DevEco Device Tool工具燒錄二進制文件到Hi3861開發板&#xff1b; 本文將介紹如何使用HiBurn工具燒錄鴻蒙的.bin文件到Hi3861開發板。 獲取HiBurn工具 通過鴻蒙官方文檔我們知道DevEco Device Tool是一個V…

SAP--ABAP踩坑日志---日期函數的踩坑-----FIMA_DATE_CREATE

當你需要動態生成日期列的時候,出現了奇怪的BUG怎么辦? 用函數循環循環產生獲取下一個日期,結果出現了5.30 直接到6.1了 …我的5.31呢??? 解決方案:用這個,不要瞎用函數啊! day_col day_col 1.

Mybatis 與 MybatisPlus 打印sql日志配置

Mybatis 與 MybatisPlus 打印sql日志配置 方法一&#xff1a; Mybatis 配置&#xff1a; mybatis:configuration: ### 開啟打印sql配置log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ### 開啟駝峰配置 map-underscore-to-camel-case&#xff1a;trueMyb…

docker所在磁盤空間不足 遷移數據

1.查看原始目錄docker info | grep "Docker Root Dir" 一般在/var/lib/docker 2.停止docker service docekr stop 3.移動數據 注意 移動前不要創建docker目錄&#xff01; mv /var/lib/docker /home/docker 4.進入目錄查看是否與原始目錄相同&#xff0c;確認一…