Spring范圍代理

考慮以這種方式定義的兩個Spring bean:
@Component
class SingletonScopedBean{@Autowired private PrototypeScopedBean prototypeScopedBean;public String getState(){return this.prototypeScopedBean.getState();}
}@Component
@Scope(value="prototype")
class PrototypeScopedBean{private final String state;public PrototypeScopedBean(){this.state = UUID.randomUUID().toString();}public String getState() {return state;}
}

在這里,將原型作用域bean注入到Singleton作用域bean中。

現在,考慮使用以下bean進行此測試:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ScopedProxyTest {@Autowired private SingletonScopedBean singletonScopedBean;@Testpublic void testScopedProxy() {assertThat(singletonScopedBean.getState(), not(equalTo(singletonScopedBean.getState())));}@Configuration@ComponentScan("org.bk.samples.scopedproxy")public static class SpringContext{}}

需要注意的是,這里僅創建了1個PrototypeScopedBean實例,并且將1個實例注入到SingletonScopedBean中,因此上述測試實際上期望每次調用getState()方法都會產生一個PrototypeScopedBean新實例失敗。 。

如果對PrototypeScopedBean的每個請求都需要一個新實例(并且通常,如果作用域較長的bean的作用域較短,則需要遵守較短的作用域),那么有幾種解決方案:

1.查找方法注入–可以在這里閱讀
2.更好的解決方案是使用范圍代理 -

可以使用@Configuration以這種方式指定作用域代理:

@Component
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
class PrototypeScopedBean{private final String state;public PrototypeScopedBean(){this.state = UUID.randomUUID().toString();}public String getState() {return state;}}

進行此更改后,注入到SingletonScopedBean中的bean并不是PrototypeScopedBean本身,而是該bean的代理(使用CGLIB或Dynamic代理創建),并且該代理了解范圍并根據范圍的要求返回實例,測試應現在可以正常工作了。

參考: all和其他博客中的JCG合作伙伴 Biju Kunjummen提供的Spring Scoped Proxy 。


翻譯自: https://www.javacodegeeks.com/2012/08/spring-scoped-proxy.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371227.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

遞歸和分治的概念性的理解

遞歸的概念表述: 直接或間接調用自身的算法稱為遞歸算法。 理解:遞歸算法的可以理解為多個算法的嵌套調用,只是調用算法是同一個,同時需要一個工作棧來作為各層次的數據存儲區,包括所有實參指針,局部變量&a…

ibatis mysql sqlmapconfig_iBATIS sqlMapConfig配置詳解

1 <?xml version"1.0" encoding"UTF-8"?>2 "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">5 6 11 13 enhancementEnabled"true"14 lazyLoadingEnabled"true"15 errorTracingEnabled"true"16 m…

什么情況使用 weak 關鍵字,相比 assign 有什么不同?

什么情況使用 weak 關鍵字&#xff1f; 在 ARC 中,在有可能出現循環引用的時候,往往要通過讓其中一端使用 weak 來解決,比如: delegate 代理屬性 自身已經對它進行一次強引用,沒有必要再強引用一次,此時也會使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak&#xff1b;當然…

使用Spring Redis發布/訂閱

繼續發現功能強大的Redis功能集&#xff0c;值得一提的是對發布/訂閱消息的開箱即用支持。 發布/訂閱消息傳遞是許多軟件體系結構的重要組成部分。 某些軟件系統要求消息傳遞解決方案提供高性能&#xff0c;可伸縮性&#xff0c;隊列持久性和持久性&#xff0c;故障轉移支持&am…

python在律師上作中的實例_python-基礎面試題

深拷貝1.對象A拷貝&#xff0c;生成對象B&#xff0c;且我們修改對象B(對象A)中的數據或方法&#xff0c;對象A(對象B)不會受影響&#xff0c;這就是深拷貝2.對于可變與不可變類型對于不可變類型&#xff0c;深拷貝會和淺拷貝一樣&#xff0c;拷貝的是引用&#xff0c;不會創建…

2017 校招華為上機題

1. 給定一個字符串&#xff0c;把字符串內的字母轉換成該字母的下一個字母&#xff0c; a 換成b&#xff0c;z 換成a&#xff0c;Z 換成A&#xff0c;如aBf 轉換成bCg&#xff0c;字符串內的其他字符不改變&#xff0c;給定函數&#xff0c;編寫函數void Stringchang&#xff0…

JSON –拯救杰克遜

有時您必須使用JavaScript從服務器中獲取一些數據&#xff0c; JSON是完成此任務的不錯選擇。 讓我們玩一下JPA揭秘&#xff08;第1集&#xff09;-OneToMany和ManyToOne映射中的“雇主-雇員-福利”示例。 我們將在基于Spring Framework的Web應用程序中使用它。 我們的第一個…

maven 使用記錄之修改 maven默認jdk版本

maven package執行的時候會遇到jdk版本不對的問題 &#xff1a;原因是 maven所指定的jdk版本與項目使用的jdk版本不一致1.項目屬性的 java compiler可以設置2.直接修改 maven 的 settings.xml 一勞永逸settiings.xml <profiles>標簽內加入<profile> <id>j…

java默認值_Java中八種基本數據類型的默認值

通過一段代碼來測試一下 8種基本數據類型的默認值package dierge;public class Ceshi {int a;double b;boolean c;char d;float f;byte e;long h;short j;public static void main(String args[]){Ceshi anew Ceshi();System.out.println("整型的默認值是&#xff1a;&quo…

HDU - 1024 Max Sum Plus Plus 最大m段子段和+滾動數組優化

給定n個數字&#xff0c;求其中m段的最大值&#xff08;段與段之間不用連續&#xff0c;但是一段中要連續&#xff09; 例如&#xff1a;2 5 1 -2 2 3 -1五個數字中選2個&#xff0c;選擇1和2 3這兩段。 dp[i][j]從前j個數字中選擇i段&#xff0c;然后根據第j個數字是否獨立成一…

JavaFX教程–基礎

JavaFX似乎正在RIA領域獲得發展。 有了正確的工具和開發支持&#xff0c;它肯定會在下一個最佳技術“物”上付出巨大的代價。 我沒有在這里寫任何JavaFX評論&#xff0c;因為有很多技術評論可能對它進行了廣泛的評論&#xff0c;但是&#xff0c;我將編寫一個簡單的教程&#x…

java script this_JavaScript this 關鍵字

JavaScript this 關鍵字面向對象語言中 this 表示當前對象的一個引用。但在 JavaScript 中 this 不是固定不變的&#xff0c;它會隨著執行環境的改變而改變。在方法中&#xff0c;this 表示該方法所屬的對象。如果單獨使用&#xff0c;this 表示全局對象。在函數中&#xff0c;…

trim函數的作用 $.trim(str)

去掉字符序列左邊和右邊的空格轉載于:https://www.cnblogs.com/dandeliongogo/p/6610890.html

php數據庫備份腳本

// 備份數據庫 $host "localhost"; $user "root"; //數據庫賬號 $password ""; //數據庫密碼 $dbname "mysql"; //數據庫名稱 // 這里的賬號、密碼、名稱都是從頁面傳過來的 if (!mysql_connect($host, $user, $password)) // 連接…

java swing 案例詳解_《Java Swing圖形界面開發與案例詳解》PDF_IT教程網

資源名稱&#xff1a;《Java Swing圖形界面開發與案例詳解》PDF內容簡介&#xff1a;《Java Swing圖形界面開發與案例詳解》全書共20章&#xff0c;其中第1&#xff5e;2章主要介紹有關Swing的基礎知識&#xff0c;包括Swing的基本概述、如何使用IDE開發Swing程序&#xff1b;第…

水晶球錯覺

我注意到人們有時會避免進行徹底的測試。 對于某些人來說&#xff0c;這聽起來像是偽造的&#xff0c;但是請聽我說……我確實理解為什么會這樣。 測試會產生被困的感覺&#xff0c;每引入一個新的測試&#xff0c;負擔就會加重。 建立穩定&#xff0c;無干擾且質量保證的測試套…

Python—day3

1、字符串在C里邊就是字符數組 Python里邊一切事物都是對象&#xff0c;對象則是類創建的 2、set集合 set是一個無序且不能重復的元素集合 #!/usr/bin/env python# encoding: utf-8#set對象不能有重復s1 set()s1.add(alex)print(s1)s1.add(alex)print(s1)s1.add(shidong)print…

iOS - The file “XXX.app” couldn’t be opened because you don’t have permission to view it.

當引入第三方的框架的時候 容易產生以下問題&#xff1a; The file “XXX.app” couldn’t be opened because you don’t have permission to view it. 如圖&#xff1a; 造成的原因&#xff1a; info文件中的字段Executable file 與 build settings欄中的Packaging中的Produc…

Google Guava v07范例

我們在TouK舉辦了一個名為“每周技術研討會”的活動&#xff0c;即每個星期五的16:00&#xff0c;每個愿意參加的人都有一個演講。 我們展示了我們在家學習和學習的東西&#xff0c;但是我們也設有一個公告板&#xff0c;上面有人們想聽的話題。 上周MaciejPrchniak談論了Cloju…

推薦一些經過實踐檢驗的學習方法

作者做了多年的Java培訓教師&#xff0c;也接觸過不少初學者&#xff0c;根據多年的教學互動經驗&#xff0c;總結了一些能少走彎路的學習方法&#xff0c;供大家參考。 第一&#xff0c;是要多學多練&#xff0c;這似乎是廢話&#xff0c;但真正能非常上心學習的人還真是少數&…