首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在一次方法调用中只获取一个原型bean?

在一次方法调用中只获取一个原型bean,可以通过Spring框架的ObjectFactoryObjectProvider来实现。

  1. 使用ObjectFactory
    • ObjectFactory是Spring框架提供的一个接口,用于获取原型bean的实例。
    • 在需要获取原型bean的地方,可以通过注入ObjectFactory来获取实例。
    • 调用ObjectFactorygetObject()方法可以获取原型bean的实例。

示例代码:

代码语言:java
复制

@Autowired

private ObjectFactory<PrototypeBean> prototypeBeanFactory;

public void someMethod() {

代码语言:txt
复制
   PrototypeBean prototypeBean = prototypeBeanFactory.getObject();
代码语言:txt
复制
   // 使用原型bean实例

}

代码语言:txt
复制
  1. 使用ObjectProvider
    • ObjectProvider是Spring框架提供的另一个接口,也可以用于获取原型bean的实例。
    • 在需要获取原型bean的地方,可以通过注入ObjectProvider来获取实例。
    • 调用ObjectProvidergetIfAvailable()方法可以获取原型bean的实例。

示例代码:

代码语言:java
复制

@Autowired

private ObjectProvider<PrototypeBean> prototypeBeanProvider;

public void someMethod() {

代码语言:txt
复制
   PrototypeBean prototypeBean = prototypeBeanProvider.getIfAvailable();
代码语言:txt
复制
   // 使用原型bean实例

}

代码语言:txt
复制

以上两种方式都可以在一次方法调用中只获取一个原型bean的实例。需要注意的是,每次调用getObject()getIfAvailable()方法都会返回一个新的原型bean实例。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring 的 Bean 明明设置了 Scope 为 Prototype,为什么还是只能获取到单例对象?

Spring 作为当下最火热的Java 框架,相信很多小伙伴都在使用,对于 Spring Bean 我们都知道默认是单例的,意思是说在整个 Spring 容器里面存在一个实例,在需要的地方直接通过依赖注入或者从容器中直接获取...测试原型 对于有些场景,我们可能需要对应的 Bean原型的,所谓原型就是希望每次在使用的时候获取到的是一个新的对象实例,而不是单例的,这种情况下很多小伙伴肯定会说,那还不简单,只要在对应的类上面加上...Spring 注入依赖的赋值逻辑简单来说就是创建 Bean 的时候如果发现有依赖注入,则会在容器获取或者创建一个依赖 Bean,此时对应属性的 Bean 是单例的,则容器只会创建一个,如果对应的 Bean...Bean 实例,而是通过 Lookup 的注解,让容器来帮我们覆盖对应的方法,返回一个原型实例对象。... [abstract] theMethodName(no-arguments); 总结 今天阿粉通过几个例子,给大家介绍了一下如何在单例类获取原型类的实例

75040

一道78%的Java程序员搞不清的Spring bean面试题

Spring官方文档介绍如下图: 单例bean原型bean的区别 如果一个bean被声明为单例的时候,在处理多次请求的时候在Spring容器里实例化出一个bean,后续的请求都公用这个对象,这个对象会保存在一个...1.画图分析 2.源码分析 生成bean时先判断单例的还是原型的 如果是单例的则先尝试从缓存里获取,没有在新创建 结论: 单例的bean只有第一次创建新的bean 后面都会复用该bean,所以不会频繁创建对象...2.减少jvm垃圾回收 由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。 3.可以快速获取bean 因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快。...,由于所有请求都共享一个bean实例,所以这个bean要是有状态的一个bean的话可能在并发场景下出现问题,而原型bean则不会有这样问题(但也有例外,比如他被单例bean依赖),因为给每个请求都新创建实例...13 、Spring 框架的单例 Beans 是线程安全的么? 14 、请举例说明如何在 Spring 中注入一个 Java Collection ?

36500

Spring5源码解析-IOC之Scope作用域 一文让你了解bean的作用域scope的底层实现

,使得程序可以在单例创建的前后做一些准备及处理操作,而真正的获取单例bean方法其实并不是在此方法实现的。...通过调用参数传入的ObjectFactory的个体Object方法实例化Bean 加载单例Bean后的处理方法调用。...registeredSingletons 已经注册的单例缓存; 加载完了单例bean后,调用getObjectsForBeanInstance()从bean实例获取对象,方法也可以看一下上一篇文章:...过程如下: 调用beforeSingletonCreation()记录加载原型模式bean之前的加载状态,即前置处理 调用createBean()创建一个bean实例对象 调用afterSingletonCreation...()进行加载原型模式bean后的后置处理 调用getObjectForBeanInstance()从bean实例获取对象 其它作用域 // 从指定的 scope 模式下创建 Bean else {

15010

从自定义一个作用域开始来了解SpringBean的作用域

单例 bean 里面注入了原型 bean当单例 Bean 中注入原型(Prototype)Bean 时,会出现一个问题:单例 Bean 在整个应用生命周期中创建一次。...而原型 Bean 本应每次请求时创建新实例。但直接注入到单例 Bean 时,实际上只会注入一次原型 Bean 的实例。后续对该原型 Bean 的使用都将复用首次注入的同一个实例,这可能并不符合预期。...,非常适合在单例 Bean 按需获取原型 Bean 的新实例。...,非常适合在单例 Bean 按需获取原型 Bean 的新实例。...解决办法2: 可以通过定义一个工厂方法来创建原型 Bean 的实例,然后在单例 Bean 中注入这个工厂方法,每次需要时调用工厂方法获取新实例。

7710

【死磕 Spring】----- IOC 之开启 bean 的加载

doGetBean() 方法,其接受四个参数: name:要获取 bean 的名字 requiredType:要获取 bean 的类型 args:创建 bean 时传递的参数。..., name, beanName, null); } 我们知道单例模式的 bean 在整个过程只会被创建一次,第一次创建后会将该 bean 加载到缓存,后面在获取 bean 就会直接从单例缓存获取...如果从缓存得到了 bean,则需要调用 getObjectForBeanInstance() 对 bean 进行实例化处理,因为缓存记录的是最原始的 bean 状态,我们得到的不一定是我们最终想要的...类型转换 在调用 doGetBean() 方法时,有一个 requiredType 参数,该参数的功能就是将返回的 bean 转换为 requiredType 类型。...拆分主要是分为三个部分: 分析从缓存获取单例 bean,以及对 bean 的实例获取对象 如果从单例缓存获取 bean,Spring 是怎么加载的呢?

65420

Spring Ioc 之 Bean的加载(二)

在上篇文章Spring Ioc 之 Bean的加载(一),我们分析了Spring IocBean的加载 doGetBean() 方法的2.2从缓存获取单例bean和2.3获取最终的bean实例对象两个步骤.... // 因为 Spring 解决单例模式下的循环依赖,在原型模式下如果存在循环依赖则会抛出异常。...见2.2从缓存获取单例bean 处: 具体分析,见2.3获取最终的bean实例对象 处: 具体分析,见2.4原型模式依赖检查(Prototype)和从 parentBeanFactory...、通过我们前面从IoC容器拿到的BeanDefinition,调用mbd.getDependsOn()方法获取当前bean所有的依赖。...()); } } return (T) bean; requiredType是 getBean() 方法可传入的一个参数,即可以根据指定的 beanName 和 requiredType 来获取Bean

85150

逐行阅读Spring5.X源码(十)spring如何解决循环引用,bean实例化过程源码详解

spring 在初始化bean的过程中去判断一下这个bean是否被注册了这么简单;笔者认为这个方法最主要的作用是为了从容器得到一个bean,也就是说当我们在spring代码调用getBean(“a”...add,所以这里肯定不会存在,即使后面过程add到这个集合了,但是创建完成之后也会remove掉,故而下一次实例化同一个原型bean原型可以实例化无数次)的时候当代码执行到这里也不可能存在集合当中了...因为我们上面说过第一次调用getSingleton是从单例池当中获取一个bean,但是x显然没有完成生命周期(x走到了填充y,还有很多生命周期没走完),所以应该是获取不到的?...,故而返回nll;进入下一个if分支,从二级缓存获取一个ObjectFactory工厂对象;根据前面分析,二级缓存存在x,故而可以获取到;跟着调用singletonFactory.getObject...();拿到一个半成品的x bean对象;然后把这个x对象放到三级缓存,同时把二级缓存x清除(此时二级缓存存在一个y了,而三级缓存多了一个x); 问题1、为什么首先是从三级缓存取呢?

75230

1.作用域

getUser 方法,就会发现此时的用户名为 A 类修改的“MySQL”,而非原来的“Java”,这就说明 Bean 对象 user 默认就是单例的作用域。...如果有任何地方修改了这个单例对象,那么其他类再调用就会得到一个修改后的值。...描述:该作用域下的 Bean 在 IoC 容器存在一个实例:获取 Bean(即通过 applicationContext.getBean等方法获取)及装配 Bean(即通过 @Autowired 注入...描述:每次对该作用域下的 Bean 的请求都会创建新的实例:获取 Bean(即通过 applicationContext.getBean 等方法获取)及装配 Bean(即通过 @Autowired 注入...描述:在一个 Http Session ,定义一个 Bean 实例。 场景:用户会话的共享 Bean, 比如:记录一个用户的登陆信息。

26710

别再找了,这就是全网最全的SpringBean的作用域管理!

也就是说,该Bean被注入到另一个Bean,或者您可以通过容器上的getBean()方法调用来请求它。通常,应将原型作用域用于所有有状态Bean,将单例作用域用于无状态Bean。...,这时候,只有在第一次获取bean时才会初始化bean,即第一次请求该bean时才初始化。...prototype 作用域的 bean 会导致在每次对该 bean 请求(将其注入到另一个 bean ,或者以程序的方式调用容器的 getBean() 方法)时都会创建一个新的 bean 实例。...也就是说,初始化生命周期回调方法在所有作用域的Bean是都会调用的,但是销毁生命周期回调方法原型Bean是不会调用的 所以,客户端代码必须注意清理原型Bean以及释放原型Bean所持有的一些资源。...Bean的时候,就会解析以及注入它所需的依赖 如果实在需要每次都请求一个新的实例,可以通过bean工厂手动获取实例,也可以参考Dependencies方法注入部分。

52130

别再找了,这就是全网最全的SpringBean的作用域管理!

也就是说,该Bean被注入到另一个Bean,或者您可以通过容器上的getBean()方法调用来请求它。通常,应将原型作用域用于所有有状态Bean,将单例作用域用于无状态Bean。...,这时候,只有在第一次获取bean时才会初始化bean,即第一次请求该bean时才初始化。...prototype 作用域的 bean 会导致在每次对该 bean 请求(将其注入到另一个 bean ,或者以程序的方式调用容器的 getBean() 方法)时都会创建一个新的 bean 实例。...也就是说,初始化生命周期回调方法在所有作用域的Bean是都会调用的,但是销毁生命周期回调方法原型Bean是不会调用的 所以,客户端代码必须注意清理原型Bean以及释放原型Bean所持有的一些资源。...Bean的时候,就会解析以及注入它所需的依赖 如果实在需要每次都请求一个新的实例,可以通过bean工厂手动获取实例,也可以参考Dependencies方法注入部分。

63810

Spring Ioc 之 Bean的加载(一)

在完成 bean 的注册之后, refresh() 还调用了很多后处理器的方法,其中有一个方法 finishBeanFactoryInitialization(),注释上面写着 Instantiateall.... // 因为 Spring 解决单例模式下的循环依赖,在原型模式下如果存在循环依赖则会抛出异常。...B,别名 B 指向名称为 C 的 bean,则返回 C 2.2、从缓存获取单例bean Spring 对单例模式的 bean 只会创建一次。...= new HashMap(16); //对于单例模式的Bean整个IOC容器创建一次,不需要重复创建 @Nullable protected Object getSingleton(String...为什么这里要再获取一次Bean呢,之前明明都拿到了呀? 因为我们从缓存获取bean 是最原始的 Bean ,并不一定是我们最终想要的 Bean 怎么办呢?

78720

Spring Boot线程安全指南

它们的生命周期比请求作用域bean长。多个请求可以同时调用一个会话bean。 prototype Bean 我把原型范围作为最后讨论的范围,因为我们无法清楚地说它始终是线程安全的。...(类似new object一样调用一次创建一次); 想象一下,你的应用程序中有两个bean一个是单例Bean,第二个是请求作用域的bean。两者都依赖于第三个原型bean。...让我们先考虑单例bean:因为单例不是线程安全的,所以对其原型方法调用也可以同时运行。当多个线程共享单例时,Spring注入该单例的原型的单个实例也将被共享。...但是更复杂的对象Collection,Map或自定义数据类呢? 对于像集合这样的常见类型,您可以使用标准Java库可以找到的不可变实现。您可以使用Java 9添加的工厂方法轻松创建不可变集合。...您还可以在Collections类中找到转换方法unmodifiableList()。 如果涉及自定义数据类型,则必须确保它们是不可变的。在Java创建不可变类超出了本文的范围。

1.7K20

【09】Spring源码-分析篇-DI源码分析

如何确定构造方法   在Spring中生成Bean实例的时候默认是调用对应的无参构造方法来处理。...,此处相当于一个回调方法,利用回调方法来创建bean Supplier<?...得根据参数个数、类型确定需要调用的构造器 // 在使用构造器创建实例后,Spring会将解析过后确定下来的构造器或工厂方法保存在缓存,避免再次创建相同bean时再次解析 // Shortcut...// 从bean后置处理器为自动装配寻找构造方法, 有且仅有一个有参构造或者有且仅有@Autowired注解构造 Constructor<?...PropertyValue对象的容器,通常包括针对特定目标Bean一次更新 //如果mdb有PropertyValues就获取其PropertyValues PropertyValues pvs

1.1K20

Spring @Lookup实现单例bean依赖注入原型bean

bean B,直接在A定义一个属性与bean B类型一样,然后通过setter方法注入或者构造函数参数注入即可.但是当bean的生命周期不一样就会有问题。...比如一个单例bean A需要使用一个非单例(原型bean B,A每次方法调用都需要一个新的bean B.容器创建单例bean一次,这样只有一次机会设置这个值.容器不能给bean A提供一个新的bean...B的时候通过调用getBean("B")向容器请求一个新的bean B实例 * 另外一种方法是使用`@Lookup`注解 考虑一下这个场景:假如我们有大量的消息需要推送,为了提高性能,我们会使用一个任务池去实现...,每个需要推送的消息就是一个任务.从这个业务场景,我们至少可以提取几个bean一个是实现推送(阿里云移动推送,苹果apns等)的单例bean,发送消息任务原型bean,推送组件(任务池)单例bean...获取原型bean package com.simos.service; import org.apache.tomcat.util.threads.TaskQueue; import org.apache.tomcat.util.threads.TaskThreadFactory

1K10

【设计模式】-创建型模式-第2章第1讲-【单例模式】

,因此对象需要被公用的场合适合使用,多个模块使用同一个数据源连接对象等等。...1.5、无锁的线程安全单例模式 Java 单例模式的最佳实现形式,类只会加载一次,通过在声明时直接实例化静态成员属性的方式来保证一个类只有一个实例。...从缓存获取单例 BeanBean 的实例获取对象。...因此,第一次调用 doGetBean() 的时候,getSingleton() 基本上都是返回 null,所以会继续执行 doGetBean() 方法后面的逻辑。...当从缓存中加载单例对象时,会把当前的单例对象在singletonObjects 存放一份,这样可以保证在调用 getBean() 方法的时候,singletonObjects 永远只有一个实例,在获取对象时才会给它分配内存

23620

Spring面试复习整理

@After - 后置通知:在连接点方法调用。 @AfterReturning - 返回通知:在连接点方法执行并正常返回后调用,要求连接点方法在执行过程没有发生异常。...@Component作用于类,@Bean注解作用于方法。 Springbean的作用域有几种类型?...singleton:默认,每个容器只有一个bean的实例,单例的模式由BeanFactory自身来维护。 prototype:为每一个bean请求提供一个实例。...如何在 Spring 操作数据库 可以使用 Spring 提供的 JdbcTemplate 对象,JdbcTemplate 类提供了很多便利的方法比如是数据库数据转变成基本数据类型或对象,执行自定义的...Spring Bean 默认就是单例模式,并非是安全的, 要想保住 Bean 安全的举措就是设置 Bean 的作用域 Prototype(原型模式),每次请求都新建一个 Bean

56000

Spring_总结_04_高级配置(四)_bean的作用域

一次执行的时候,能正常执行;第二次执行的时候,却报js定义的一个对象已存在。      ...这就是因为在第二次执行的时候,单例的脚本引擎已经包含了第一次执行时的状态,即第一次执行之后,js的对象已存在于脚本引擎,因此导致第二次执行时出现重复定义的错误。...1 单例(Singleton) 在整个应用创建bean一个实例 2 原型(Prototype) 每次注入或者通过Spring应用上下文获取的时候,都会一个新的bean实例。...假设,我们要将ShoppingCart bean 注入到单例 StoreService bean的 Setter方法,如下所示: @Coponent public class StoreService...当StoreService调用ShoppingCart的方法时,代理会对其进行懒解析并将调用委托给会话作用域内真正的ShoppingCart bean

42220
领券