Spring(一)

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ì)

  1. 方便解耦陵且、簡(jiǎn)化開(kāi)發(fā)
  2. AOP編程支持
  3. 聲明式事務(wù)支持
  4. 方便程序的測(cè)試
  5. 方便集成各種優(yōu)秀的框架
  6. 降低JavaEE API的使用難度
  7. 開(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容器工作原理

  1. 當(dāng)Spring的IOC容器加載時(shí)浮定,會(huì)讀取配置文件中的諸多bean
  2. 根據(jù)bean的class的值尋找對(duì)應(yīng)的Class字節(jié)碼文件
  3. 通過(guò)反射技術(shù),創(chuàng)建出一個(gè)個(gè)對(duì)象
  4. 創(chuàng)建的對(duì)象會(huì)被存放到內(nèi)部的一個(gè)Map結(jié)構(gòu)中丈探,等待被使用
  5. 當(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妻导,一起剝皮案震驚了整個(gè)濱河市逛绵,隨后出現(xiàn)的幾起案子怀各,更是在濱河造成了極大的恐慌,老刑警劉巖术浪,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓢对,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡胰苏,警方通過(guò)查閱死者的電腦和手機(jī)硕蛹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)硕并,“玉大人妓美,你說(shuō)我怎么就攤上這事±鸱酰” “怎么了壶栋?”我有些...
    開(kāi)封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)普监。 經(jīng)常有香客問(wèn)我贵试,道長(zhǎng),這世上最難降的妖魔是什么凯正? 我笑而不...
    開(kāi)封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任毙玻,我火速辦了婚禮,結(jié)果婚禮上廊散,老公的妹妹穿的比我還像新娘桑滩。我一直安慰自己,他們只是感情好允睹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布运准。 她就那樣靜靜地躺著,像睡著了一般缭受。 火紅的嫁衣襯著肌膚如雪胁澳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天米者,我揣著相機(jī)與錄音韭畸,去河邊找鬼。 笑死蔓搞,一個(gè)胖子當(dāng)著我的面吹牛胰丁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喂分,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锦庸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了妻顶?” 一聲冷哼從身側(cè)響起酸员,我...
    開(kāi)封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讳嘱,沒(méi)想到半個(gè)月后幔嗦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沥潭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年邀泉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钝鸽。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汇恤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拔恰,到底是詐尸還是另有隱情因谎,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布颜懊,位于F島的核電站财岔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏河爹。R本人自食惡果不足惜匠璧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咸这。 院中可真熱鬧夷恍,春花似錦、人聲如沸媳维。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侄刽。三九已至执虹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唠梨,已是汗流浹背袋励。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留当叭,地道東北人茬故。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蚁鳖,于是被迫代替她去往敵國(guó)和親磺芭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容