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.mzph.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;但真正能非常上心学习的人还真是少数&…