一、概念
-
維基百科:
Spring框架是 Java平臺(tái)的一個(gè)開源的全棧應(yīng)用程序框架和==控制反轉(zhuǎn)容器==實(shí)現(xiàn),一般被直接稱為 Spring血公。該框架的一些核心功能理論上可用于任何 Java 應(yīng)用谤绳,但 Spring 還為基于Java企業(yè)版平臺(tái)構(gòu)建的 Web 應(yīng)用提供了大量的拓展支持膝舅。Spring 沒有直接實(shí)現(xiàn)任何的編程模型驰坊,但它已經(jīng)在 Java 社區(qū)中廣為流行匾二,基本上完全代替了企業(yè)級(jí)JavaBeans(EJB)模型哮独。
官網(wǎng):Spring Framework
特點(diǎn):==控制反轉(zhuǎn)(IOC)==拳芙,==面向切面編程(AOP)==
- image-20211018202332014
組成 Spring 框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)皮璧。每個(gè)模塊的功能如下:
- 核心容器:核心容器提供 Spring 框架的基本功能舟扎。核心容器的主要組件是 BeanFactory,它是工廠模式的實(shí)現(xiàn)悴务。BeanFactory 使用控制反轉(zhuǎn)(IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開睹限。
- Spring 上下文:Spring 上下文是一個(gè)配置文件譬猫,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù)羡疗,例如 JNDI染服、EJB、電子郵件叨恨、國(guó)際化柳刮、校驗(yàn)和調(diào)度功能。
- Spring AOP:通過(guò)配置管理特性痒钝,Spring AOP 模塊直接將面向切面的編程功能 , 集成到了 Spring 框架中秉颗。所以,可以很容易地使 Spring 框架管理任何支持 AOP的對(duì)象送矩。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)蚕甥。通過(guò)使用 Spring AOP,不用依賴組件栋荸,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中菇怀。
- Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來(lái)管理異常處理和不同數(shù)據(jù)庫(kù)供應(yīng)商拋出的錯(cuò)誤消息晌块。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理敏释,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)摸袁。
- Spring ORM:Spring 框架插入了若干個(gè) ORM 框架钥顽,從而提供了 ORM 的對(duì)象關(guān)系工具,其中包括 JDO靠汁、Hibernate 和 iBatis SQL Map蜂大。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)。
- Spring Web 模塊:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上蝶怔,為基于 Web 的應(yīng)用程序提供了上下文奶浦。所以,Spring 框架支持與 Jakarta Struts 的集成踢星。Web 模塊還簡(jiǎn)化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/li>
- Spring MVC 框架:MVC 框架是一個(gè)全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實(shí)現(xiàn)澳叉。通過(guò)策略接口,MVC 框架變成為高度可配置的沐悦,MVC 容納了大量視圖技術(shù)成洗,其中包括 JSP、Velocity藏否、Tiles瓶殃、iText 和 POI。
拓展
Spring Boot與Spring Cloud
- Spring Boot 是 Spring 的一套快速配置腳手架副签,可以基于Spring Boot 快速開發(fā)單個(gè)微服務(wù);
- Spring Cloud是基于Spring Boot實(shí)現(xiàn)的遥椿;
- Spring Boot專注于快速基矮、方便集成的單個(gè)微服務(wù)個(gè)體,Spring Cloud關(guān)注全局的服務(wù)治理框架冠场;
- Spring Boot使用了約束優(yōu)于配置的理念家浇,很多集成方案已經(jīng)幫你選擇好了,能不配置就不配置 , Spring Cloud很大的一部分是基于Spring Boot來(lái)實(shí)現(xiàn)碴裙,Spring Boot可以離開Spring Cloud獨(dú)立使用開發(fā)項(xiàng)目蓝谨,但是Spring Cloud離不開Spring Boot,屬于依賴的關(guān)系青团。
- SpringBoot在SpringClound中起到了承上啟下的作用譬巫,如果你要學(xué)習(xí)SpringCloud必須要學(xué)習(xí)SpringBoot。
二督笆、配置
1芦昔、依賴
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.10</version>
</dependency>
2、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
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
三娃肿、IOC理論
1咕缎、官方文檔
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans
IOC也稱為依賴注入(DI)。它是一個(gè)過(guò)程料扰,它對(duì)象僅通過(guò)構(gòu)造函數(shù)參數(shù)定義它們的依賴關(guān)系(即凭豪,他們使用的另一個(gè)對(duì)象),從構(gòu)造函數(shù)參數(shù)晒杈,工廠方法中的參數(shù)嫂伞,或在從工廠方法中構(gòu)造或返回對(duì)象實(shí)例上設(shè)置的屬性。然后拯钻,容器在創(chuàng)建bean時(shí)注入這些依賴性帖努。該過(guò)程基本上是Bean本身通過(guò)使用類別的直接構(gòu)造或諸如服務(wù)定位器模式的機(jī)制來(lái)控制其依賴關(guān)系的實(shí)例化或位置的反向(因此控制的名稱,控制)粪般。
2拼余、IOC本質(zhì)
控制反轉(zhuǎn)IoC(Inversion of Control),是一種設(shè)計(jì)思想亩歹,DI(依賴注入)是實(shí)現(xiàn)IoC的一種方法匙监,也有人認(rèn)為DI只是IoC的另一種說(shuō)法。沒有IoC的程序中 , 我們使用面向?qū)ο缶幊?, 對(duì)象的創(chuàng)建與對(duì)象間的依賴關(guān)系完全硬編碼在程序中小作,對(duì)象的創(chuàng)建由程序自己控制亭姥,控制反轉(zhuǎn)后將對(duì)象的創(chuàng)建轉(zhuǎn)移給第三方,個(gè)人認(rèn)為所謂控制反轉(zhuǎn)就是:獲得依賴對(duì)象的方式反轉(zhuǎn)了躲惰。
IoC是Spring框架的核心內(nèi)容致份,使用多種方式完美的實(shí)現(xiàn)了IoC,可以使用XML配置础拨,也可以使用注解氮块,新版本的Spring也可以零配置實(shí)現(xiàn)IoC。
Spring容器在初始化時(shí)先讀取配置文件诡宗,根據(jù)配置文件或元數(shù)據(jù)創(chuàng)建與組織對(duì)象存入容器中滔蝉,程序使用時(shí)再?gòu)腎oc容器中取出需要的對(duì)象
四、helloSpring
1塔沃、代碼示例
-
Hello.java
public class Hello { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void show(){ System.out.println("Hello,"+ name ); } }
-
beans.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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 使用spring來(lái)創(chuàng)建對(duì)象蝠引,在spring中這些都稱為bean--> <bean id="hello" class="com.nie.pojo.Hello"> <property name="str" value="Spring"/> </bean> </beans>
-
MyTest.java
import com.nie.pojo.Hello; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { public static void main(String[] args) { //獲取spring的上下文對(duì)象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //對(duì)象現(xiàn)在都在spring中管理了,要使用直接去里面取出 Hello hello = (Hello) context.getBean("hello"); System.out.println(hello.toString()); } }
2蛀柴、總結(jié)
- hello 對(duì)象是由Spring創(chuàng)建的
- hello 對(duì)象的屬性是由Spring容器設(shè)置的
- 控制 : 誰(shuí)來(lái)控制對(duì)象的創(chuàng)建 , 傳統(tǒng)應(yīng)用程序的對(duì)象是由程序本身控制創(chuàng)建的 , 使用Spring后 , 對(duì)象是由Spring來(lái)創(chuàng)建的
- 反轉(zhuǎn) : 程序本身不創(chuàng)建對(duì)象 , 而變成被動(dòng)的接收對(duì)象
- 依賴注入 : 就是利用set方法來(lái)進(jìn)行注入的
- IOC是一種編程思想螃概,由主動(dòng)的編程變成被動(dòng)的接收
- ==所謂的IoC : 對(duì)象由Spring 來(lái)創(chuàng)建 , 管理 , 裝配 !==