【spring】第一篇 IOC和DI入門案例

Spring到底是如何來實現IOC和DI的,那接下來就通過一些簡單的入門案例,來演示下具體實現過程。

目錄

前期準備

一、IOC入門案例

思路分析

代碼實現

二、DI入門案例

思路分析

代碼實現

總結


前期準備

使用IDEA創建Maven項目,首先需要配置好Maven,新建一個Maven項目。

一、IOC入門案例

思路分析

(1)Spring是使用容器來管理bean對象的,那么管什么?

  • 主要管理項目中所使用到的類對象,比如(Service和Dao)

(2)如何將被管理的對象告知IOC容器?

  • 使用配置文件

(3)被管理的對象交給IOC容器,要想從容器中獲取對象,就先得思考如何獲取到IOC容器?

  • Spring框架提供相應的接口

(4)IOC容器得到后,如何從容器中獲取bean?

  • 調用Spring框架提供對應接口中的方法

(5)使用Spring導入哪些坐標?

  • 用別人的東西,就需要在pom.xml添加對應的依賴

代碼實現

(1)創建Maven項目,在pom.xml 添加Spring的依賴jar包,

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

(2)創建BookService,BookServiceImpl,BookDao和BookDaoImpl四個類,

目錄如下:

package com.water.dao;public interface BookDao {public void save();
}
package com.water.dao.impl;import com.water.dao.BookDao;public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ...");}
}
package com.water.server;public interface BookService {public void save();
}
package com.water.server.impl;import com.water.dao.BookDao;
import com.water.dao.impl.BookDaoImpl;
import com.water.server.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao = new BookDaoImpl();public void save() {System.out.println("book service save ...");bookDao.save();}
}

(3)resources下添加spring配置文件applicationContext.xml,并完成bean的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean標簽標示配置beanid屬性標示給bean起名字class屬性表示給bean定義類型--><bean id="bookDao" class="com.water.dao.impl.BookDaoImpl"></bean><bean id="bookService" class="com.water.server.impl.BookServiceImpl"></bean>
</beans>

(4)首先獲取IOC容器,使用Spring提供的接口完成IOC容器的創建,創建App類,編寫main方法。然后,從容器中獲取對象進行方法調用。

package com.water;import com.water.dao.BookDao;
import com.water.server.impl.BookService;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App 
{public static void main( String[] args ) {// 獲取IOC容器ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");// 獲取beanBookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();BookService bookService = (BookService) ctx.getBean("bookService");bookService.save();}
}

運行代碼,測試結果為:

Spring的IOC入門案例已經完成,但是在BookServiceImpl的類中依然存在BookDaoImpl對象的new操作,它們之間的耦合度還是比較高,這塊該如何解決,就需要用到下面的DI:依賴注入

二、DI入門案例

思路分析

(1)要想實現依賴注入,必須要基于IOC管理Bean

  • DI的入門案例要依賴于前面IOC的入門案例

(2)Service中使用new形式創建的Dao對象是否保留?

  • 需要刪除掉,最終要使用IOC容器中的bean對象

(3)Service中需要的Dao對象如何進入到Service中?

  • 在Service中提供方法,讓Spring的IOC容器可以通過該方法傳入bean對象

(4)Service與Dao間的關系如何描述?

  • 使用配置文件

代碼實現

(1)在BookServiceImpl類中,刪除業務層中使用new的方式創建的dao對象 。在BookServiceImpl類中,為BookDao提供setter方法。

package com.water.server.impl;import com.water.dao.BookDao;
import com.water.dao.impl.BookDaoImpl;
import com.water.server.BookService;public class BookServiceImpl implements BookService {//刪除業務層中使用new的方式創建的dao對象
//  private BookDao bookDao = new BookDaoImpl();private BookDao bookDao;public void save() {System.out.println("book service save ...");bookDao.save();}// 為屬性提供setter方法public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}
}

(2)在配置文件中添加依賴注入的配置,

  • name="bookDao"中bookDao的作用是讓Spring的IOC容器在獲取到名稱后,將首字母大寫,前面加set找對應的setBookDao()方法進行對象注入

  • ref="bookDao"中bookDao的作用是讓Spring能在IOC容器中找到id為bookDao的Bean對象給bookService進行注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean標簽標示配置beanid屬性標示給bean起名字class屬性表示給bean定義類型--><bean id="bookDao" class="com.water.dao.impl.BookDaoImpl"></bean><bean id="bookService" class="com.water.server.impl.BookServiceImpl"><!--配置server與dao的關系--><!--property標簽表示配置當前bean的屬性name屬性表示配置哪一個具體的屬性ref屬性表示參照哪一個bean--><property name="bookDao" ref="bookDao"></property></bean>
</beans>

(4)運行,測試結果為:

補充:bean基礎配置

(1)bean的基礎配置

對于bean的基礎配置,在前面的案例中已經使用過:

<bean id="" class=""/>

其中,bean標簽的功能、使用方式以及id和class屬性的作用,我們通過一張圖來描述下

(2)bean的別名配置

(3)bean的作用范圍

在Spring配置文件中,配置scope屬性來實現bean的非單例創建,使用bean的scope屬性可以控制bean的創建是否為單例:

  • singleton默認為單例
  • prototype為非單例

介紹完scope屬性以后,我們來思考幾個問題:

1)為什么bean默認為單例?

bean為單例的意思是在Spring的IOC容器中只會有該類的一個對象。bean對象只有一個就避免了對象的頻繁創建與銷毀,達到了bean對象的復用,性能高

2)bean在容器中是單例的,會不會產生線程安全問題?

  • 如果對象是有狀態對象,即該對象有成員變量可以用來存儲數據的,因為所有請求線程共用一個bean對象,所以會存在線程安全問題。

  • 如果對象是無狀態對象,即該對象沒有成員變量沒有進行數據存儲的,因為方法中的局部變量在方法調用完成后會被銷毀,所以不會存在線程安全問題。

3)哪些bean對象適合交給容器進行管理?

  • 表現層對象

  • 業務層對象

  • 數據層對象

  • 工具對象

4)哪些bean對象不適合交給容器進行管理?

封裝實例的域對象,因為會引發線程安全問題,所以不適合。

總結

通過前面兩個案例,我們已經學習了bean如何定義配置DI如何定義配置以及容器對象如何獲取的內容。

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

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

相關文章

JAVAEE1

Web前端&#xff1a; 1.建立web開發的息維模式寫代碼不僅僅是為了實現某個功能&#xff0c;更是學習解決問題的思維方式 2.先使用&#xff0c;再理解&#xff0c;會導致剛開始比較懵&#xff0c;不知其所以然.切忌不可深陷其中&#xff0c; 3.涉及簡單的軟件工程的設計思想&…

Springboot整合kafka簡單使用

kafka 一&#xff0c;介紹 Kafka 是一個開源的分布式流處理平臺&#xff0c;最初由 LinkedIn 開發并貢獻給 Apache 軟件基金會。它設計用于構建高性能、持久性、可伸縮和容錯的實時數據管道和流處理應用程序。 以下是 Kafka 的一些關鍵特點和概念&#xff1a; 發布-訂閱模型…

SPWM載波調制方式-三電平雜記1

方法一&#xff1a; P2 O1 N0 方法二&#xff1a;雙載波直接發波 方法三&#xff1a;負軸載波和調制波往上抬升1&#xff0c;得到使用同一個載波 在正半周在P和O切換&#xff0c;在下半軸式O和N切換

自動評論自動私信引流系統,自動化時代的挑戰與機遇

隨著科技的飛速發展&#xff0c;自動化技術已經滲透到我們生活的方方面面。從工業生產線上的機械臂到家庭中的智能助手&#xff0c;自動化不僅改變了我們的工作方式&#xff0c;也在重塑著社會的面貌。然而&#xff0c;在享受自動化帶來的便利和效率的同時&#xff0c;我們也必…

961題庫 北航計算機 MIPS基礎選擇題 附答案 選擇題形式

有題目和答案&#xff0c;沒有解析&#xff0c;不懂的題問大模型即可&#xff0c;無償分享。 第1組 習題 MIPS處理器五級流水線中&#xff0c;涉及DRAM的是 A. 取指階段 B. 譯碼階段 C. 執行階段 D. 訪存階段 MIPS處理器五級流水線中&#xff0c;R型指令保存結果的階段是 A.…

關于高版本 Plant Simulation 每次保存是 提示提交comm對話框的處理方法

關于高版本 Plant Simulation 每次保存是 提示提交comm對話框的處理方法 如下圖 將model saving history 修改為None即可 關于AutoCAD 2022 丟失模板庫的問題 從新從以下地址打開即可&#xff1a; D:\Program Files\Autodesk\AutoCAD 2022\UserDataCache\zh-cn\Template

Visual Studio Installer 點擊閃退

Visual Studio Installer 點擊閃退問題 1. 問題描述2. 錯誤類型3. 解決方法4. 結果5. 說明6. 參考 1. 問題描述 重裝了系統后&#xff08;系統版本&#xff1a;如下圖所示&#xff09;&#xff0c;我從官方網站&#xff08;https://visualstudio.microsoft.com/ ) 下載了安裝程…

Leetcode:正則表達式匹配

目錄 普通版本&#xff08;動態規劃&#xff09; 狀態表示 狀態轉移方程 優化③①情況 數學化簡分析 結合實際情況畫圖化簡分析 總結 最終代碼 題目鏈接&#xff1a;10. 正則表達式匹配 - 力扣&#xff08;LeetCode&#xff09; 好像是leetcode前100道里面最難的一道&a…

方法引用與構造方法引用

目錄 方法引用 什么是方法引用 構造方法引用 構造方法引用&#xff08;也可以稱作構造器引用&#xff09; 數組構造方法引用 方法引用 什么是方法引用 當要傳遞給 Lambda 體的操作&#xff0c;已經有實現的方法了&#xff0c;可以使用方法引用。 方法引用可以看做是 La…

PHAR反序列化

PHAR PHAR&#xff08;PHP Archive&#xff09;文件是一種歸檔文件格式&#xff0c;phar文件本質上是一種壓縮文件&#xff0c;會以序列化的形式存儲用戶自定義的meta-data。當受影響的文件操作函數調用phar文件時&#xff0c;會自動反序列化meta-data內的內容,這里就是我們反序…

頭歌頁面置換算法第3關:計算LRU算法缺頁率

2 任務:LRU算法 2.1 任務描述 設計LRU頁面置換算法模擬程序:從鍵盤輸入訪問串。計算LRU算法在不同內存頁框數時的缺頁數和缺頁率。要求程序模擬駐留集變化過程,即能模擬頁框裝入與釋放過程。 2.2任務要求 輸入串長度作為總頁框數目,補充程序完成LRU算法。 2.3算法思路 LRU算…

jmeter常用的斷言

包括&#xff08;Contains&#xff09;&#xff1a;響應內容包括需要匹配的內容即代表響應成功&#xff0c;支持正則表達式 匹配&#xff08;Matches&#xff09;&#xff1a;響應內容要完全匹配需要匹配的內容即代表響應成功&#xff0c;大小寫不敏感&#xff0c;支持正則表達…

vue html2canvas生成base64圖片和圖片高度

vue html2canvas生成圖片 exportAsBase64() {const ele document.getElementById(content);html2canvas(ele, {dpi: 96, // 分辨率 scale: 2, // 設置縮放 useCORS: true, // 允許canvas畫布內跨域請求外部鏈接圖片 bgcolor: #ffffff, // 背景顏色 logging: false, // 不…

rust之cargo install cargo-binstall 是什么

cargo-binstall 是什么 官方&#xff1a;https://lib.rs/crates/cargo-binstall Binstall 提供了一種低復雜性的機制來安裝 Rust 二進制文件&#xff0c;作為從源代碼&#xff08;通過 cargo install &#xff09;構建或手動下載軟件包的替代方案。這旨在與現有的 CI 工件和基…

Windows安裝ElasticSearch版本7.17.0

在Windows系統上本地安裝Elasticsearch的詳細步驟如下&#xff1a; 1. 下載Elasticsearch 訪問 Elasticsearch下載頁面。選擇適用于Windows的版本7.17.0&#xff0c;并下載ZIP文件。 2. 解壓文件 下載完成后&#xff0c;找到ZIP文件&#xff08;例如 elasticsearch-7.17.0.…

【算法篇】冒泡排序算法JavaScript版

冒泡排序算法&#xff1a;原理與實現 冒泡排序&#xff08;Bubble Sort&#xff09;是一種簡單的排序算法&#xff0c;它重復地遍歷要排序的數列&#xff0c;一次比較兩個元素&#xff0c;如果它們的順序錯誤就把它們交換過來。遍歷數列的工作是重復地進行直到沒有再需要交換&…

spoon基礎使用-第一個轉換文件

新建一個轉換&#xff0c;文件->新建->轉換&#xff0c;也可以直接ctralN新建。 從右邊主對象樹拖拽一個輸入->表輸入&#xff1b;輸出->文本文檔輸出&#xff1b;也可以直接在搜索框搜素表輸入、文本文檔輸出。 雙擊表輸入新建一個數據庫連接 確定后就可以在S…

【人工智能】第二部分:ChatGPT的架構設計和訓練過程

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

Java | Leetcode Java題解之第126題單詞接龍II

題目&#xff1a; 題解&#xff1a; class Solution {public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {List<List<String>> res new ArrayList<>();// 因為需要快速判斷擴展出的單詞…

傳輸中的串擾(八)

串擾指的是有害信號從一個線網傳遞到相鄰線網上。通常把噪聲源所在的線網稱為動態線或攻擊線網&#xff0c;而把有噪聲形成的線網稱為靜態線或受害線網。 靜態線上的噪聲電壓的表現與信號電壓完全一樣。一旦在靜態線上產生噪聲電壓&#xff0c;它們就會傳播并在阻抗突變處出現反…