黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專(zhuān)注Java教育14年 全國(guó)咨詢(xún)/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 Spring作用域的快速指南

Spring作用域的快速指南

更新時(shí)間:2022-12-05 11:06:49 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1684次

1. 概述

在這個(gè)Spring教程中,我們將了解不同類(lèi)型的bean Spring框架的范圍。

bean的范圍定義bean的生命周期和能見(jiàn)度的情況下我們使用它。

最新版本的Spring框架定義了6種范圍:

單例

原型

請(qǐng)求

會(huì)話

應(yīng)用程序

websocket

最后四范圍所提到的,請(qǐng)求、會(huì)話,應(yīng)用程序和websocket,只有在理解網(wǎng)絡(luò)應(yīng)用程序可用。

2. 單例對(duì)象范圍

當(dāng)我們使用單例范圍定義bean,容器創(chuàng)建bean的一個(gè)實(shí)例;所有bean名稱(chēng)的請(qǐng)求將返回相同的對(duì)象,這是緩存。任何修改對(duì)象將反映在所有bean的引用。這個(gè)范圍是默認(rèn)值如果沒(méi)有指定其他范圍。

讓我們創(chuàng)建一個(gè)實(shí)體來(lái)例證了范圍的概念:

public class Person {
    private String name;
    // standard constructor, getters and setters
}

之后,我們定義的bean singleton范圍通過(guò)使用@ scope注釋:

@Bean
@Scope("singleton")
public Person personSingleton() {
    return new Person();
}

我們也可以使用一個(gè)常數(shù),而不是字符串值在以下方式:

@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)

現(xiàn)在我們可以繼續(xù)編寫(xiě)一個(gè)測(cè)試表明,兩個(gè)對(duì)象指的是相同的bean將有相同的價(jià)值觀,即使只有一個(gè)人改變他們的國(guó)家,他們都是引用同一個(gè)bean實(shí)例:

private static final String NAME = "John Smith";
@Test
public void givenSingletonScope_whenSetName_thenEqualNames() {
    ApplicationContext applicationContext = 
      new ClassPathXmlApplicationContext("scopes.xml");
    Person personSingletonA = (Person) applicationContext.getBean("personSingleton");
    Person personSingletonB = (Person) applicationContext.getBean("personSingleton");
    personSingletonA.setName(NAME);
    Assert.assertEquals(NAME, personSingletonB.getName());
    ((AbstractApplicationContext) applicationContext).close();
}

作用域。xml文件在這個(gè)例子中應(yīng)該包含的xml定義bean使用:

<?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 
    http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="personSingleton" class="org.baeldung.scopes.Person" scope="singleton"/>    
</beans>

3.原型范圍

原型的bean將返回一個(gè)不同的實(shí)例范圍每次請(qǐng)求的容器。它通過(guò)設(shè)置值定義原型在bean定義:@ scope注釋

@Bean
@Scope("prototype")
public Person personPrototype() {
    return new Person();
}

我們還可以使用一個(gè)常數(shù)如單例的范圍:

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

現(xiàn)在我們將編寫(xiě)一個(gè)類(lèi)似的測(cè)試,顯示了兩個(gè)對(duì)象請(qǐng)求與原型相同的bean名稱(chēng)范圍。他們會(huì)有不同的國(guó)家不再是指相同的bean實(shí)例:

private static final String NAME = "John Smith";
private static final String NAME_OTHER = "Anna Jones";
@Test
public void givenPrototypeScope_whenSetNames_thenDifferentNames() {
    ApplicationContext applicationContext = 
      new ClassPathXmlApplicationContext("scopes.xml");
    Person personPrototypeA = (Person) applicationContext.getBean("personPrototype");
    Person personPrototypeB = (Person) applicationContext.getBean("personPrototype");
    personPrototypeA.setName(NAME);
    personPrototypeB.setName(NAME_OTHER);
    Assert.assertEquals(NAME, personPrototypeA.getName());
    Assert.assertEquals(NAME_OTHER, personPrototypeB.getName());
    ((AbstractApplicationContext) applicationContext).close();
}

作用域。xml文件類(lèi)似于前一節(jié)中給出的一個(gè)而添加xml定義的bean原型范圍:

<bean id="personPrototype" class="org.baeldung.scopes.Person" scope="prototype"/>

4. 認(rèn)識(shí)到網(wǎng)絡(luò)范圍

正如前面提到的,有四個(gè)額外的范圍,只有在理解網(wǎng)絡(luò)應(yīng)用程序上下文。我們?cè)趯?shí)踐中很少使用這些。

請(qǐng)求范圍為一個(gè)HTTP請(qǐng)求,創(chuàng)建一個(gè)bean實(shí)例在會(huì)話范圍創(chuàng)建一個(gè)HTTP會(huì)話bean實(shí)例。

應(yīng)用范圍創(chuàng)建bean實(shí)例的生命周期ServletContext,和websocket創(chuàng)建為一個(gè)特定的websocket會(huì)話范圍。

讓我們創(chuàng)建一個(gè)類(lèi)實(shí)例化bean的使用:

public class HelloMessageGenerator {
    private String message;    
    // standard getter and setter
}

(1)請(qǐng)求范圍

我們可以定義bean的請(qǐng)求范圍使用@ scope注釋:

@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public HelloMessageGenerator requestScopedBean() {
    return new HelloMessageGenerator();
}

proxyMode屬性是必要的,因?yàn)槟壳暗膚eb應(yīng)用程序上下文的實(shí)例化,沒(méi)有主動(dòng)請(qǐng)求。Spring創(chuàng)建一個(gè)代理作為依賴(lài)項(xiàng)注入,并實(shí)例化目標(biāo)bean需要時(shí)在一個(gè)請(qǐng)求。

我們也可以使用一個(gè)@RequestScope由注釋,充當(dāng)一個(gè)上述定義的快捷方式:

@Bean
@RequestScope
public HelloMessageGenerator requestScopedBean() {
    return new HelloMessageGenerator();
}

接下來(lái),我們可以定義一個(gè)控制器requestScopedBean注入引用。我們需要訪問(wèn)相同的請(qǐng)求兩次來(lái)測(cè)試web具體范圍。

如果我們顯示消息每次請(qǐng)求運(yùn)行時(shí),我們可以看到,該值重置為零,即使后來(lái)改變的方法。這是因?yàn)椴煌腷ean實(shí)例為每個(gè)請(qǐng)求返回。

@Controller
public class ScopesController {
    @Resource(name = "requestScopedBean")
    HelloMessageGenerator requestScopedBean;
    @RequestMapping("/scopes/request")
    public String getRequestScopeMessage(final Model model) {
        model.addAttribute("previousMessage", requestScopedBean.getMessage());
        requestScopedBean.setMessage("Good morning!");
        model.addAttribute("currentMessage", requestScopedBean.getMessage());
        return "scopesExample";
    }
}

(2)會(huì)話范圍

我們可以定義的bean會(huì)話范圍以類(lèi)似的方式:

@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public HelloMessageGenerator sessionScopedBean() {
    return new HelloMessageGenerator();
}

還有一個(gè)專(zhuān)門(mén)的由注釋我們可以用來(lái)簡(jiǎn)化bean定義:

@Bean
@SessionScope
public HelloMessageGenerator sessionScopedBean() {
    return new HelloMessageGenerator();
}

接下來(lái),我們定義了一個(gè)控制器與sessionScopedBean參考。再一次,我們需要運(yùn)行兩個(gè)請(qǐng)求為了顯示消息字段的值是相同的會(huì)話。

在這種情況下,當(dāng)請(qǐng)求是由第一次消息為空值。然而,一旦改變,這個(gè)值保留為后續(xù)請(qǐng)求返回相同的bean的實(shí)例對(duì)整個(gè)會(huì)話。

@Controller
public class ScopesController {
    @Resource(name = "sessionScopedBean")
    HelloMessageGenerator sessionScopedBean;
    @RequestMapping("/scopes/session")
    public String getSessionScopeMessage(final Model model) {
        model.addAttribute("previousMessage", sessionScopedBean.getMessage());
        sessionScopedBean.setMessage("Good afternoon!");
        model.addAttribute("currentMessage", sessionScopedBean.getMessage());
        return "scopesExample";
    }
}

(3)應(yīng)用范圍

應(yīng)用范圍創(chuàng)建bean實(shí)例的生命周期ServletContext。

這是類(lèi)似于單例的范圍,但是有一個(gè)非常重要的區(qū)別對(duì)于bean的范圍。

當(dāng)bean是應(yīng)用程序作用域,同樣的bean的實(shí)例共享多個(gè)基于servlet的應(yīng)用程序運(yùn)行在同一ServletContext,而單范圍內(nèi)bean只局限于單個(gè)應(yīng)用程序上下文。

讓我們創(chuàng)建bean與應(yīng)用范圍:

@Bean
@Scope(
  value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public HelloMessageGenerator applicationScopedBean() {
    return new HelloMessageGenerator();
}

類(lèi)似于請(qǐng)求和會(huì)話作用域,我們可以使用更短的版本:

@Bean
@ApplicationScope
public HelloMessageGenerator applicationScopedBean() {
    return new HelloMessageGenerator();
}

現(xiàn)在讓我們創(chuàng)建一個(gè)控制器,這個(gè)bean引用:

@Controller
public class ScopesController {
    @Resource(name = "applicationScopedBean")
    HelloMessageGenerator applicationScopedBean;
    @RequestMapping("/scopes/application")
    public String getApplicationScopeMessage(final Model model) {
        model.addAttribute("previousMessage", applicationScopedBean.getMessage());
        applicationScopedBean.setMessage("Good afternoon!");
        model.addAttribute("currentMessage", applicationScopedBean.getMessage());
        return "scopesExample";
    }
}

applicationScopedBean在這種情況下,一旦設(shè)置,該值為所有后續(xù)請(qǐng)求消息將被保留,會(huì)話,甚至不同的servlet將訪問(wèn)這個(gè)bean的應(yīng)用程序,它運(yùn)行在相同的ServletContext。

(4)WebSocket范圍

最后,讓我們創(chuàng)建的bean websocket范圍:

@Bean
@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public HelloMessageGenerator websocketScopedBean() {
    return new HelloMessageGenerator();
}

當(dāng)?shù)谝淮卧L問(wèn),WebSocket范圍bean存儲(chǔ)在WebSocket會(huì)話屬性。然后返回相同的bean實(shí)例時(shí),在整個(gè)WebSocket會(huì)話bean訪問(wèn)。

我們也可以說(shuō),它表現(xiàn)出單的行為,但只局限于一個(gè)WebSocket會(huì)話。

以上就是關(guān)于“Spring作用域的快速指南”的介紹,大家如果想了解更多相關(guān)知識(shí),不妨來(lái)關(guān)注一下本站的Java在線學(xué)習(xí)技術(shù)文檔,里面的課程內(nèi)容細(xì)致全面,很適合沒(méi)有基礎(chǔ)的小伙伴學(xué)習(xí),希望對(duì)大家能夠有所幫助哦。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 国产成人精品福利网站在线观看 | 男女拍拍拍无挡免费视频 | 欧美久久xxxxxx影院 | 黄漫无遮挡免费网站3d | 成 人 黄 色视频免费播放 | 女性爽爽影院免费观看麻豆 | 欧美视频日韩专区午夜 | 亚洲一级特黄 | 国产黄在线观看免费观看软件视频 | 韩国免费网站成人 | 性欧美老妇人视频 | 日本中文字幕在线看 | 国产麻豆精品高清在线播放 | 天堂网www在线资源中文 | 日韩一中文字幕 | 久久一区精品 | 中文国产成人精品久久久 | 美女羞羞免费网站 | 日韩一区二区三区在线播放 | 男女一级爽爽快视频 | 国产人成精品香港三级在 | 国外欧美一区另类中文字幕 | 小黄鸭视频网站 | 国产精品日韩欧美在线第3页 | 最近中文字幕大全2019 | www精品| 手机看日韩| 国产精品二区三区免费播放心 | 日韩免费高清一级毛片 | 欧美福利网站 | 国产精品麻豆高清在线观看 | 色五月情| 波多野结衣 在线资源观看 波多野结衣 一区二区 | 福利在线看 | 曰韩在线 | 精品国产免费观看一区 | 8x福利精品第一导航 | 91午夜精品亚洲一区二区三区 | 久久综合狠狠综合狠狠 | 亚洲免费高清视频 | 国产亚洲精品hd网站 |