第二章 IoC容器概述

IoC容器

Spring模塊架構(gòu)圖-IoC容器 IoC容器處于Spring模塊架構(gòu)比較核心的地位惑芭,它向上層的AOP赊堪、數(shù)據(jù)訪問(wèn)嚣潜、Web等框架提供基本的支持巷懈。

輸入圖片說(shuō)明

IoC容器主要要完成的功能草描,主要?jiǎng)?chuàng)建對(duì)象依賴(lài)览绿,組裝成我們需要的業(yè)務(wù)對(duì)象。

輸入圖片說(shuō)明

從容器角度觀察IoC容器


輸入圖片說(shuō)明

配置 空配置的Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

</beans>

注解配置Controller

package com.netease.course.web.controller;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "/hello")
public class HelloController {

    @RequestMapping(value = "/spring")
    public void spring(HttpServletResponse response) throws IOException {
        System.out.println("Class HelloController Method spring");
        response.getWriter().write("Hello, Spring Web!!");
    }
}

IoC容器 = 陶珠? ApplicationContext就是一個(gè)IoC容器挟裂。ApplicationContext屬于org.springframework.context,屬于spring-context模塊揍诽。如果只適用IoC容器的相關(guān)功能則只需要在Maven中添加spring-context模塊诀蓉。

初始化IoC 我們只是在web.xml中,的context-param添加contextConfigLocation對(duì)象和對(duì)應(yīng)xml路徑暑脆,在Listener當(dāng)中引用org.springframework.web.context.ContextLoaderListener渠啤,這種方式是初始化Spring的一種方式。 web.xml

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value> 
        classpath:application-context.xml </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

ClassPathXmlApplicationContext

ApplicationContext context= new ClassPathXmlApplicationContext("application-context.xml");

FileSystemXmlXmlApplicationContext

ApplicationContext context= new FileSystemXmlApplicationContext("/home/zhanpeng/Workspace/J2ee/spring-web/src/resources/application-context.xml");

輸入圖片說(shuō)明

Bean定義 如果定義Bean添吗,在Spring配置中沥曹,通過(guò)簡(jiǎn)單的配置文件就可以配置Bean對(duì)象。例如如下代碼

public class ScrewDriver{

    public void use(){
        System.out.println("Use screwDriver");
}

在Spring的配置文件中添加如下內(nèi)容碟联,這里id代表這個(gè)類(lèi)Bean對(duì)象的唯一標(biāo)識(shí)符妓美,class代表這個(gè)類(lèi)的路徑,也就是說(shuō)任何Java類(lèi)都可以生成Bean對(duì)象鲤孵,交給Spring自動(dòng)的進(jìn)行管理壶栋。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="screwDriver" class="com.netease.course.ScrewDriver" >
    </bean>
</beans>

Bean使用

  • 首先需要初始化容器
  • 通過(guò)getBean方法,獲取對(duì)象
  • 使用Bean對(duì)象的方法
//初始化容器
ApplicationContext context = new ClassPathXmlApplicationContext("application-context");

//獲取對(duì)象
ScrewDriver screwDriver = context.getBean("screwDriver",ScrewDriver.class);

//使用Bean對(duì)象
screwDriver.use();
//

Bean作用域

什么是Bean作用域普监? 強(qiáng)調(diào)Bean的有效范圍贵试,我們也需要考慮Bean是什么時(shí)候創(chuàng)建、什么時(shí)候銷(xiāo)毀的凯正。

Spring Bean作用域

  • singleton
  • prototype

以下作用域依賴(lài)Web應(yīng)用

  • request
  • session
  • global sesson
  • application

singleton 默認(rèn)的作用域就是singleton毙玻,類(lèi)似單例模式,對(duì)象只有單例

<bean id="screwDriver" class="com.netease.course.ScrewDriver"></bean>

明確定義singleton

<bean id="screwDriver" class="com.netease.course.ScrewDriver" scope="singleton"></bean>

這種方式保證對(duì)象在整個(gè)容器中是只有一個(gè)單例的廊散,保證在整個(gè)生命周期中只會(huì)創(chuàng)建出一個(gè)實(shí)例
通過(guò)代碼方式檢查單例模式

        ScrewDriver screwDriver = context.getBean("screwDriver", ScrewDriver.class);
        System.out.println(screwDriver);
        ScrewDriver screwDriver2 = context.getBean("screwDriver", ScrewDriver.class);
        System.out.println(screwDriver2);

執(zhí)行結(jié)果

com.netease.course.ScrewDriver@12405818
com.netease.course.ScrewDriver@12405818

prototype 每次引用都需要?jiǎng)?chuàng)建對(duì)象桑滩,就使用prototype,比如兩次飲用時(shí)需要保存一些狀態(tài)允睹,但是在下次引用時(shí)并不需要該狀態(tài)帶入到實(shí)例中施符。

<bean id="screwDriver" class="com.netease.course.ScrewDriver" scope="prototype"></bean>

每次引用創(chuàng)建一個(gè)實(shí)例
通過(guò)代碼方式檢查多次引用

        ScrewDriver screwDriver = context.getBean("screwDriver", ScrewDriver.class);
        System.out.println(screwDriver);
        ScrewDriver screwDriver2 = context.getBean("screwDriver", ScrewDriver.class);
        System.out.println(screwDriver2);

執(zhí)行結(jié)果

com.netease.course.ScrewDriver@12405818
com.netease.course.ScrewDriver@314c508a

每次引用創(chuàng)建一個(gè)實(shí)例

Web場(chǎng)景下的Bean作用域

request request scope,作為訪問(wèn)者訪問(wèn)Web服務(wù)就是為一個(gè)request scope擂找,在請(qǐng)求處理過(guò)程中戳吝,需要?jiǎng)?chuàng)建bean,但是在另外一個(gè)訪問(wèn)Web服務(wù)的請(qǐng)求時(shí)贯涎,創(chuàng)建另外的Bean听哭。

session session scope包含多個(gè)request scope,表示某個(gè)用戶(hù)在訪問(wèn)過(guò)程中,會(huì)共享一些Bean對(duì)象陆盘,例如sessionBean普筹,比如保存用戶(hù)的會(huì)話信息或者狀態(tài)信息。在用戶(hù)沒(méi)有退出的時(shí)候隘马,這些Bean都是有效的太防。多個(gè)Session的話會(huì)使用不同的sessionBean。

application 在整個(gè)應(yīng)用狀態(tài)下會(huì)共享某個(gè)單獨(dú)的Bean酸员,比如一些ServiceBean蜒车。

輸入圖片說(shuō)明

Bean生命周期回調(diào) 有了Bean的作用域,就可以控制Bean的創(chuàng)建和銷(xiāo)毀幔嗦,但并不知道我們?cè)趧?chuàng)建時(shí)可以做那些事情酿愧,也不知道銷(xiāo)毀時(shí)可以做那些事情。一般我們?cè)诰帉?xiě)一些和資源打交道的服務(wù)和功能的時(shí)候邀泉,很有可能在創(chuàng)建或者銷(xiāo)毀的時(shí)候做些額外的事情嬉挡,比如當(dāng)創(chuàng)建時(shí)申請(qǐng)資源:申請(qǐng)線程池或者申請(qǐng)文件系統(tǒng)資源,當(dāng)銷(xiāo)毀時(shí)汇恤,我們對(duì)資源進(jìn)行釋放庞钢。

  • 創(chuàng)建
    • 申請(qǐng)資源
  • 銷(xiāo)毀
    • 釋放資源

Spring生命周期回調(diào)

  • 創(chuàng)建
public interface InitializingBean{
    void afterPropertiesSet() throws Exception;
}

在初始化結(jié)束后(在Spring對(duì)該對(duì)象設(shè)置完成屬性后)添加一些執(zhí)行內(nèi)容。
我們可以通過(guò)簡(jiǎn)單的xml方式配置

<bean id="screwDriver" class="com.netease.course.ScrewDriver" init-method="init"></bean>

xml方式所對(duì)應(yīng)的初始化代碼如下:

package com.netease.course;
import javax.annotation.Resource;

public class ScrewDriver {
    public void init()
    {
        System.out.println("Init screwDriver");
    }
}

  • 銷(xiāo)毀
public interface DisposableBean{

    void destroy() throws Exception;
}
```我們可以通過(guò)簡(jiǎn)單的xml方式配置

<bean id="screwDriver" class="com.netease.course.ScrewDriver" destroy-method="cleanup"></bean>

xml方式所對(duì)應(yīng)的初始化代碼如下:

package com.netease.course; import javax.annotation.Resource;

public class ScrewDriver { public void cleanup() { System.out.println("Destroy screwDriver"); } }


##通過(guò)代碼查看回調(diào)情況

package com.netease.course;

import javax.annotation.Resource;

public class ScrewDriver {

private String color = "red";

public void use() {

// System.out.println("Use " + color + " screwdriver"); }

public void setColor(String color)
{
    this.color = color;
}

public void init()
{
    System.out.println("Init " + this);
}

public void cleanup()
{
    System.out.println("Destroy " + this);
}

}

執(zhí)行結(jié)果因谎,并沒(méi)有看到銷(xiāo)毀Bean對(duì)象

Init com.netease.course.ScrewDriver@25359ed8 use red screwdriver

這是由于我們并沒(méi)有有效的關(guān)閉容器基括,導(dǎo)致容器沒(méi)有辦法調(diào)用到destory-method,這里需要手動(dòng)添加手動(dòng)關(guān)閉容器蓝角。ApplicationContext本身并不支持關(guān)閉,我們需要把它強(qiáng)制轉(zhuǎn)化到支持close的方式并close饭冬。    
**注意**:筆者這里也沒(méi)有調(diào)用到銷(xiāo)毀使鹅。

轉(zhuǎn)自:https://my.oschina.net/hava/blog/757200

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昌抠,隨后出現(xiàn)的幾起案子患朱,更是在濱河造成了極大的恐慌,老刑警劉巖炊苫,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裁厅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瘪撇,警方通過(guò)查閱死者的電腦和手機(jī)叼屠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)丝格,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人袋励,你說(shuō)我怎么就攤上這事。” “怎么了茬故?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵盖灸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我磺芭,道長(zhǎng)赁炎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任钾腺,我火速辦了婚禮徙垫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垮庐。我一直安慰自己松邪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布哨查。 她就那樣靜靜地躺著逗抑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寒亥。 梳的紋絲不亂的頭發(fā)上邮府,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音溉奕,去河邊找鬼褂傀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛加勤,可吹牛的內(nèi)容都是我干的仙辟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鳄梅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叠国!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起戴尸,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粟焊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后孙蒙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體项棠,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年挎峦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了香追。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坦胶,死狀恐怖翅阵,靈堂內(nèi)的尸體忽然破棺而出歪玲,到底是詐尸還是另有隱情,我是刑警寧澤掷匠,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布滥崩,位于F島的核電站,受9級(jí)特大地震影響讹语,放射性物質(zhì)發(fā)生泄漏钙皮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一顽决、第九天 我趴在偏房一處隱蔽的房頂上張望短条。 院中可真熱鬧,春花似錦才菠、人聲如沸茸时。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)可都。三九已至,卻和暖如春蚓耽,著一層夾襖步出監(jiān)牢的瞬間渠牲,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工步悠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留签杈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓鼎兽,卻偏偏與公主長(zhǎng)得像答姥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谚咬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理鹦付,服務(wù)發(fā)現(xiàn),斷路器序宦,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 文章作者:Tyan博客:noahsnail.com 3.5 Bean scopes When you create...
    SnailTyan閱讀 1,889評(píng)論 0 1
  • 來(lái)源:關(guān)于Spring IOC (DI-依賴(lài)注入)你需要知道的一切作者:zejian Dao層(AccountDa...
    楊井閱讀 5,333評(píng)論 0 27
  • Differential Evolution - A simple and efficient adaptive ...
    zhaohaoying閱讀 370評(píng)論 0 0
  • 仇小姐開(kāi)了一家情書(shū)店睁壁,嗯背苦,代寫(xiě)情書(shū)店互捌。
    Pooba閱讀 172評(píng)論 0 0