精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring 的 Bean 明明設置了 Scope 為 Prototype,為什么還是只能獲取到單例對象?

開發 前端
對于有些場景,我們可能需要對應的 Bean? 是原型的,所謂原型就是希望每次在使用的時候獲取到的是一個新的對象實例,而不是單例的,這種情況下很多小伙伴肯定會說,那還不簡單,只要在對應的類上面加上 @scope? 注解,將 value? 設置成 Prototype 不就行了。

Spring? 作為當下最火熱的Java? 框架,相信很多小伙伴都在使用,對于 Spring? 中的 Bean? 我們都知道默認是單例的,意思是說在整個 Spring 容器里面只存在一個實例,在需要的地方直接通過依賴注入或者從容器中直接獲取,就可以直接使用。

測試原型

對于有些場景,我們可能需要對應的 Bean? 是原型的,所謂原型就是希望每次在使用的時候獲取到的是一個新的對象實例,而不是單例的,這種情況下很多小伙伴肯定會說,那還不簡單,只要在對應的類上面加上 @scope? 注解,將 value? 設置成 Prototype 不就行了。如下所示:

HelloService.java

package com.example.demo.service;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

/**
* <br>
* <b>Function:</b><br>
* <b>Author:</b>@author ziyou<br>
* <b>Date:</b>2022-07-17 21:20<br>
* <b>Desc:</b>無<br>
*/
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class HelloService {

public String sayHello() {
return "hello: " + this.hashCode();
}
}

HelloController.java 代碼如下:

package com.example.demo.controller;

import com.example.demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* <br>
* <b>Function:</b><br>
* <b>Author:</b>@author ziyou<br>
* <b>Date:</b>2022-07-17 15:43<br>
* <b>Desc:</b>無<br>
*/
@RestController
public class HelloController {

@Autowired
private HelloService service;

@GetMapping(value = "/hello")
public String hello() {
return service.sayHello();
}
}

簡單描述一下上面的代碼,其中 HelloService? 類我們使用了注解 Scope?,并將值設置為 SCOPE_PROTOTYPE?,表示是原型類,在 HelloController? 類中我們調用 HelloService? 的 sayHello? 方式,其中返回了當前實例的 hashcode。

我們通過訪問 http://127.0.0.1:8080/hello 來獲取返回值,如果說每次獲取到的值都不一樣,那就說明我們上面的代碼是沒有問題的,每次在獲取的時候都會使用一個新的 HelloService 實例。

圖片

然而在阿粉的電腦上,無論刷新瀏覽器多少次,最后的結果卻沒有發生任何變化,換句話說這里引用到的 HelloService 始終就是一個,并沒有原型的效果。

那么問題來了,我們明明給 HelloService 類增加了原型注解,為什么這里沒有效果呢?

原因分析

我們這樣思考一下,首先我們通過瀏覽器訪問接口的時候,訪問到的是 HelloController? 類中的方法,那么 HelloController? 由于我們沒有增加 Scope? 的原型注解,所以肯定是單例的,那么單例的 HelloController? 中的 HelloService 屬性是什么怎么賦值的呢?

那自然是 Spring? 在 HelloController? 初始化的時候,通過依賴注入幫我們賦值的。Spring? 注入依賴的賦值邏輯簡單來說就是創建 Bean? 的時候如果發現有依賴注入,則會在容器中獲取或者創建一個依賴 Bean?,此時對應屬性的 Bean? 是單例的,則容器中只會創建一個,如果對應的 Bean? 是原型,那么每次都會創建一個新的 Bean?,然后將創建的 Bean 賦值給對應的屬性。

在我們這里 HelloService? 類是原型的,所以在創建 HelloController Bean? 的時候,會創建一個 HelloService? 的 Bean? 賦值到 service? 屬性上;到這里都沒有問題,但是因為我們 HelloController Bean? 是單例的,初始化的動作在整個生命周期中只會發生一次,所以即使 HelloService 類是原因的,也只會被依賴注入一次,因此我們上面的這種寫入是達不到我們需要的效果的。

解法

解法一

寫到這里有的小伙伴就會想到,那如果我把 HelloController? 類也設置成原型呢?這樣不就可以了么。給 HelloController? 增加上注解 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)? 重啟過后我們重新訪問 http://127.0.0.1:8080/hello ,發現確實是可以的。也很好理解,因為此時 HelloController? 是原型的,所以每次訪問都會創建一個新的實例,初始化的過程中會被依賴注入新的 HelloService 實例。

但是不得不說,這種解法很不優雅,把 Controller 類設置成原型,并不友好,所以這里我們不推薦這種解法。

解法二

除了將 HelloController? 設置成原型,我們還有其他的解法,上面我們提到 HelloController? 在初始化的時候會依賴注入 HelloService?,那我們是不是可以換一個方式,讓 HelloController? 創建的時候不依賴注入 HelloService,而是在真正需要的時候再從容器中獲取。如下所示:

package com.example.demo.controller;

import com.example.demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* <br>
* <b>Function:</b><br>
* <b>Author:</b>@author ziyou<br>
* <b>Date:</b>2022-07-17 15:43<br>
* <b>Desc:</b>無<br>
*/
@RestController
public class HelloController {

@Autowired
private ApplicationContext applicationContext;

@GetMapping(value = "/hello")
public String hello() {
HelloService service = getService();
return service.sayHello();
}

public HelloService getService() {
return applicationContext.getBean(HelloService.class);
}
}

通過測試這種方式也是可以的,每次從容器中重新獲取的時候都是重新創建一個新的實例。

解法三

上面解法二還是比較常規的,除了解法二之外還有一個解法,那就是使用 Lookup? 注解,根據 Spring 的官方文檔,我們可以看到下面的內容。

圖片

簡單來說就是通過使用 Lookup? 注解的方法,可以被容器覆蓋,然后通過  BeanFactory 返回指定類型的一個類實例,可以在單例類中使用獲取到一個原型類,示例如下:

package com.example.demo.controller;

import com.example.demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* <br>
* <b>Function:</b><br>
* <b>Author:</b>@author ziyou<br>
* <b>Date:</b>2022-07-17 15:43<br>
* <b>Desc:</b>無<br>
*/
@RestController
public class HelloController {

@GetMapping(value = "/hello")
public String hello() {
HelloService service = getService();
return service.sayHello();
}

@Lookup
public HelloService getService() {
return null;
}
}

寫法跟我們解法二比較相似,只不過不是我們顯示的通過容器中獲取一個原型 Bean? 實例,而是通過 Lookup? 的注解,讓容器來幫我們覆蓋對應的方法,返回一個原型實例對象。這里我們的 getService? 方法里面可以直接返回一個 null,因為這里面的代碼是不會被執行到的。

我們打個斷點調試,會發現通過 Lookup? 注解的方法最終后走到org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy.LookupOverrideMethodInterceptor#intercept 這里。

圖片

圖片

這里我們可以看到,動態從容器中獲取實例。不過需要注意一點,那就是我們通過 Lookup? 注解的方法是有要求的,因為是需要被重寫,所以針對這個方法我們只能使用下面的這種定時定義,必須是 public? 或者 protected,可以是抽象方法,而且方法不能有參數。

<public|protected> [abstract] <return-type> theMethodName(no-arguments);

總結

今天阿粉通過幾個例子,給大家介紹了一下如何在單例類中獲取原型類的實例,提供了三種解法,其中解法一不推薦,解法二和解法三異曲同工,感興趣的小伙伴可以自己嘗試一下。

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2025-06-12 03:25:00

2020-10-29 09:19:11

索引查詢存儲

2022-05-27 08:25:55

容器Spring

2022-06-23 10:47:57

Spring容器工具

2024-12-31 11:40:05

2022-08-04 08:22:49

MySQL索引

2017-04-17 11:50:13

51CTO 學院

2023-10-08 10:14:12

2021-05-08 08:55:54

CPUIBMIntel

2024-01-05 08:38:20

SpringBeanScope

2021-04-29 07:18:21

Spring IOC容器單例

2022-05-26 09:24:09

volatile懶漢模式

2011-03-18 09:27:00

Spring

2021-03-08 08:40:25

Spring Bean 創建單例對象

2021-07-05 08:43:46

Spring Beanscope作用域

2021-09-13 10:03:54

藍牙連接藍牙藍牙設備

2009-06-17 17:20:14

BeanFactorySpring

2023-01-13 07:41:20

BeanSpring容器

2024-05-28 07:55:31

SpringBean用域

2021-07-01 10:45:18

Bean對象作用域
點贊
收藏

51CTO技術棧公眾號

日韩欧美在线一区二区| 成人一区二区三区视频在线观看| 日韩久久精品一区| 宅男噜噜99国产精品观看免费| 亚洲天堂手机版| 国自产拍偷拍福利精品免费一| 亚洲国产一区自拍| 欧美日韩大尺度| 伊人精品影院| 久久综合久色欧美综合狠狠| 成人性生交xxxxx网站| 特级西西人体高清大胆| 国产精品高潮呻吟久久久久| 一区二区三区四区亚洲| 蜜桃在线一区二区三区精品| 亚洲 欧美 中文字幕| 影音先锋日韩在线| 亚洲美女av黄| 国产精品探花在线播放| 欧美成人a交片免费看| 亚洲免费看黄网站| 欧美精品v日韩精品v国产精品| 麻豆久久久久久久久久| 成人女同在线观看| 久久久久久久一区| 91成人免费观看| 日韩手机在线视频| 欧美一区二区三区免费看| 欧美日韩免费高清一区色橹橹| 无码 制服 丝袜 国产 另类| 理论片午午伦夜理片在线播放| 91麻豆国产福利精品| 91久久精品久久国产性色也91| 成人毛片在线播放| 欧美激情1区2区| 日韩在线激情视频| 欧美夫妇交换xxx| 免费欧美网站| 911国产精品| 日韩精品免费播放| 波多野结衣中文在线| 国产精品久久久久久亚洲毛片| 欧美日韩一区二| 日批视频免费播放| 丁香桃色午夜亚洲一区二区三区| 亚洲va欧美va国产综合剧情 | av日韩在线免费观看| 色999日韩国产欧美一区二区| 黄色一级视频在线播放| 久久免费电影| 亚洲一卡二卡三卡四卡| 午夜探花在线观看| 黄色免费在线看| 亚洲同性同志一二三专区| 一本色道久久综合亚洲二区三区| 国产黄在线看| 中文字幕国产一区二区| 视频在线观看成人| 色综合久久影院| 一色桃子久久精品亚洲| dy888午夜| 日本蜜桃在线观看| 国产精品久久精品日日| 亚洲精品在线免费看| 色哟哟免费在线观看| 亚洲人成精品久久久久| a级黄色片网站| www.国产精品.com| 日韩一区中文字幕| 最新黄色av网站| 免费黄色网页在线观看| 国产精品久久久久久久裸模| 中文字幕精品—区二区日日骚| av电影免费在线观看| 亚洲午夜影视影院在线观看| 国产玉足脚交久久欧美| 色是在线视频| 欧美日韩久久不卡| 午夜福利三级理论电影| 国产精品115| 亚洲日韩第一页| 国产三级av在线播放| 99久久www免费| 久久久免费电影| 久操视频在线免费观看| 韩国精品免费视频| 国产一区二区三区无遮挡| 男操女在线观看| 日韩毛片在线免费观看| 日韩小视频在线播放| 日韩精品一区二区三区av| 日韩午夜精品视频| 美女100%无挡| 影视亚洲一区二区三区| 欧美一区二三区| 国产精品伊人久久| eeuss国产一区二区三区| 精品一区在线播放| 日本中文字幕在线2020| 亚洲va欧美va人人爽午夜| 蜜臀av免费观看| 久久国产精品色av免费看| 最近2019中文免费高清视频观看www99 | 人妻少妇偷人精品久久久任期| 三级欧美日韩| 中文国产亚洲喷潮| 国产无遮挡又黄又爽| 久久99国产精品尤物| 国产在线一区二| h片在线观看网站| 日韩欧美中文第一页| wwwww在线观看| 亚洲+变态+欧美+另类+精品| www.亚洲人.com| 天堂网一区二区| www.在线欧美| av一区二区三区免费观看| 亚洲成人激情社区| 亚洲精品久久久久久久久| 永久看片925tv| 老鸭窝一区二区久久精品| 久久精品中文字幕一区二区三区| av在线free| 欧美另类videos死尸| 亚洲久久久久久久| 日韩视频不卡| 国产伦精品一区二区三区四区免费| 男人天堂久久久| 欧洲视频一区二区| 免费中文字幕av| 亚洲国产免费| 成人午夜电影在线播放| 1区2区在线观看| 555www色欧美视频| 波多野结衣av在线观看| aa亚洲婷婷| 九九九九九精品| av小说在线播放| 日韩亚洲欧美一区二区三区| 欧美一级特黄高清视频| 日韩中文字幕1| 欧美激情导航| 国产高清不卡| 亚洲区一区二区| 久久夜色精品亚洲| av成人免费在线| 午夜精品久久久久久久无码| 国产毛片久久久| 欧美另类精品xxxx孕妇| 国产美女免费看| 亚洲天堂2014| 久草免费资源站| 99久久99久久精品国产片桃花| 国产有码一区二区| 视频国产在线观看| 日韩欧美在线一区| 俄罗斯毛片基地| 狠狠色丁香久久婷婷综合_中| 久久精品人成| 超碰在线播放97| 9l视频自拍蝌蚪9l视频成人| 久久久精品免费视频| 国产伦精品一区二区三区视频痴汉 | 亚洲国产精品suv| 亚洲国产美国国产综合一区二区| 亚洲少妇中文字幕| 一区二区三区四区五区精品视频| 欧美精品123| 日韩av黄色| 中文字幕欧美专区| 国产乱码精品一区二区三区精东| 亚洲精品免费在线播放| 在线天堂中文字幕| 日本黄色中文字幕| 91亚洲男人天堂| 国产成人久久婷婷精品流白浆| 久久91在线| 欧美最猛性xxxxx(亚洲精品)| 国产视频网站在线| 一区二区三区不卡视频在线观看| 日本不卡视频一区| 免播放器亚洲| 日韩av综合网站| 国产微拍精品一区| 中文字幕久久午夜不卡| 国产自偷自偷免费一区| 羞羞色午夜精品一区二区三区| av资源一区二区| 亚洲三级欧美| 久久久国产精品视频| 朝桐光av在线一区二区三区| 亚洲另类在线制服丝袜| 在线 丝袜 欧美 日韩 制服| 全国精品久久少妇| 久操手机在线视频| 精品国产美女| 91久久精品国产91久久性色| 韩国成人漫画| 久久99精品久久久久久青青91| 免费在线视频一级不卡| 欧美一级二级三级蜜桃| 中文字幕在线观看视频免费| 一区二区三区国产精品| 欧美黄色高清视频| 不卡av在线网| 九九热99视频| 亚洲欧美卡通另类91av| 日韩a级黄色片| 九九视频精品全部免费播放| 国产精品一级久久久| 亚洲成人高清| 国产精品va在线播放| 激情影院在线| 自拍视频国产精品| 天天操天天操天天| 日韩视频在线你懂得| 在线观看免费高清视频| 日韩欧美亚洲一二三区| 日本成人精品视频| 99精品欧美一区| 国产免费无码一区二区| 加勒比av一区二区| 国产天堂在线播放| 欧美中文字幕| 精品国产一二三四区| 99久久婷婷| 精品国产乱码久久久久软件| 综合激情网...| 91在线短视频| 精品精品视频| 91在线观看免费高清完整版在线观看| 成人午夜在线| 在线影视一区二区三区| 亚洲一区二区三区久久| 国产综合色区在线观看| 538国产精品视频一区二区| a毛片不卡免费看片| 欧美第一黄网免费网站| caopo在线| 操日韩av在线电影| 精品自拍一区| 久久亚洲精品一区二区| 国产素人视频在线观看| 久久精品人人做人人爽| 在线激情网站| 亚洲欧美日韩中文在线| 成人乱码一区二区三区| 在线电影欧美成精品| 国产伦理一区二区| 欧美丰满美乳xxx高潮www| 久久久久久久黄色| 艳妇臀荡乳欲伦亚洲一区| а天堂中文在线资源| 亚洲人123区| 午夜免费激情视频| 亚洲午夜免费视频| 国产免费av一区二区| 亚洲高清免费视频| 影音先锋在线国产| 欧美性猛交xxxxx免费看| 久草免费在线观看视频| 亚洲成人午夜影院| 99久热在线精品996热是什么| 午夜精品久久久久久久99水蜜桃| 天天综合天天干| 欧美午夜理伦三级在线观看| 国产一区二区三区视频免费观看| 日韩午夜在线播放| 亚欧洲精品视频| 亚洲成人中文字幕| 九一在线视频| 美日韩丰满少妇在线观看| caoporn-草棚在线视频最| 欧洲中文字幕国产精品| 国产精品高潮久久| 国产精华一区| 国产精品三p一区二区| 日本最新一区二区三区视频观看| 日本在线电影一区二区三区| 可以在线看黄的网站| 99国产精品99久久久久久粉嫩| 国产一级不卡毛片| 销魂美女一区二区三区视频在线| 天天操天天爽天天射| 麻豆视频一区二区| 欧美成人精品一区二区综合免费| 国产欧美日韩在线视频| 国精品人伦一区二区三区蜜桃| 亚洲国产成人高清精品| 国产成人精品777777| 在线综合+亚洲+欧美中文字幕| 天堂av2024| 国产一区二区日韩精品欧美精品| 91精选在线| 国产精品狼人色视频一区| gogo久久日韩裸体艺术| 日韩精品伦理第一区| 黑人一区二区| 午夜宅男在线视频| 成人91在线观看| 999精品在线视频| 狠狠躁18三区二区一区| 中文字幕视频免费观看| 日韩精品久久久久久福利| 毛片在线不卡| 91精品国产乱码久久久久久蜜臀 | 日韩精品黄色网| 久久经典视频| 久久免费精品视频| 外国成人毛片| 国产日韩一区二区| 91精品精品| 在线观看高清免费视频| 91色婷婷久久久久合中文| 清纯粉嫩极品夜夜嗨av| 欧美三级三级三级爽爽爽| 青青操在线视频| 97精品视频在线观看| 欧美亚洲人成在线| 欧美日韩在线精品| 在线一区欧美| 艳妇乳肉豪妇荡乳xxx| 亚洲精选视频免费看| 亚洲毛片一区二区三区| 日韩一区二区在线播放| 日本黄色片在线观看| 国产高清视频一区三区| 一区二区三区韩国免费中文网站| 亚洲 国产 日韩 综合一区| 亚洲激情av| 中文在线观看免费视频| 亚洲一级二级三级在线免费观看| 国产精品久久久久久久久久久久久久久久久久 | 日韩一区二区三区在线| 欧美尤物美女在线| 国产精品爽黄69天堂a| 经典一区二区| 99re99热| 国产美女av一区二区三区| 国产精品免费人成网站酒店 | 日本三级免费观看| 91在线看国产| 亚洲高清毛片一区二区| 亚洲欧美变态国产另类| 成人性教育av免费网址| 欧美精品免费观看二区| 久久精品首页| 加勒比一区二区| 91久久人澡人人添人人爽欧美| 国产在线观看网站| 国产精品久久久久久av下载红粉| 成人羞羞网站| 亚洲无在线观看| 亚洲精品日日夜夜| 亚洲国产成人一区二区| 久久久最新网址| 小嫩嫩12欧美| 欧美三级理论片| 国产精品嫩草久久久久| 在线观看免费视频一区| 深夜精品寂寞黄网站在线观看| 91麻豆精品国产综合久久久 | 老司机精品视频在线观看6| 91九色在线免费视频| 四虎成人av| 精品人妻无码中文字幕18禁| 婷婷综合另类小说色区| 欧美亚洲日本| 成人久久久久久| 亚洲一级网站| 欧洲av一区二区三区| 欧美福利视频一区| 韩国日本一区| 日本一区二区不卡高清更新| 日本亚洲欧美天堂免费| 亚洲自拍偷拍图| 91精品国产91久久综合桃花| 国产美女高潮在线观看| 久久久久久欧美精品色一二三四| 香蕉久久夜色精品国产| 精品人妻伦九区久久aaa片| 亚洲国产美女久久久久| 九七影院97影院理论片久久| 99er在线视频| 2020国产精品自拍| 国产又粗又大又爽视频| 91禁外国网站| 999国产精品视频| 777一区二区| 欧美日韩激情视频8区| 国产黄色在线网站| 免费亚洲一区二区| 老司机午夜精品| 欧美极品aaaaabbbbb| 亚洲欧美日韩另类| 视频免费一区二区| 亚洲免费av一区二区三区| 亚洲欧洲另类国产综合| 麻豆av电影在线观看| 超碰在线观看97|