Spring
Spring概述
- Spring是與2003年興起的一個(gè)full-stack輕量級(jí)的Java開(kāi)源框架庄蹋。
- Spring以IOC(控制反轉(zhuǎn))和AOP(面向切面編程)為核心
- Spring提供了展現(xiàn)層SpringMVC疙赠、持久層SpringJDBC滥壕、業(yè)務(wù)層事務(wù)管理等眾多企業(yè)級(jí)應(yīng)用技術(shù)
- Spring還能整合開(kāi)源世界眾多的第三方框架和類庫(kù)
Spring優(yōu)勢(shì)
- 方便解耦陵且、簡(jiǎn)化開(kāi)發(fā)
- AOP編程支持
- 聲明式事務(wù)支持
- 方便程序的測(cè)試
- 方便集成各種優(yōu)秀的框架
- 降低JavaEE API的使用難度
- 開(kāi)源源代碼
Spring的體系結(jié)構(gòu)
Spring的體系結(jié)構(gòu)
IOC
IOC(控制反轉(zhuǎn))是一種設(shè)計(jì)思想
- 控制:指的是控制權(quán),在Java中可以簡(jiǎn)單理解為對(duì)象的控制權(quán)限(比如對(duì)象的創(chuàng)建订讼、銷毀等權(quán)限)
- 反轉(zhuǎn):指的是將對(duì)象的控制權(quán)由原來(lái)的程序員在類中主動(dòng)控制反轉(zhuǎn)到由Spring容器來(lái)控制
Spring入門
導(dǎo)入坐標(biāo)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
創(chuàng)建dao接口和實(shí)現(xiàn)類
public interface IUserDao {
void save();
}
public class UserDaoImplv2 implements IUserDao {
public void save() {
}
}
加入配置文件
- spring的配置文件 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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
</beans>
測(cè)試
<?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">
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
</beans>
Spring的IOC容器工作原理
- 當(dāng)Spring的IOC容器加載時(shí)浮定,會(huì)讀取配置文件中的諸多bean
- 根據(jù)bean的class的值尋找對(duì)應(yīng)的Class字節(jié)碼文件
- 通過(guò)反射技術(shù),創(chuàng)建出一個(gè)個(gè)對(duì)象
- 創(chuàng)建的對(duì)象會(huì)被存放到內(nèi)部的一個(gè)Map結(jié)構(gòu)中丈探,等待被使用
- 當(dāng)需要使用具體的對(duì)象時(shí)無(wú)須自己創(chuàng)建录择,直接從Spring的IOC容器中取
Spring的API介紹
- BeanFactory
- BeanFactory是Spring的心臟
- BeanFactory是IOC容器的核心接口,它定義了IOC的節(jié)本功能
- Spring使用它來(lái)配置文檔,管理bean的加載隘竭,實(shí)例化并維護(hù)bean之間的依賴關(guān)系塘秦,負(fù)責(zé)bean的生命周期
- ApplicationContext
- ApplicationContext由BeanFactory派生而來(lái),可以理解為Spring的軀體
- ApplicationContext由BeanFactory的基礎(chǔ)上添加了很多功能
- 支持了aop功能和web應(yīng)用
- MessageSource动看,國(guó)際化的消息訪問(wèn)
- 通過(guò)配置來(lái)實(shí)現(xiàn)BeanFactory中很多編碼才能實(shí)現(xiàn)的功能
- ApplicationContext的常用實(shí)現(xiàn)類
- ClassPathXmlApplicationContext:從classpath目錄讀取配置文件
- FileSystemXmlApplicaitonContext:從文件系統(tǒng)或者url中讀取配置文件
- AnnotationConfigApplicationContext:當(dāng)我們使用注解配置容器對(duì)象時(shí)尊剔,需要使用此類來(lái)創(chuàng)建Spring容器。它用來(lái)讀取注解
- 兩者的區(qū)別
- beanFactory主要是面向Spring框架的基礎(chǔ)設(shè)施菱皆,也就提供spring自身內(nèi)部調(diào)用须误。而ApplicationContext主要面向Spring的使用者
- BeanFactory在第一次使用到某個(gè)Bean時(shí)(調(diào)用getBean())才對(duì)該Bean進(jìn)行加載實(shí)例化,而ApplicationContext是在容器啟動(dòng)時(shí)仇轻,一次性創(chuàng)建并加載了所有的Bean
創(chuàng)建Bean對(duì)象的不同方式
默認(rèn)無(wú)參構(gòu)造函數(shù)
會(huì)根據(jù)默認(rèn)無(wú)參構(gòu)造函數(shù)來(lái)創(chuàng)建類對(duì)象京痢,如果bean中沒(méi)有默認(rèn)無(wú)參構(gòu)造函數(shù),將會(huì)創(chuàng)建失敗
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
工廠模式創(chuàng)建對(duì)象
在Spring中還可以通過(guò)工廠模式來(lái)創(chuàng)建對(duì)象
工廠模式又分兩種:
? 靜態(tài)工廠:先不生產(chǎn)工廠的實(shí)例篷店,直接調(diào)用工廠的靜態(tài)方法
? 實(shí)例工廠:先產(chǎn)生工廠的實(shí)例祭椰,再調(diào)用工廠實(shí)例的方法創(chuàng)建對(duì)象
- 工廠類
public class FactoryCreateBean{
//靜態(tài)
public static UserDao createUserDao(){
return new UserDaoImpl();
}
public UserDao createUserDaoSimple(){
return new UserDaoImpl();
}
}
<bean id="userDao1" class="com.itheima.factory.FactoryCreateBean" factory-method="createUserDao"/>
<!--使用實(shí)例工廠創(chuàng)建對(duì)象-->
<bean id="factoryCreateBean" class="com.itheima.factory.FactoryCreateBean"/>
<bean id="userDao2" factory-bean="factoryCreateBean" factory-method=“createUserDaoSimple”/>
Bean對(duì)象的作用域
所謂Bean的作用域其實(shí)就是指Spring給我們創(chuàng)建出的對(duì)象的存活范圍
可以在spring配置文件中通過(guò)bean標(biāo)簽中的scope屬性來(lái)對(duì)當(dāng)前bean對(duì)象的作用域進(jìn)行指定
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="prototype"/>
- scope屬性有五個(gè)取值:
- Singleton(默認(rèn)) 創(chuàng)建出的實(shí)例為單例模式,IOC只創(chuàng)建一次疲陕,然后一直存在
- Prototype 創(chuàng)建出的實(shí)例為多例模式方淤,每次獲取bean的時(shí)候,IOC都給我們重新創(chuàng)建新對(duì)象
- request(web) web項(xiàng)目中鸭轮,Spring創(chuàng)建一個(gè)Bean的對(duì)象臣淤,將對(duì)象存入到request中
- session(web) web項(xiàng)目中,Spring創(chuàng)建一個(gè)Bean的對(duì)象窃爷,將對(duì)象存入到session域中
- globalSession 創(chuàng)建的實(shí)例綁定全局session對(duì)象
依賴注入
依賴注入:Dependency Injection 是spring框架核心ioc的具體實(shí)現(xiàn)
通過(guò)構(gòu)造函數(shù)注入
public Book(String name,Float price,Date publishDate){
this.name = name;
this.price = pricae;
this.publishDate = publicshDate;
}
<bean id= "date" class="java.util.Data"/>
<bean id="book" class="com.itheima.spring.book">
<!--
index:指定參數(shù)在構(gòu)造函數(shù)參數(shù)列表的索引位置邑蒋,從0開(kāi)始
name:指定參數(shù)在構(gòu)造函數(shù)中的名稱
type:指定參數(shù)在構(gòu)造函數(shù)中的數(shù)據(jù)類型,可以通過(guò)反射拿到按厘,不需要關(guān)系
value:它能賦的值是基本數(shù)據(jù)類型和String類型
ref:它能賦的值是其他bean類型医吊,也就是說(shuō),必須得是在配置文件中配置過(guò)的bean
-->
<constructor-arg name="name" value="sd"/>
<constructor-arg name="price" value="1"/>
<constructor-arg name="publishDate" ref="date"/>
</bean>
通過(guò)setter屬性注入
<bean id="book" class="com.itheima.spring.book">
<!--
name:類中set方法后面的部分
ref:給屬性賦值是其他bean類型
value:給屬性賦值是基本數(shù)據(jù)類型和String類型的
-->
<property name="name" value="xdsa"/>
<property name="price" value="1"/>
<property name="publishDate" ref="date"/>
</bean>
注入集合屬性
注入集合也是用的set方法注入逮京,只不過(guò)變量的數(shù)據(jù)類型都是集合
<bean id="book" class="com.itheima.spring.Book">
<!--List-->
<property name="list">
<list>
<value>1</value>
<value>2</value>
</list>
</property>
<!--Set-->
<property name="set">
<set>
<value>3</value>
<value>4</value>
</set>
</property>
<!--數(shù)組-->
<property name="array">
<array>
<value>5</value>
<value>6</value>
</array>
</property>
<!--Map-->
<property name="map">
<map>
<entry key="7" value="7-1" />八卿堂、Bean對(duì)象的生命周期
所謂的Bean對(duì)象生命周期其實(shí)指的是Bean創(chuàng)建到銷毀的這么一段時(shí)間。
8.1 粗粒度生命周期驗(yàn)證
在Spring中可以通過(guò)配置的形式懒棉,指定bean在創(chuàng)建后和銷毀前要調(diào)用的方法草描。
經(jīng)測(cè)試得知:
spring中單例對(duì)象的生命周期為:
出生:IOC容器加載時(shí)出生
存活:IOC容器運(yùn)行時(shí)存活
死亡:IOC容器銷毀時(shí)死亡
spring中多例對(duì)象的生命周期為:
出生:使用對(duì)象時(shí)出生
存活:一直存活
死亡:由java垃圾回收器負(fù)責(zé)銷毀
8.2 細(xì)粒度生命周期驗(yàn)證
出生過(guò)程
1. 實(shí)例化bean對(duì)象【IOC】
2. 為對(duì)象屬性賦值【DI】
3. 處理實(shí)現(xiàn)的Aware接口
① 如果這個(gè)Bean已經(jīng)實(shí)現(xiàn)了BeanNameAware接口,會(huì)調(diào)用它實(shí)現(xiàn)的setBeanName(String beanId)方法策严,
此 處傳遞的就是Spring配置文件中Bean的id值穗慕。
<entry key="8" value="8-1" />
</map>
</property>
<!--Properties-->
<property name="properties">
<props>
<prop key="9">9-1</prop>
<prop key="10">10-1</prop>
</props>
</property>
</bean>
Bean對(duì)象的生命周期
粗粒度生命周期驗(yàn)證
在Spring中可以通過(guò)配置的形式,指定bean在創(chuàng)建后和銷毀前要調(diào)用的方法
<bean id="userDao" class="xxx" scope="prototype"
init-method="init" destroy-method="destroy"/>
- spring中單例對(duì)象的生命周期為:
- 出生:IOC容器加載時(shí)出生
- 存活:IOC容器運(yùn)行時(shí)存活
- 死亡:IOC容器銷毀時(shí)死亡
- spring中多例對(duì)象的生命周期為
- 出生:使用對(duì)象時(shí)出生
- 存活:一直存活
- 死亡:由java垃圾回收器負(fù)責(zé)銷毀
生命周期圖例
image.png