淺談一下Spring的核心基礎(chǔ)IOC與DI
一、Spring簡(jiǎn)介
1 Spring介紹
1.1 為什么要學(xué)
Spring技術(shù)是JavaEE開(kāi)發(fā)必備技能,企業(yè)開(kāi)發(fā)技術(shù)選型命中率>90%
專(zhuān)業(yè)角度
簡(jiǎn)化開(kāi)發(fā),降低企業(yè)級(jí)開(kāi)發(fā)的復(fù)雜性框架整合,高效整合其他技術(shù),提高企業(yè)級(jí)應(yīng)用開(kāi)發(fā)與運(yùn)行效率
1.2 學(xué)什么
簡(jiǎn)化開(kāi)發(fā)
- IOC(反轉(zhuǎn)控制)
- AOP(面向切面編程)
- 事務(wù)處理
框架整合
- MyBatis
- MyBatis-plus
- Struts
- Struts2
- Hibernate……
2 初識(shí)Spring
2.1 Spring家族
官網(wǎng):https://spring.ioSpring發(fā)展到今天已經(jīng)形成了一種開(kāi)發(fā)的生態(tài)圈,Spring提供了若干個(gè)項(xiàng)目,每個(gè)項(xiàng)目用于完成特定的功能。
2.2 Spring發(fā)展史
注意:現(xiàn)在已經(jīng)有spring6了哦!
3 Spring體系結(jié)構(gòu)
3.1 Spring Framework系統(tǒng)架構(gòu)圖
Spring Framework是Spring生態(tài)圈中最基礎(chǔ)的項(xiàng)目,是其他項(xiàng)目的根基
4 Spring核心概念
問(wèn)題導(dǎo)入
4.1 核心概念
IOC(Inversion of Control)控制反轉(zhuǎn)
使用對(duì)象時(shí),由主動(dòng)new產(chǎn)生對(duì)象轉(zhuǎn)換為由外部
提供對(duì)象,此過(guò)程中對(duì)象創(chuàng)建控制權(quán)由程序轉(zhuǎn)移到外部,此思想稱(chēng)為控制反轉(zhuǎn)。通俗的講就是“將new對(duì)象的權(quán)利交給Spring,我們從Spring中獲取對(duì)象使用即可
”
Spring技術(shù)對(duì)IoC思想進(jìn)行了實(shí)現(xiàn)
Spring提供了一個(gè)容器,稱(chēng)為IOC容器
,用來(lái)充當(dāng)IoC思想中的“外部”IOC容器負(fù)責(zé)對(duì)象的創(chuàng)建、初始化等一系列工作,被創(chuàng)建或被管理的對(duì)象在IoC容器中統(tǒng)稱(chēng)為Bean
DI(Dependency Injection)依賴(lài)注入
在容器中建立bean與bean之間的依賴(lài)關(guān)系的整個(gè)過(guò)程,稱(chēng)為依賴(lài)注入。
目標(biāo):充分解耦
- 使用IoC容器管理bean(IOC)
- 在IoC容器內(nèi)將有依賴(lài)關(guān)系的bean進(jìn)行關(guān)系綁定(DI)
最終效果
- 使用對(duì)象時(shí)不僅可以直接從IoC容器中獲取,并且獲取到的bean已經(jīng)綁定了所有的依賴(lài)關(guān)系
二、IOC和DI入門(mén)
1 IOC入門(mén)
問(wèn)題導(dǎo)入
<bean>標(biāo)簽中id屬性和class屬性的作用是什么?
1.1 門(mén)案例思路分析
管理什么?(Service與Dao)
如何將被管理的對(duì)象告知IOC容器?(配置文件)
被管理的對(duì)象交給IOC容器,如何獲取到IoC容器?(接口)
IOC容器得到后,如何從容器中獲取bean?(接口方法)
使用Spring導(dǎo)入哪些坐標(biāo)?(pom.xml)
1.2 實(shí)現(xiàn)步驟
【第一步】導(dǎo)入Spring坐標(biāo) 【第二步】定義Spring管理的類(lèi)(接口) 【第三步】創(chuàng)建Spring配置文件,配置對(duì)應(yīng)類(lèi)作為Spring管理的bean對(duì)象 【第四步】初始化IOC容器(Spring核心容器/Spring容器),通過(guò)容器獲取bean對(duì)象
1.3 實(shí)現(xiàn)代碼
【第一步】導(dǎo)入Spring坐標(biāo)
<dependencies> <!--導(dǎo)入spring的坐標(biāo)spring-context,對(duì)應(yīng)版本是5.2.10.RELEASE--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>
【第二步】定義Spring管理的類(lèi)(接口)
BookDao接口和BookDaoImpl實(shí)現(xiàn)類(lèi)
public interface BookDao { public void save(); } public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ..."); } }
BookService接口和BookServiceImpl實(shí)現(xiàn)類(lèi)
public interface BookService { public void save(); } public class BookServiceImpl implements BookService { private BookDao bookDao = new BookDaoImpl(); public void save() { System.out.println("book service save ..."); bookDao.save(); } }
【第三步】創(chuàng)建Spring配置文件,配置對(duì)應(yīng)類(lèi)作為Spring管理的bean對(duì)象
定義applicationContext.xml配置文件并配置BookServiceImpl
<?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標(biāo)簽:表示配置bean id屬性:表示給bean起名字 class屬性:表示給bean定義類(lèi)型 --> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean> </beans>
注意事項(xiàng):bean定義時(shí)id屬性在同一個(gè)上下文中(IOC容器中)不能重復(fù)
【第四步】初始化IOC容器(Spring核心容器/Spring容器),通過(guò)容器獲取Bean對(duì)象
public class App { public static void main(String[] args) { //1.創(chuàng)建IoC容器對(duì)象,加載spring核心配置文件 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //2 從IOC容器中獲取Bean對(duì)象(BookService對(duì)象) BookService bookService= (BookService)ctx.getBean("bookService"); //3 調(diào)用Bean對(duì)象(BookService對(duì)象)的方法 bookService.save(); } }
1.4 運(yùn)行結(jié)果
2 DI入門(mén)
<property>標(biāo)簽中name屬性和ref屬性的作用是什么?
2.1 DI入門(mén)思路分析
基于IOC管理bean
Service中使用new形式創(chuàng)建的Dao對(duì)象是否保留?(否)
Service中需要的Dao對(duì)象如何進(jìn)入到Service中?(提供方法)
Service與Dao間的關(guān)系如何描述?(配置)
2.2 實(shí)現(xiàn)步驟
【第一步】刪除使用new的形式創(chuàng)建對(duì)象的代碼
【第二步】提供依賴(lài)對(duì)象對(duì)應(yīng)的setter方法
【第三步】配置service與dao之間的關(guān)系
2.3 實(shí)現(xiàn)代碼
【第一步】刪除使用new的形式創(chuàng)建對(duì)象的代碼
public class BookServiceImpl implements BookService { private BookDao bookDao; //【第一步】刪除使用new的形式創(chuàng)建對(duì)象的代碼 public void save() { System.out.println("book service save ..."); bookDao.save(); } }
【第二步】提供依賴(lài)對(duì)象對(duì)應(yīng)的setter方法
public class BookServiceImpl implements BookService { private BookDao bookDao; public void save() { System.out.println("book service save ..."); bookDao.save(); } //【第二步】提供依賴(lài)對(duì)象對(duì)應(yīng)的setter方法 public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } }
【第三步】配置service與dao之間的關(guān)系
在applicationContext.xml中配置
<?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標(biāo)簽:表示配置bean id屬性:表示給bean起名字 class屬性:表示給bean定義類(lèi)型 --> <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"> <!--配置server與dao的關(guān)系 property標(biāo)簽:表示配置當(dāng)前bean的屬性 name屬性:表示配置哪一個(gè)具體的屬性 ref屬性:表示參照哪一個(gè)bean --> <property name="bookDao" ref="bookDao"/> </bean> </beans>
2.4 圖解演示
到此這篇關(guān)于淺談一下Spring的核心基礎(chǔ)IOC與DI的文章就介紹到這了,更多相關(guān)Spring的核心基礎(chǔ)IOC與DI內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何解決 Java 中的 IndexOutOfBoundsException 異
當(dāng)我們?cè)?nbsp;Java 中使用 List 的時(shí)候,有時(shí)候會(huì)出現(xiàn)向 List 中不存在的位置設(shè)置新元素的情況,從而導(dǎo)致 IndexOutOfBoundsException 異常,本文將會(huì)介紹這個(gè)問(wèn)題的產(chǎn)生原因以及解決方案2023-10-10Spring?MVC策略模式之MethodArgumentResolver源碼解析
這篇文章主要為大家介紹了Spring?MVC策略模式之MethodArgumentResolver源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03學(xué)習(xí)不同 Java.net 語(yǔ)言中類(lèi)似的函數(shù)結(jié)構(gòu)
這篇文章主要介紹了學(xué)習(xí)不同 Java.net 語(yǔ)言中類(lèi)似的函數(shù)結(jié)構(gòu),函數(shù)式編程語(yǔ)言包含多個(gè)系列的常見(jiàn)函數(shù)。但開(kāi)發(fā)人員有時(shí)很難在語(yǔ)言之間進(jìn)行切換,因?yàn)槭煜さ暮瘮?shù)具有不熟悉的名稱(chēng)。函數(shù)式語(yǔ)言傾向于基于函數(shù)范例來(lái)命名這些常見(jiàn)函數(shù)。,需要的朋友可以參考下2019-06-06javaweb啟動(dòng)時(shí)啟動(dòng)socket服務(wù)端代碼實(shí)現(xiàn)
這篇文章主要介紹了javaweb啟動(dòng)時(shí)啟動(dòng)socket服務(wù)端代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11基于JAVA每月運(yùn)勢(shì)api調(diào)用代碼實(shí)例
這篇文章主要為大家詳細(xì)介紹了JAVA每月運(yùn)勢(shì)api調(diào)用代碼實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Java ThreadLocal的設(shè)計(jì)理念與作用
這篇文章主要介紹了Java ThreadLocal的設(shè)計(jì)理念與作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03