精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品调教视频| 1769免费视频在线观看| 麻豆91精品| 综合久久五月天| 成人高清在线观看视频| 色女人在线视频| www.亚洲激情.com| 国产精品香蕉国产| 国产中文字字幕乱码无限| 欧美人与拘性视交免费看| 欧美日韩在线播放三区四区| 国产欧美自拍视频| 免费黄色在线视频网站| 国内外成人在线| 91超碰中文字幕久久精品| 人人妻人人澡人人爽| 亚洲一区二区三区日本久久九| 福利视频第一区| 日日噜噜噜夜夜爽爽| 天天操天天干天天插| 美女网站在线免费欧美精品| 91国内产香蕉| 亚洲最大的黄色网址| 国产成人福利av| 欧美日韩精品一区视频| 动漫av网站免费观看| 超碰免费在线播放| 国产欧美一区视频| 久久国产精品免费一区| 国产乱子伦精品无码码专区| 久久精选视频| 久久久综合免费视频| 欧美性生交大片| 欧美猛男同性videos| 日韩av影片在线观看| 天天爽夜夜爽一区二区三区| av高清不卡| 亚洲第一成人在线| 欧洲精品视频在线| 懂色一区二区三区| 久久婷婷综合激情| 精品视频导航| 日本国产在线观看| 丁香激情综合五月| 99久久精品无码一区二区毛片| 特级西西444www高清大视频| 丝袜诱惑亚洲看片| 日本在线观看天堂男亚洲| 日韩精品在线免费看| 国产精品theporn| 久久色免费在线视频| 特级西西人体高清大胆| 欧美偷拍自拍| 尤物精品国产第一福利三区| 无码 人妻 在线 视频| 综合综合综合综合综合网| 亚洲国产中文字幕久久网| 亚洲欧美高清在线| av不卡一区| 精品国产a毛片| yjizz视频| 欧美18xxxx| 日韩大片在线观看视频| 一出一进一爽一粗一大视频| 人人精品视频| 亚洲精品视频久久| 精品无码人妻一区二区免费蜜桃 | 欧美三区免费完整视频在线观看| www.国产区| 日本一区免费网站| 欧美日韩电影在线播放| 亚洲av毛片在线观看| 亚洲乱码一区| 日韩成人av在线播放| 素人fc2av清纯18岁| 国产99久久久国产精品成人免费| 亚洲性视频网址| 欧美自拍偷拍网| 自拍欧美日韩| 91禁国产网站| 欧美人一级淫片a免费播放| 蜜臀av性久久久久蜜臀aⅴ| 国产有码一区二区| 黄色一级大片在线免费看国产一| 91在线丨porny丨国产| 日本一区二区久久精品| 欧美三级黄网| 亚洲成av人片观看| 九热视频在线观看| 欧美日韩国产一区二区在线观看| 精品不卡在线视频| 中文字幕 自拍| 亚洲第一偷拍| 欧美在线视频观看免费网站| 国产精品国产精品国产| 国产成人丝袜美腿| 欧洲成人一区二区| 在线观看av免费| 色素色在线综合| 亚洲欧美天堂在线| 亚洲都市激情| 久久国产色av| 久久精品无码av| 国产成人午夜精品5599| 日韩资源av在线| 欧美xxxbbb| 欧美在线免费观看亚洲| 高清中文字幕mv的电影| 欧美日韩在线网站| 97精品国产97久久久久久春色| 中文天堂在线资源| www.在线成人| 国产精品无码乱伦| 澳门av一区二区三区| 欧美精品一区二区三区在线播放| 女人黄色一级片| 亚洲黄色大片| 亚洲最大av网| 欧美日韩欧美| 亚洲一级二级三级在线免费观看| 手机在线成人免费视频| 亚洲精品aaaaa| 欧美精品www在线观看| 91精品视频免费在线观看| 久久久久久久综合狠狠综合| www成人免费| 欧美高清影院| 在线观看免费高清视频97| 精品国产乱码一区二区| 国产乱码字幕精品高清av| 亚洲不卡中文字幕| 阿v视频在线观看| 日韩一卡二卡三卡| 婷婷久久综合网| 青草av.久久免费一区| 久久伊人一区二区| 爱啪视频在线观看视频免费| 日韩亚洲欧美在线| 国产黄色的视频| 麻豆国产一区二区| 亚欧精品在线| av成人亚洲| 在线观看国产成人av片| 69视频免费看| 国产三级欧美三级| 婷婷丁香激情网| 波多野结衣在线观看一区二区| 国产成人精品在线播放| 精品视频二区| 91福利视频在线| 美女爆乳18禁www久久久久久| 午夜亚洲影视| 久久天天狠狠| 神马电影网我不卡| 永久免费精品影视网站| 最近中文字幕在线观看视频| 欧美激情在线一区二区| 人人干人人干人人| 香蕉视频国产精品| 超碰97在线人人| 免费看电影在线| 日韩av在线免费看| 香蕉影院在线观看| 国产女人18水真多18精品一级做| 蜜臀视频一区二区三区| 成人直播大秀| 91嫩草在线| 国产美女高潮在线| 国产亚洲一区二区在线| 中文字幕av网站| 亚洲欧美另类小说| 亚洲国产精品第一页| 日韩一级不卡| 欧美日韩在线一区二区三区| 992tv国产精品成人影院| 久久九九精品99国产精品| 精品人妻一区二区三区蜜桃| 午夜婷婷国产麻豆精品| 91中文字幕永久在线| 麻豆高清免费国产一区| 国产在线拍揄自揄拍无码| 国产另类在线| 国产成人精品免高潮费视频| 日本在线免费| 精品国免费一区二区三区| 天天做天天爱夜夜爽| 国产亚洲一区二区在线观看| 亚洲一二三av| 性感少妇一区| 久久免费视频2| 欧美精品中文字幕亚洲专区| 国产精品久久久久福利| 羞羞的视频在线观看| 亚洲老板91色精品久久| 一区二区国产欧美| 欧美日韩在线视频首页| 福利视频第一页| 99久久久国产精品| 热久久久久久久久| 午夜在线精品偷拍| 大地资源网在线观看免费官网| 欧美日韩一区二区三区四区不卡| 国产精品入口日韩视频大尺度| 婷婷av在线| 亚洲天堂av在线免费观看| 国产不卡精品视频| 欧洲国内综合视频| 国产在线视频二区| 中文字幕一区不卡| 中文字幕狠狠干| 国产不卡视频在线播放| 在线观看日本一区二区| 一区二区精品| av日韩在线看| 91亚洲国产高清| 欧美精品久久| 欧美黑人巨大videos精品| 亚洲自拍偷拍色图| av一区在线播放| 欧美一级大片视频| 丰满的护士2在线观看高清| 视频在线观看99| 男人的天堂在线| 亚洲第一精品福利| 精品人妻少妇嫩草av无码专区 | 最近日韩免费视频| 狠狠色狠狠色综合日日五| 激情综合网五月天| 亚洲人成网站色在线观看| 微拍福利一区二区| 91丨porny丨蝌蚪视频| 男女性杂交内射妇女bbwxz| 韩国欧美国产一区| 91精品999| 毛片不卡一区二区| 天天操天天爱天天爽| 免费视频一区| 成人观看免费完整观看| 亚洲免费大片| 毛片在线播放视频| 亚洲国产电影| 日韩av在线播放不卡| 国产精品a级| 黄色网在线视频| 99久久99久久精品国产片果冰| 日本不卡一二三区| 欧美一级淫片| 亚洲区一区二区三区| 俺要去色综合狠狠| 夜夜爽99久久国产综合精品女不卡 | 婷婷亚洲五月色综合| 一本一本久久a久久精品综合妖精| 国产成人手机高清在线观看网站| 久久综合九色综合久99| 精品一区在线| 婷婷四月色综合| 日韩极品一区| 青青在线免费视频| 欧美日本三区| 日本www在线视频| 亚洲在线国产日韩欧美| 男人操女人免费| 日韩av电影免费观看高清完整版| 992kp快乐看片永久免费网址| 蜜桃视频在线一区| 999热精品视频| 福利电影一区二区| aaaaaav| 国产三级精品视频| 欧美性生交大片| 亚洲一区二区四区蜜桃| 九九热在线视频播放| 色哟哟一区二区| 一二三区中文字幕| 日韩三级视频在线观看| 午夜福利视频一区二区| 国产亚洲激情在线| 国产在线观看91| 国外成人在线视频| 欧美123区| 91丝袜脚交足在线播放| 亚洲精品动态| 日韩第一页在线观看| 在线观看的日韩av| 国产又黄又猛又粗| 国产成人啪免费观看软件| 加勒比一区二区| 国产精品女主播av| 久久这里只有精品国产| 色吊一区二区三区| 国产又粗又猛又爽又黄的视频一 | 国产精品第二页| 精品一区二区三区中文字幕视频 | 九一精品久久久| 99久久精品一区二区| 看免费黄色录像| 色综合一区二区三区| 国产手机视频在线| 亚洲天堂av网| 91九色porn在线资源| 成人av在线亚洲| 任你躁在线精品免费| 91制片厂免费观看| 久久黄色影院| 亚洲欧美综合视频| 国产精品欧美一级免费| 亚洲免费在线观看av| 91精品国产麻豆国产自产在线| 女人天堂在线| 久久久久久久av| 免费视频成人| 欧美连裤袜在线视频| 激情综合视频| 图片区乱熟图片区亚洲| 国产亚洲成aⅴ人片在线观看 | 欧美大片专区| 亚洲精品怡红院| 91丝袜呻吟高潮美腿白嫩在线观看| 夫妻性生活毛片| 欧美性色综合网| 亚洲 美腿 欧美 偷拍| 欧美日韩成人黄色| 亚洲一区导航| 亚洲精品久久区二区三区蜜桃臀| 国产精品久久久免费| 波多野吉衣在线视频| 亚洲欧洲精品一区二区精品久久久| 你懂的国产视频| 亚洲成人中文字幕| 伊人影院蕉久影院在线播放| 91精品久久久久久久| 日韩www.| 国产自偷自偷免费一区| 26uuu久久综合| 五月婷婷中文字幕| 亚洲精品久久久久中文字幕欢迎你 | 西西44rtwww国产精品| 日韩精品一区二区在线| 成人在线播放| 亚洲999一在线观看www| 国产精品99在线观看| 一个色综合久久| 中文字幕一区二| 国产伦精品一区二区三区免.费| 中文字幕在线亚洲| 欧美风情在线视频| 黄色www在线观看| 久久99久久久久| 国产一区第一页| 91精品国产高清一区二区三区 | 91在线观看喷潮| 日韩中文字幕网| 精品欧美视频| 国产传媒久久久| proumb性欧美在线观看| 日本一级淫片免费放| 亚洲精品乱码久久久久久按摩观| 福利影院在线看| 欧美福利一区二区三区| 免费国产自线拍一欧美视频| x88av在线| 欧美日韩亚洲不卡| 影音先锋男人资源在线| 国产精品乱码视频| 亚洲女优在线| 免费看日本黄色片| 欧美精品久久久久久久多人混战 | 欧美成人一区在线| 99久久免费精品国产72精品九九| 亚洲熟妇无码一区二区三区| 91视频91自| 成人免费视频国产免费| 日韩视频免费在线观看| 日韩成人18| 国产午夜伦鲁鲁| 中文在线免费一区三区高中清不卡| 国产又粗又大又爽| 久久久亚洲精选| 你懂的一区二区三区| 亚洲一区二区在线视频观看| 一区二区成人在线| 三级在线播放| 91美女片黄在线观看游戏| 亚洲欧洲日本mm| 中文字幕免费视频| 欧美一级片免费看| 亚洲最新无码中文字幕久久| 一区二区三区偷拍| av不卡免费电影| 11024精品一区二区三区日韩| 欧美国产第一页| 国产欧美日韩视频在线| 国产精品igao网网址不卡| 精品国产乱码久久久久久虫虫漫画| www.视频在线.com| 国产传媒一区二区| 蜜桃久久久久久| 国产成人无码精品久在线观看| 中文字幕九色91在线| 免费福利视频一区|