首页 > 其他分享 >spring 中 singleton 和 prototype 作用域的比较

spring 中 singleton 和 prototype 作用域的比较

时间:2023-02-26 10:56:02浏览次数:40  
标签:singleton 作用域 spring 拿到 对象 Bean prototype

Spring Bean 作用域

主要了解 singletonprototype 就好了,他们分别使用 单例模式 和 原型模式

来源 说明
singleton 默认作用域,一个BeanFactory有且仅有一个实例(并不是在JVM进程里是唯一的)
prototype 原型作用域,每次以来查找和依赖注入生成新的Bean对象
request 将Spring Bean存储在ServletRequest上下文中
session 将Spring Bean存储在HttpSession中
application 将Spring Bean 存储在ServletContext中

依赖查找: 比较 singleton 和 prototype 两种作用域

结论: 使用依赖查找时,singleton会拿到相同的对象,prototype 会拿到不同的对象

首先我们将User对象通过 singleton 和prototype 两种方式分别注入到容器中

image-20230226095718659

我们三次拿到User对象,比较结果(比较name属性)

观察可以看到,使用 singleton 作用域拿到的是相同的对象,prototype 作用域拿到的是不同的对象

image-20230226095803475

image-20230226095821309

依赖注入 比较 singleton 和 prototype 两种作用域

结论:singleton 作用域拿到的是相同的对象,prototype 作用域拿到的仍然是不同的对象

通过@Autowired方式依赖查找对象

image-20230226100915896

把他们打印出来看看,这样子会报错,因为容器中有重复的对象,而我们没有指定哪个是primary

image-20230226101019501

如果我们使用 @Qualifier 注解指定要注入的对象名称,就不会报错了

image-20230226101140049

输出结果如下:可以看到,singleton 作用域拿到的是相同的对象,prototype 作用域拿到的仍然是不同的对象

image-20230226101240650

依赖注入集合时 singleton 和 prototype 作用域的比较

结论:集合中会同时存在一份 singleton bean 和 prototype bean

使用@Autowired直接注入map集合

image-20230226102046237

输出,打印,可以看到 singleton 和 prototype 作用域的对象同时存在

image-20230226102138596

image-20230226102147243

singleton 和 prototype 作用域的生命周期方法的回调情况

结论:

singleton 和 prototype 都会执行初始化方法回调

但仅 singleton 会执行销毁方法回调

为了方便看到 beanName,User类实现了 BeanNameAware 接口,并定义了 初始化 和 销毁方法,具体如下:

image-20230226103728447

我们仍然使用依赖注入集合的方式同时拿到 singleton 和 prototype 作用域中的 User bean,并将他们输出

image-20230226103332739

输出看看,可以看到 prototype bean 的销毁方法并没有被回调

image-20230226103707145

标签:singleton,作用域,spring,拿到,对象,Bean,prototype
From: https://www.cnblogs.com/acdongla/p/17156252.html

相关文章

  • Springboot 中 主模块引用其他模块的Controller url路径总是不生效
    Springboot中主模块引用其他模块的Controllerurl路径总是不生效其他无关影响:主要有springsecurity 有权限过滤器影响、还有token的影响。找问题方法:使用了对比两个......
  • Spring基于XML文件获取bean
    1.根据id获取beanUseruser=(User)applicationContext.getBean("user");2.根据类型获取beanUseruser=applicationContext.getBean(User.class);3.根据id和类......
  • springboot3.0整合GraalVM-Native-Support,打包本地exe(native-image)。添加native-maven
    0.【idea新建一个springbootdemo项目】勾选GraalVMNativeSupport。其它略(太基础了)1.【环境准备】安装GraalVM、VisualStudio、NativeImage​​https://gitee.com/lishu......
  • java Duration.parse(String str)格式,以及springboot@ConfigurationProperties对其完
    总结:图Duration.parse()只接受的格式基于ISO-8601持续时间格式PnDTnHnMn.nSspringboot@ConfigurationProperties支持更多的格式@Data@Component@ConfigurationProperties(......
  • 14_SpringMVC_其他注解
    ​ SpringMVC中注解完善1、@PostMapping作用:指定当前发送请求的方式只可以是post请求属性:  和@RequestMapping中属性一致代码实现@PostMapping("/userContr......
  • 14_SpringMVC_其他注解
    ​ SpringMVC中注解完善1、@PostMapping作用:指定当前发送请求的方式只可以是post请求属性:  和@RequestMapping中属性一致代码实现@PostMapping("/userContr......
  • 12_SpringMVC_拦截器
    ​ 在之前学习JAVAWEB的时候,我们学习了过滤器的知识。过滤器的作用是保护请求的服务器资源,在请求资源被执行之前,如果请求地址符合拦截范围,则会先执行过滤器。过滤器的执......
  • 12_SpringMVC_拦截器
    ​ 在之前学习JAVAWEB的时候,我们学习了过滤器的知识。过滤器的作用是保护请求的服务器资源,在请求资源被执行之前,如果请求地址符合拦截范围,则会先执行过滤器。过滤器的执......
  • 7_SpringMVC_响应处理
    ​ 在学习了SpringMVC的配置流程以及单元方法请求数据的获取后,我们可以使用SpringMVC搭建一个项目,在单元方法中使用SpringMVC提供的方式来获取请求信息,然后根据功能需求,......
  • 7_SpringMVC_响应处理
    ​ 在学习了SpringMVC的配置流程以及单元方法请求数据的获取后,我们可以使用SpringMVC搭建一个项目,在单元方法中使用SpringMVC提供的方式来获取请求信息,然后根据功能需求,......