Spring的簡單使用及內部實現原理

在現代的Java應用程序開發中,Spring Framework已經成為了不可或缺的工具之一。它提供了一種輕量級的、基于Java的解決方案,用于構建企業級應用程序和服務。本文將介紹Spring的簡單使用方法,并深入探討其內部實現原理。

首先,讓我們看一下Spring的簡單使用示例:

AnnotationConfigApplicationContext?context?=?new?AnnotationConfigApplicationContext(AppConfig.class);
UserService?userService?=?(UserService)?context.getBean("userService");
userService.test();

在這個示例中,我們使用了AnnotationConfigApplicationContext來加載應用程序的配置類AppConfig,并通過context.getBean()方法獲取了一個名為userService的Bean,最后調用了其test()方法。

Spring的配置方式 在過去,我們通常使用XML文件來配置Spring應用程序,如下所示:

<context:component-scan?base-package="com.bob"/>
<bean?id="userService"?class="com.bob.service.UserService"/>

而現在,我們更傾向于使用Java配置類來進行配置,如下所示:

@ComponentScan("com.bob")
public?class?AppConfig?{
????@Bean
????public?UserService?userService(){
????????return?new?UserService();
????}
}

AppConfig類替代了傳統的XML配置文件,成為了Spring的配置方式。它通過注解的方式告訴Spring在哪里掃描需要管理的Bean,并通過@Bean注解來聲明Bean。

Spring容器的創建方式

不同的Spring項目可能會使用不同的ApplicationContext來創建Spring容器:

在傳統的Spring項目中,我們使用ClassPathXmlApplicationContext來加載XML配置文件。

在SpringMVC項目中,我們使用XmlWebApplicationContext來加載XML配置文件。

而在SpringBoot項目中,則更常見地使用AnnotationConfigApplicationContext來加載Java配置類。

Bean的創建過程

Spring在創建Bean的過程中,會經歷以下幾個步驟:

掃描并解析配置類,得到需要管理的Bean的信息。
根據Bean的信息,實例化Bean對象并進行依賴注入。
執行Bean的生命周期回調方法,如BeanNameAware、BeanClassLoaderAware等。
執行@PostConstruct注解標注的初始化方法。
執行InitializingBean接口的afterPropertiesSet()方法。
如果需要進行AOP,生成代理對象并執行AOP邏輯。

AOP的實現原理

AOP(面向切面編程)是Spring框架的一個重要功能,它通過動態代理實現了橫切關注點的功能。

Spring判斷一個Bean是否需要進行AOP的大致流程如下:

找出所有的切面Bean。
遍歷切面中的方法,查看是否有@Before、@After等注解。
判斷方法的Pointcut(定義了方法全限定名)是否與當前Bean的類匹配。 如果匹配,則表示當前Bean需要進行AOP。
Spring使用cglib進行AOP時,會生成一個代理類,并在代理類中重寫被代理類的方法,在執行代理方法時,會先執行切面邏輯,然后再調用被代理方法。

Spring事務管理

Spring的事務管理功能是企業級應用程序開發中的重要組成部分。通過@Transactional注解,我們可以將一個方法標記為需要事務管理的方法。

Spring事務的代理對象執行方法時,會依次執行以下步驟:

判斷當前方法是否存在@Transactional注解。
如果存在,則創建數據庫連接并開啟事務。
執行業務邏輯代碼,即調用被代理方法。
如果執行過程中發生異常,則回滾事務;否則提交事務。
需要注意的是,Spring事務只有在被代理對象調用時才會生效,直接調用方法可能會導致事務失效。

以上就是對Spring的簡單使用及內部實現原理的介紹,希望能對您理解Spring框架有所幫助!如果有任何疑問或建議,歡迎留言討論。

本文由 mdnice 多平臺發布

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

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

相關文章

mysql8.0使用MGR實現高可用

一、三節點MGR集群的安裝部署 1. 安裝準備 準備好下面三臺服務器&#xff1a; IP端口角色192.168.150.213306mgr1192.168.150.223306mgr2192.168.150.233306mgr3 配置hosts解析 # cat >> /etc/hosts << EOF 192.168.150.21 mgr1 192.168.150.22 mgr2 192.168…

Windows環境下的調試器探究——硬件斷點

與軟件斷點與內存斷點不同&#xff0c;硬件斷點不依賴被調試程序&#xff0c;而是依賴于CPU中的調試寄存器。 調試寄存器有7個&#xff0c;分別為Dr0~Dr7。 用戶最多能夠設置4個硬件斷點&#xff0c;這是由于只有Dr0~Dr3用于存儲線性地址。 其中&#xff0c;Dr4和Dr5是保留的…

java中容器繼承體系

首先上圖 源碼解析 打開Collection接口源碼&#xff0c;能夠看到Collection接口是繼承了Iterable接口。 public interface Collection<E> extends Iterable<E> { /** * ...... */ } 以下是Iterable接口源碼及注釋 /** * Implementing this inte…

makefileGDB使用

一、makefile 1、make && makefile makefile帶來的好處就是——自動化編譯&#xff0c;一旦寫好&#xff0c;只需要一個make命令&#xff0c;整個工程完全自動編譯&#xff0c;極大的提高了軟件開發的效率 下面我們通過如下示例來進一步體會它們的作用&#xff1a; ①…

使用 Python 實現一個飛書/微信記賬機器人,酷B了!

Python飛書文檔機器人 今天的主題是&#xff1a;使用Python聯動飛書文檔機器人&#xff0c;實現一個專屬的記賬助手&#xff0c;這篇文章如果對你幫助極大&#xff0c;歡迎你分享給你的朋友、她、他&#xff0c;一起成長。 也歡迎大家留言&#xff0c;說說自己想看什么主題的…

代碼隨想錄第天 78.子集 90.子集II

LeetCode 78 子集 題目描述 給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&…

LeetCode 2581.統計可能的樹根數目:換根DP(樹形DP)

【LetMeFly】2581.統計可能的樹根數目&#xff1a;換根DP(樹形DP) 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 個節點的樹&#xff0c;節點編號為 0 到 n - 1 。樹用一個長度為 n - 1 的二維整數數組 edges…

debian/ubuntu 編譯安裝nginx php

debian/ubuntu 編譯安裝nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #關閉防火墻, 可能不需要 修改nginx運行用戶為tboqi 抱著log目錄可…

【通信基礎知識】完整通信系統的流程圖及各模塊功能詳解

2024.2.29 抱歉最近在寫畢設大論文&#xff0c;因此沒有太多時間更新。然而&#xff0c;在寫論文的過程中&#xff0c;發現自己對通信系統的了解還不夠全明白&#xff0c;因此差了一些碩博論文總結了一個完整的通信系統流程圖。若有不對的地方請多多指正//部分內容有參考ChatGP…

【Elasticsearch管理】網絡配置

文章目錄 HTTP高級網絡設置高級TCP設置 TransportTCP傳輸概要文件Transport跟蹤 線程池fixed線程池fixed_auto_queue_sizescaling處理器設置 HTTP Elasticsearch只在默認情況下綁定到本地主機。對于運行本地開發服務器(如果在同一臺機器上啟動多個節點&#xff0c;甚至可以運行…

YOLOv7基礎 | 第2種方式:簡化網絡結構之yolov7.yaml(由104層簡化為30層)

前言:Hello大家好,我是小哥談。通過下載YOLOv7源碼可知,原始的yolov7.yaml文件是拆開寫的,比較混亂,也不好理解,并且為后續改進增添了很多困難。基于此種情況,筆者就給大家介紹一種將yolov7.yaml文件簡化的方法,將104層簡化為30層,并且參數量和計算量和原來是一致的,…

內存占用構造方法

#使用虛擬內存構造內存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #釋放消耗的虛擬內存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #內存占用可直接在/dev/shm目錄下寫文件

《極客時間 - 左耳聽風》【文章筆記個人思考】

《極客時間 - 左耳聽風》原文鏈接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 這里的Leader是在技術上取得優勢&#xff0c;而不是行政…

2024年2月個人工作生活總結

本文為 2024年2月工作生活總結。 研發編碼 一些警告修正記錄 這個月修正了個人所負責的工程警告&#xff0c;這些警告其實是前人的代碼遺留的&#xff0c;我續寫的代碼&#xff0c;除printf函數的%d、%ld格式&#xff0c;都在寫的過程中改了。 下面記錄一些典型的警告及應對…

NLP(一)——概述

參考書: 《speech and language processing》《統計自然語言處理》 宗成慶 語言是思維的載體&#xff0c;自然語言處理相比其他信號較為特別 word2vec用到c語言 Question 預訓練語言模型和其他模型的區別? 預訓練模型是指在大規模數據上進行預訓練的模型&#xff0c;通常…

測試環境搭建整套大數據系統(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三臺機器執行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下倆內容 1.三臺機器分別給予各自的broker_id…

git操作學習記錄,簡單易上手

配置git 的賬戶郵箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代碼回溯 git rest --hard [commit哈希值]git log命令只能查看以當前狀態為終點的歷史日志 git reflog命令&#x…

Python+neo4j構建豆瓣電影知識圖譜

文章目錄 數據來源數據整理導入節點和關系導入使用Subgraph批量導入節點和關系 多標簽實體和實體去重 數據來源 http://www.openkg.cn/dataset/douban-movie-kg 該網址擁有豐富的中文知識圖譜數據集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人員使用研究…

【golang】25、圖片操作

用 “github.com/fogleman/gg” 可以畫線, 框 用 “github.com/disintegration/imaging” 可以變換顏色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬蟲——Urllib庫-3

目錄 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 獲取豆瓣電影前十頁的數據 ajax的post請求 總結 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 首先可以在瀏覽器找到發送數據的接口 那么我們的url就可以在header中找到了 再加上UA這個header 進行請…