SSM核心容器部分

IOC:Inversion of control控制反轉-使用對象時由程序中主動new對象轉為外部提供對象。

? ? ? ? 此過程中對象創建控制權由程序內部轉為外部,此思想稱為控制反轉。

Spring技術對IOC思想提供了實現:

? ? ? ? Spring提供一個容器,稱為IOC容器,用來充當IOC思想的“外部”

? ? ? ? IOC容器負責對象的創建、初始化等工作,被創建的對象在IOC容器中被稱為Bean

適合交給容器管理的對象:表現層對象、業務層對象、數據層對象、工具對象

不適合交給容器管理的對象:封裝實體的域對象

<!-- 1.pom文件中導入Spring對應的坐標spring-context,對應的版本是5.3.21-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.21</version>
</dependency>
<!-- 2.配置bean-->
<bean id="bookDao" class="com.kxg.exercise.dao.impel.BookDaoImpel" name="bookDao1,bokDao2" scope="prototype"/>

bean標簽屬性介紹:

? ? ? ? id屬性:給bean起名字

? ? ? ? class屬性:表示給bean定義類型

? ? ? ? name屬性:給bean起別名。可以定義多個,是用逗號、分號、空格分隔

? ? ? ? scope屬性:定義bean的作用范圍。singleton:單例(默認) prototype:非單例

程序內部獲取bean可以通過id或name,如果兩個都沒有得到將拋出異常NoSuchBeanDefinition

// 3.在程序中獲取容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");// 可以使用文件系統配置路徑:new ClassPathXmlApplicationContext("絕對路徑")// 一次獲取多個容器:new ClassPathXmlApplicationContext("a.xml","b.xml");
// 4.獲取容器中的bean// 方法一:按照bean名稱獲取
BookDao bookDao1 = (BookDao)ctx.getBean("bookDao");// 方法二:按照bean類型獲取(類型唯一)
BookDao bookDao2 = ctx.getBean("BookDao.class");// 方法三:使用bean名稱獲取指定類型
BookDao bookDao3 = ctx.getBean("bookDao", BookDao.class);

經過上面幾步,對象的創建成功由程序內部轉為程序外部

DI:Dependency Injection-依賴注入

? ? ? ? 在容器中建立bean與bean之間的依賴關系的整個過程,成為依賴注入

<!-- 在spring文件中配置類與類之間的關系:service與dao-->
<bean id="bookService" class="com.kxg.exercise.service.impel.BookServiceImpel"><property name="bookDao" ref="bookDao"/>
</bean>

property標簽:表示配置當前bean的屬性

? ? ? ? name:表示配置哪一個具體的屬性

? ? ? ? ref:表示參照哪一個bean(兩個類的綁定)

依賴注入的目的:充分解耦

通過控制反轉、依賴注入,對象可以直接從外部獲取,并且獲取到的bean已經綁定了所有的依賴

這樣雖然實現了解耦但是同時也出現了很多新問題:

? ? ? ? bean類中的成員變量怎樣實現初始化???

? ? ? ? bean是怎樣進行實例化的???

? ? ? ? bean的生命周期???

? ? ? ? 外部bean怎樣進行管理???

因此Spring也提供了很多解決方案。

依賴注入的方式:setter注入、構造器注入

setter注入:

? ? ? ? 簡單數據類型:在bean類中設置set方法;xml文件中使用property標簽value屬性注入

? ? ? ? 引用數據類型:在bean類中設置set方法;xml文件中使用property標簽ref屬性注入建立關系

<property name="connectNumber" value="10"/>
<property name="bookDao" ref="bookDao"/>

構造器注入:

? ? ? ? 簡單類型:bean類中提供構造方法;xml文件中<constructor-atg>標簽中name、value屬性

? ? ? ? 引用類型:bean類中提供構造方法;xml文件中<constructor-atg>標簽中name、ref屬性

<!-- 引用類型 -->
<constructor-arg name="bookDao" ref="bookDao"/> 
<!-- 簡單數據類型 --><!-- 通過參數名稱匹配:沒有達到程序解耦的問題 -->
<constructor-arg name="connectNumber" value="55"/>
<constructor-arg name="databaseName" value="mysql"/><!-- 通過參數值類型進行匹配,試圖實現解耦問題 -->
<constructor-arg type="int" value="55"/>
<constructor-arg type="java.lang.String" value="mysql"/><!-- 通過參數前后位置匹配,試圖實現解耦問題 -->
<constructor-arg index="1" value="55"/>
<constructor-arg index="2" value="mysql"/>

通過依賴注入的不同方式,第一個問題得到了解決

bean的實例化:

構造方法:調用類中的無參構造創建實例對象

靜態工廠:調用工廠類中的靜態方法實例化對象

? ? ? ? 1.添加factory-method屬性創建類,不能僅配工廠名。否則僅僅創建的是工廠類不是bean對象

? ? ? ? 2.factory工廠類中方法添加static才能創建對象

// 靜態工廠-static
public static BookDao getBookDao() {System.out.println("factory setup...");return new BookDaoImpel();
}
<bean id="bookDaoFactory" class="com.kxg.exercise.factory.BookDaoFactory" factory-method="getBookDao"/>

實例工廠:調用靜態類中的非靜態方法

? ? ? ? 容器中配置工廠類

? ? ? ? 容器中factory-bean找到相應的工廠類,factory-method找到對應的方法

// 非靜態工廠
public BookDao getBookDao_() {System.out.println("factory2 setup...");return new BookDaoImpel();
}
<!--非靜態工廠-->
<bean id="bookDaoFactory1" class="com.kxg.exercise.factory.BookDaoFactory"/>
<bean id="bookDao1" factory-method="getBookDao_" factory-bean="bookDaoFactory1"/>

使用FactoryBean實例化

? ? ? ? 創建相關FactoryBean類實現FactoryBean接口,實現相關的創建方法getObject

? ? ? ? 容器中加載FactoryBean類

public class bookDaoFactoryBean implements FactoryBean<BookDao> {// 得到bean實例:代替原始實例工廠中創建對象的方法@Overridepublic BookDao getObject() throws Exception {System.out.println("FactoryBean...");return new BookDaoImpel();}
}
<!-- FactoryBean-->
<bean id="bookDao2" class="com.kxg.exercise.factory.bookDaoFactoryBean"/>
BookDao bookDao5 = (BookDao) ctx.getBean("bookDao2");
System.out.println(bookDao5);   
   

bean生命周期:

bean生命周期控制:從bean創建后到銷毀前做的一些事情

????????1.類中提供生命周期的控制方法,xml文件中配置生命周期的方法

????????2.類實現InitializingBean、DisposableBean接口

初始化容器:創建對象(內存分配);執行構造方法;執行屬性注入(set);執行bean初始化方法

使用bean:執行業務操作

關閉/銷毀容器:執行bean銷毀方法

bean銷毀時機:容器關閉前觸發bean的銷毀

????????關閉容器的方法:

????????????????1.手動關閉容器:ConfigurableApplicationContext接口close()操作

????????????????2.注冊關閉鉤子,在虛擬機退出前先關閉容器在退出虛擬機:ConfigurableApplicationContext接口registerShutdownHook()

接下來就到了最后一個問題:外部bean怎樣管理?

以數據源對象為例:

1.spring中開啟context命名空間xmlns:context="http://www.springframework.org/schema/context"

?2.在context空間中加載properties文件 ?

???????? system-properties-mode="NEVER":不加載系統屬性 ?????????location="jdbc1.properties,jdbc2.properties:加載多個properties文件? ????????location="classpath:*.properties:加載路徑下的所有properties文件標準格式 ????????location="classpath*:*.properties:從類路徑或jar包中搜索并加載properties文件???

3.使用屬性占位符${}讀取properties文件中的屬性

<context:property-placeholder location="classpath:*.properties"/>
<bean class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/>
</bean>
// 創建數據源對象
DataSource dataSource1 = (DataSource) ctx.getBean("dataSource1");
System.out.println(dataSource1);

此外spring還提供了依賴自動裝配:直接在bean標簽中使用autowire屬性

按類型:autowire="byType"

? ? ? ? 使用類型裝配時,必須保障容器中相同類型的bean唯一

按名稱:autowire="byName"

? ? ? ? 使用名稱自動裝配時,必須保障容器中具有指定名稱的bean

1.自動裝配用于引用類型注入,不適用于簡單類型

2.自動裝配優先級低于setter注入與構造器注入,同時出現時自動裝配失效

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

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

相關文章

能力認證!時代新威榮獲《數據安全服務能力評定資格證書》

2024年1月17日&#xff0c;時代新威受邀出席中國計算機行業協會數據安全專業委員會&#xff08;以下簡稱“數專委”&#xff09;年度工作總結會。此次會議旨在聚集行業企業&#xff0c;搭建數據安全產業企業交流平臺&#xff0c;共建產業發展“朋友圈”。 會上&#xff0c;數專…

windows | linux | SSH 密鑰驗證

SSH密鑰登陸過程 客戶端通過ssh-keygen生成自己的公鑰和私鑰。手動將客戶端的公鑰放入遠程服務器的指定位置。客戶端向服務器發起 SSH 登錄的請求。服務器收到用戶 SSH 登錄的請求&#xff0c;發送一些隨機數據給用戶&#xff0c;要求用戶證明自己的身份。客戶端收到服務器發來…

初階數據結構:鏈表相關題目練習(補充)

目錄 1. 單鏈表相關練習題1.1 移除鏈表元素1.2 反轉鏈表1.3 鏈表的中間結點1.4 鏈表的倒數第k個結點1.5 合并兩個有序鏈表1.6 鏈表分割1.7 鏈表的回文結構1.8 相交鏈表1.9 判斷一個鏈表中是否有環1.10 尋找環狀鏈表相遇點1.11 鏈表的深度拷貝 1. 單鏈表相關練習題 注&#xff1…

IEEE Transactions on Industrial Electronics工業電子TIE修改稿注意事項及提交須知

一、背景 兔年末投了一篇TIE&#xff0c;手稿初次提交的注意事項也整理成了博客IEEE Transactions on Industrial Electronics工業電子TIE論文投稿須知&#xff0c;獲得了許多點贊和收藏。最近也收到了審稿結果&#xff0c;給的意見是大修major revision&#xff0c;總之只要不…

基于springboot+vue的線上輔導班系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

吸貓毛空氣凈化器哪個好?推薦除貓毛好的寵物空氣凈化器品牌

如今&#xff0c;越來越多的家庭選擇養寵物&#xff01;雖然家里變得更加溫馨&#xff0c;但養寵可能會帶來異味和空氣中的毛發增多可能會引發健康問題&#xff0c;這也是一個大問題。 但我不想家里到處都是異味&#xff0c;尤其是便便的味道&#xff0c;所以很需要一款能夠處…

QML中表格中數據獲取

1.在生成的動態表格中獲取某格數據的內容 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableMod…

數據分析-Pandas數據如何圖示規律

數據分析-Pandas數據如何圖示規律 數據分析和處理中&#xff0c;難免會遇到各種數據&#xff0c;那么數據呈現怎樣的規律呢&#xff1f;不管金融數據&#xff0c;風控數據&#xff0c;營銷數據等等&#xff0c;莫不如此。如何通過圖示展示數據的規律&#xff1f; 數據表&…

VS2015報錯:error MSB8020和MSB8036的解決方案

VS2015編譯報錯&#xff1a;error MSB8020 提示信息&#xff1a;error MSB8020: The build tools for v141 (Platform Toolset ‘v141’) cannot be found. To build using the v141 build tools, please install v141 build tools. Alternatively, you may upgrade to the c…

小程序框架接口-getApp

框架接口-getApp getApp() 用于獲取小程序全局唯一的 App 實例&#xff0c;通過小程序應用實例可實現數據或方法的共享 &#x1f4cc; 注意事項&#xff1a; 1.不要在 App() 方法中使用 getApp() &#xff0c;使用 this 就可以拿到 app 實例通過 getApp() 獲取實例之后&#x…

Android13 Audio框架

一、Android 13音頻代碼結構 1、framework: android/frameworks/base 1.AudioManager.java &#xff1a;音頻管理器&#xff0c;音量調節、音量UI、設置和獲取參數等控制流的對外API 2.AudioService.java &#xff1a;音頻系統服務&#xff08;java層&#xff09;&#xff0c…

多模態論文閱讀-LLaVA

Visual Instruction Tuning Abstract1. Introduction2. Related Work3. GPT-assisted Visual Instruction Data Generation4. Visual Instruction Tuning4.1 Architecture4.2 Training 5 Experiments5.1 Multimodal Chatchot5.2 ScienceQA 6 Conclusion Abstract 使用機器生成…

JS中判斷是否存在逗號,如果存在給去掉

.includes() 方法判斷是否存在 split("需要去掉的字符串").join(" ") 去重的方法 去重復 劃分后拼接

網絡——DHCP服務器、DNS服務器實驗

網絡——DHCP服務器、DNS服務器實驗 一、DHCP服務器實驗 DHCP——動態主機配置協議,用來管理ip地址的分配。網絡中的每臺計算機都有至少一個ip地址。在Windows網絡連接對話框中可以設置成自動獲取ip地址,這樣主機作為DHCP client就可以自動從DHCP server獲取ip地址了。 DHC…

live555學習 - 環境準備

環境&#xff1a;Ubuntu 16.04.7 ffmpeg-6.1 1 代碼下載 最新版本&#xff1a; http://www.live555.com/liveMedia/public/ 歷史版本下載 https://download.videolan.org/pub/contrib/live555/ 選擇版本live.2023.01.19.tar.gz ps&#xff1a;沒有選擇新版本是新版本在…

數據庫優化建議

盡量控制單表數據量的大小&#xff0c;建議控制在 500 萬以內 500 萬并不是 MySQL 數據庫的限制&#xff0c;過大會造成修改表結構&#xff0c;備份&#xff0c;恢復都會有很大的問題。可以用歷史數據歸檔&#xff08;應用于日志數據&#xff09;&#xff0c;分庫分表&#xf…

阿里開源的Java診斷利器Arthas

一.什么是Arthas 1.為什么需要Arthas 通常&#xff0c;本地開發環境無法訪問生產環境。如果在生產環境中遇到問題&#xff0c;則無法使用 IDE 遠程調試。更糟糕的是&#xff0c;在生產環境中調試是不可接受的&#xff0c;因為它會暫停所有線程&#xff0c;導致服務暫停。 開…

探索Apple Vision Pro:創新技術帶來的多彩應用世界

Apple Vision Pro是一款具有前沿技術的設備,可以與現實世界進行交互,讓用戶在虛擬世界中享受各種應用。以下是一些值得注意的Vision Pro應用: AR演示環境:Vision Pro上的AR應用主要是基于AR的演示環境,這些應用可以讓用戶在現實世界中體驗虛擬世界。游戲:Vision Pro上有一…

c語言統計字符

本題要求編寫程序&#xff0c;輸入10個字符&#xff0c;統計其中英文字母、空格或回車、數字字符和其他字符的個數。 輸入格式: 輸入為10個字符。最后一個回車表示輸入結束&#xff0c;不算在內。 輸出格式: 在一行內按照 letter 英文字母個數, blank 空格或回車個數, d…

鴻蒙Harmony應用開發—ArkTS聲明式開發(鼠標事件)

在鼠標的單個動作觸發多個事件時&#xff0c;事件的順序是固定的&#xff0c;鼠標事件默認透傳。 說明&#xff1a; 從API Version 8開始支持。后續版本如有新增內容&#xff0c;則采用上角標單獨標記該內容的起始版本。目前僅支持通過外接鼠標觸發。 onHover onHover(event: …