Java三十八篇:回顧Spring
大家好!我是小劉,Java程序員對spring家族在熟悉不過了,吃飯的家伙呀!
可以說是spring把Java推上了又一波Java高峰。
一、Spring介紹
在日常開發(fā)過程中經(jīng)常會提到三大框架(SSM)指的是Spring、SpringMVC、Mybatis。其中一個非常重要的框架就是Spring。Spring目前隸屬于皮沃托公司,Spring在剛剛出來的時候只有Spring Framework一款產(chǎn)品。我們習慣性的簡稱它為Spring,但是發(fā)展到現(xiàn)在Spring旗下已經(jīng)有非常非常多的框架了,例如:SpringBoot、SpringCloud、SpringData、SpringSecurity等等。但是我們還是習慣性成將Spring Framework成為Spring。

二、Spring到底是什么框架
Spring它并不想Mybatis專門去解決某一個層面的問題,它在項目成扮演的是一個管理者的角色,負責對我們的項目中的對象進行管理,包括創(chuàng)建、注入、代理等等。實現(xiàn)了一個解耦的目的。Spring在管理對象時會將對象存儲起來,所以Spring我們也可以將它看成一個容器。
Spring的能力

https://spring.io/projects/spring-boot ?官網(wǎng)
Spring的生態(tài)
覆蓋了:
web開發(fā)
數(shù)據(jù)訪問
安全控制
分布式
消息服務
移動開發(fā)
批處理
三、Spring的兩大核心能力
IOC (控制反轉(zhuǎn))
IoC
?inversion of control 控制反轉(zhuǎn),對于依賴的管理由調(diào)用方轉(zhuǎn)移到Spring的容器中。
DI
??dependency injection 依賴注入,強調(diào)屬性的注入。
IoC與DI是同一件事情的兩種描述方式
UserController ? -> ?UserService
Before userService是由UserController創(chuàng)建并管理
After ?userService是由Spring容器創(chuàng)建并管理
IOC
使用Spring首先要引入依賴,Spirng框架下有很多依賴。在使用maven下載依賴時,只需要通過頂端依賴spring-context開始就可以下載到其他所有的依賴。
準備工作:
新建maven普通java項目
在pom.xml中通過spring-context的坐標下載spring的相關依賴:
Spring容器類型:
容器的頂端是ApplicationContext,在它下面有三個常用的實現(xiàn)類。
ClassPathXmlApplicationContext:通過配置在classpath下的一個xml文件來完成容器初始化。
AnnotationConfigApplicationContext:通過掃描注解初始化容器
WebApplicationContext:在WEB環(huán)境下使用的Spring容器
FileSystemApplication:通過外部XML文件完成容器的初始化
配置版的IOC:
初始化容器的API:
配置版的IOC是用過一個XML文件描述bean信息。
1.在項目的resources目錄下新建一個xml文件,名為applicationContext.xml,該文件就是spring的核心配置文件,Spring會解析該文件獲得必要信息,然后進行IOC的工作。
2.在applicationContext.xml中添加beans根標簽,并且在benas標簽中添加一個xml的schema約束(類似于DTD)。
3.通過配置創(chuàng)建對象
通過無參構造創(chuàng)建對象(Spring默認的方式,也是最常用的方式)如下:
選擇構造方法創(chuàng)建對象
當我們的類具備多種構造函數(shù)時,我們可以通過spring選擇某一個構造函數(shù)來完成對象的創(chuàng)建,具體的方式就是通過bean標簽下的constructor-arg標簽來完成配置。例如:
按照上述方式配置,最終spring會選擇雙參構造方法來完成對象的創(chuàng)建。
通過工廠模式創(chuàng)建對象
首先通過一個bean標簽創(chuàng)建一個工廠對象(工廠類自己編寫)
通過bean標簽調(diào)用工廠對象的工廠方法來創(chuàng)建目標對象
通過靜態(tài)工廠模式創(chuàng)建對象
通過bean標簽class的值為工廠的類路徑,再通過靜態(tài)工廠方法的方法名來完成對象的創(chuàng)建
4.設置對象的單例或非單例
通過spring創(chuàng)建對象時,可以選擇使用單例或者是非單例模式。spring默認情況是創(chuàng)建對象采用的是單例模式。
要配置單例或者多例需要使用bean標簽中的scope屬性。
scope屬性可選值:
singleton(默認):單例
prototype:多例
request:web環(huán)境中生效,在一次請求中無論你getBean多少次,獲取的對象都是同一個
session:web環(huán)境中生效,在一次會話中無論你geyBean多少次,獲取的對象都是同一個

5.通過配置完成依賴注入
注入基本數(shù)據(jù)類型
在需要注入屬性的對象的bean標簽下,通過property子標簽完成依賴注入,name表示需要注入值的屬性的名稱,value需要注入的值。
相對應的需要類中為屬性提供set方法,因為配置方式進行依賴注入是同set方法完成賦值的。

注入對象
在需要注入屬性的對象的bean標簽下,通過property子標簽完成依賴注入,name表示需要注入值的屬性的名稱,ref表示要注入的對象在spring容器中的ID。
同樣的在被注入的類中需要定義相應的屬性并提供set方法

注入集合
注入鍵值對
注入Properties
注解版的IOC:
注解版的IOC所使用的容器為:AnnotationConifgApplicationContext
使用注解創(chuàng)建對象:
使用注解創(chuàng)建對象可選的注解共4個:@Component、@Controller、@Service、@Repository
@Component:通用注解,可以添加在任意類的上面用于創(chuàng)建該類的對象。
@Controller:專用于創(chuàng)建控制層的對象
@Service:專用于創(chuàng)建業(yè)務層的對象
@Repository:專用于創(chuàng)建數(shù)據(jù)層的對象
使用注解完成對象創(chuàng)建的基本步驟
使用注解完成依賴注入共兩個注解@Resource和@Autowired
@Resource:(java 提供的注解)在注入對象時優(yōu)先從容器中注入一個和屬性名稱相同的對象。如果和這個屬性名稱相同的對象和屬性類型不匹配將會報錯。如果在容器中沒有找到和這個屬性名稱相同的對象,再通過類型進行注入。ByName->ByType
@Autowired:(spring提供的注解)注入對象時優(yōu)先通過類型去查找,如果同一個類型的對象在容器中有多個,它會在通過屬性名稱完成查找,如果在這個多個對象中有和它的屬性名稱相同的對象,就將該對象注入過去。如果這些對象和屬性名稱都不匹配,就拋出異常。