Java基礎——分層解耦——IOC和DI入門

目錄

三層架構

Controller

Service

Dao

?編輯

調用過程

面向接口編程

分層解耦

耦合

內聚

軟件設計原則

控制反轉

依賴注入

Bean對象

如何將類產生的對象交給IOC容器管理?

容器怎樣才能提供依賴的bean對象呢?


三層架構

Controller

控制層,也稱為控制器,主要職責是接收前端發來的請求,并且給前端響應數據

Service

業務邏輯層,負責具體的業務邏輯處理

Dao

數據訪問層,也叫持久層,負責數據訪問操作,包括數據的增刪改查

在mybatis中通常叫mapper

調用過程

瀏覽器發起請求先訪問Controller,而Controller層僅僅負責接收請求響應數據,并不負責邏輯處理,所以Controller要去調用Service,Service再來進行邏輯處理,而Service進行邏輯處理的前提是要拿到數據,所以Service再來調用Dao,Dao再來訪問文件,從文件中加載數據,Dao將數據加載回來后訪問Service,Service再來對數據進行邏輯處理,邏輯處理完畢后再將處理后的數據返回給Controller,Controller再將數據響應給前端

面向接口編程

將來項目會升級,項目中的數據肯定不會在文件中存儲,他是要存儲在專門的數據庫中這個時候又要定義一個dao,這個dao要從數據庫中加載數據,也有可能項目中的數據來源于網絡,這個時候要再定義一個dao,那么dao層就會有多種實現,多種實現加載的數據來源是不一樣的。那在項目中為了提高程序的拓展性,便于項目的統一維護管理,我們通常會為dao的多種實現提供一個統一的接口,在接口中定義一個統一的規范,允許的不同的實現,各個實現來實現統一的接口,也就是面向接口編程

提供一個統一的接口

分層解耦

耦合

衡量軟件中各個層/各個模塊的依賴關聯程度

業務層Service代碼發生變化,Contrller層代碼也要發生跟著變化,我們成為Controller和Service之間耦合了

內聚

軟件中各個功能模塊內部的功能聯系

比如 userSerivice是用戶信息操作的Service,這個類中只會去處理用戶相關的邏輯,非用戶相關的邏輯不會定義在這個類中,我們就說這個類的內聚程度較高,即高內聚

軟件設計原則

高內聚低耦合

“高內聚”就是模塊內部的聯系越緊密越好,“低耦合”是指模塊與模塊||層與層之間要降低耦合,最好能做到解除耦合,也就是所謂的“解耦”

解耦后service層的代碼變動是不會影響controller層的,dao層代碼變動也不會影響service層,

想要解耦就不能去new對象,因為service層的代碼發生變化,new對象代碼部分也要跟著變化,那么層與層之間又耦合起來了

不去new對象,聲明了這個對象默認值就是null,調用userService的list方法就會報空指針異常

如何做到不new對象解除耦合又能不報空指針異常呢?

提供一個容器用來存儲一些對象,比如想用UserService這個實現類產生的對象,那就可以將這個實現類產生的對象交給容器來管理,在容器中就會產生UserService這個實現類產生的對象,也就是這個一號對象

Controller運行時需要用到UserService這個類型的對象,那么就可以從容器中查找這個對象,讓容器給應用程序來提供這個類型的對象,

由此看來,即使Service類的類名發生了變化,或者切換了一個實現類,對于Controller層來說是不用動任何的代碼,這樣就完成了層與層的解耦

控制反轉

簡稱IOC||Spring容器

對象的創建控制權由程序自身new轉移到外部容器,這種思想成為控制反轉

依賴注入

簡稱DI

容器為應用程序提供運行時所依賴的資源,這個過程稱為依賴注入

Bean對象

在IOC容器中創建管理的對象,稱之為Bean對象

如何將類產生的對象交給IOC容器管理?

在實現類上面加上注釋@Conponent,代表將這個類交給IOC容器管理,由IOC容器來負責這個對象的創建

如果是mybatis統一的接口xxxMapper,則在接口上方加上注解@Mapper,代表程序運行時,會自動為這個接口創建一個實現類對象(代理對象),并自動將該實現類對象存入IOC容器中,成為IOC容器的bean對象

容器怎樣才能提供依賴的bean對象呢?

在成員變量上加上注解@Autowired,會自動找到容器中UserDao類型的對象,并賦值給這個成員變量,這樣就完成了依賴注入的過程。

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

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

相關文章

智慧園區系統集成解決方案引領未來城市管理的智能化轉型

內容概要 在現代城市管理的背景下,“智慧園區系統集成解決方案”正扮演著越來越重要的角色。這種解決方案不僅僅是技術上的創新,更是一種全新的管理理念,它旨在通過高效的數據整合與分析,優化資源配置,提升運營效率。…

99.24 金融難點通俗解釋:MLF(中期借貸便利)vs LPR(貸款市場報價利率)

目錄 0. 承前1. 什么是MLF?1.1 專業解釋1.2 通俗解釋1.3 MLF的三個關鍵點: 2. 什么是LPR?2.1 專業解釋2.2 通俗解釋2.3 LPR的三個關鍵點: 3. MLF和LPR的關系4. 傳導機制4.1 第一步:央行調整MLF4.2 第二步:銀…

【VM】VirtualBox安裝CentOS8虛擬機

閱讀本文前,請先根據 VirtualBox軟件安裝教程 安裝VirtualBox虛擬機軟件。 1. 下載centos8系統iso鏡像 可以去兩個地方下載,推薦跟隨本文的操作用阿里云的鏡像 centos官網:https://www.centos.org/download/阿里云鏡像:http://…

Elasticsearch中的度量聚合:深度解析與實戰應用

在大數據和實時分析日益重要的今天,Elasticsearch以其強大的搜索和聚合能力,成為了眾多企業和開發者進行數據分析和處理的首選工具。本文將深入探討Elasticsearch中的度量聚合(Metric Aggregations),展示其如何在數據分…

C_C++輸入輸出(下)

C_C輸入輸出&#xff08;下&#xff09; 用兩次循環的問題&#xff1a; 1.一次循環決定打印幾行&#xff0c;一次循環決定打印幾項 cin是>> cout是<< 字典序是根據字符在字母表中的順序來比較和排列字符串的&#xff08;字典序的大小就是字符串的大小&#xff09;…

電腦要使用cuda需要進行什么配置

在電腦上使用CUDA&#xff08;NVIDIA的并行計算平臺和API&#xff09;&#xff0c;需要進行以下配置和準備&#xff1a; 1. 檢查NVIDIA顯卡支持 確保你的電腦擁有支持CUDA的NVIDIA顯卡。 可以在NVIDIA官方CUDA支持顯卡列表中查看顯卡型號是否支持CUDA。 2. 安裝NVIDIA顯卡驅動…

深入解析:一個簡單的浮動布局 HTML 示例

深入解析&#xff1a;一個簡單的浮動布局 HTML 示例 示例代碼解析代碼結構分析1. HTML 結構2. CSS 樣式 核心功能解析1. 浮動布局&#xff08;Float&#xff09;2. 清除浮動&#xff08;Clear&#xff09;3. 其他樣式 效果展示代碼優化與擴展總結 在網頁設計中&#xff0c;浮動…

家居EDI:Hom Furniture EDI需求分析

HOM Furniture 是一家成立于1977年的美國家具零售商&#xff0c;總部位于明尼蘇達州。公司致力于提供高品質、時尚的家具和家居用品&#xff0c;滿足各種家庭和辦公需求。HOM Furniture 以廣泛的產品線和優質的客戶服務在市場上贏得了良好的口碑。公司經營的產品包括臥室、客廳…

【VUE案例練習】前端vue2+element-ui,后端nodo+express實現‘‘文件上傳/刪除‘‘功能

近期在做跟畢業設計相關的數據后臺管理系統&#xff0c;其中的列表項展示有圖片展示&#xff0c;添加/編輯功能有文件上傳。 “文件上傳/刪除”也是我們平時開發會遇到的一個功能&#xff0c;這里分享個人的實現過程&#xff0c;與大家交流談論~ 一、準備工作 本次案例使用的…

C++中的析構器(Destructor)(也稱為析構函數)

在C中&#xff0c;析構器&#xff08;Destructor&#xff09;也稱為析構函數&#xff0c;它是一種特殊的成員函數&#xff0c;用于在對象銷毀時進行資源清理工作。以下是關于C析構器的詳細介紹&#xff1a; 析構函數的特點 名稱與類名相同&#xff0c;但前面有一個波浪號 ~&a…

VLN視覺語言導航基礎

0 概述 視覺語言導航模型旨在構建導航決策模型 π π π&#xff0c;在 t t t時刻&#xff0c;模型能夠根據指令 W W W、歷史軌跡 τ { V 1 , V 2 , . . . , V t ? 1 } \tau\{V_1,V_2,...,V_{t-1}\} τ{V1?,V2?,...,Vt?1?}和當前觀察 V t { P t , R t , N ( V t ) } V_…

AI協助探索AI新構型的自動化創新概念

訓練AI自生成輸出模塊化代碼&#xff0c;生成元代碼級別的AI功能單元代碼&#xff0c;然后再由AI組織為另一個AI&#xff0c;實現AI開發AI的能力&#xff1b;用AI協助探索迭代新構型AI將會出現&#xff0c;并成為一種新的技術路線潮流。 有限結點&#xff0c;無限的連接形式&a…

Flux的三步煉丹爐——fluxgym(三):矩陣測試

前面兩篇文章給大家介紹了如何準備素材和怎么煉丹&#xff0c;現在我們拿到訓練完成后的多個Lora怎么才能確定哪個才是我們需要的、效果最好的呢&#xff1f;答案就是使用xyz圖表測試&#xff0c;也稱為矩陣測試&#xff0c;通過控制控制變量的方法對Lora模型批量生圖&#xff…

利用Muduo庫實現簡單且健壯的Echo服務器

一、muduo網絡庫主要提供了兩個類&#xff1a; TcpServer&#xff1a;用于編寫服務器程序 TcpClient&#xff1a;用于編寫客戶端程序 二、三個重要的鏈接庫&#xff1a; libmuduo_net、libmuduo_base、libpthread 三、muduo庫底層就是epoll線程池&#xff0c;其好處是…

文件讀寫操作

寫入文本文件 #include <iostream> #include <fstream>//ofstream類需要包含的頭文件 using namespace std;void test01() {//1、包含頭文件 fstream//2、創建流對象ofstream fout;/*3、指定打開方式&#xff1a;1.ios::out、ios::trunc 清除文件內容后打開2.ios:…

C++編程語言:抽象機制:模板(Bjarne Stroustrup)

目錄 23.1 引言和概觀(Introduction and Overview) 23.2 一個簡單的字符串模板(A Simple String Template) 23.2.1 模板的定義(Defining a Template) 23.2.2 模板實例化(Template Instantiation) 23.3 類型檢查(Type Checking) 23.3.1 類型等價(Type Equivalence) …

定制Centos鏡像(二)

本章是對上篇文章的擴展&#xff1a; https://blog.csdn.net/qq_50247813/article/details/145286244 上篇文章學習了如何自定義鏡像安裝。這篇介紹如何在定制鏡像的時候安裝其他軟件&#xff1b; &#xff08;源文件參考上篇文章&#xff09; 根據上篇文章的步驟&#xff0c;…

【機器學習理論】樸素貝葉斯網絡

基礎知識&#xff1a; 先驗概率&#xff1a;對某個事件發生的概率的估計。可以是基于歷史數據的估計&#xff0c;可以由專家知識得出等等。一般是單獨事件概率。 后驗概率&#xff1a;指某件事已經發生&#xff0c;計算事情發生是由某個因素引起的概率。一般是一個條件概率。 …

Flutter 新春第一彈,Dart 宏功能推進暫停,后續專注定制數據處理支持

在去年春節&#xff0c;Flutter 官方發布了宏&#xff08;Macros&#xff09;編程的原型支持&#xff0c; 同年的 5 月份在 Google I/O 發布的 Dart 3.4 宣布了宏的實驗性支持&#xff0c;但是對于 Dart 內部來說&#xff0c;從啟動宏編程實驗開始已經過去了幾年&#xff0c;但…

計算機組成原理——存儲系統(一)

在人生的道路上&#xff0c;成功與失敗交織成一幅豐富多彩的畫卷。不論我們是面對勝利的喜悅&#xff0c;還是遭遇失敗的痛苦&#xff0c;都不能放棄對夢想的追求。正是在這種追求中&#xff0c;我們不斷地超越自我&#xff0c;不斷地突破自己的極限。只有勇往直前&#xff0c;…