spring什么情况下使用多例bean,springboot bean 单例

  spring什么情况下使用多例bean,springboot bean 单例

  00-1010 bean的单实例和多实例使用实战演示Spring单实例bean和prototype bean的区别以及创建过程singletonScope和prototypeScope

  00-1010在Spring中,bean可以定义为两种模式:原型(多实例)和单例(单实例)

  Singleton(单例):只存在一个共享实例,对这个bean的所有请求都将返回这个唯一的实例。原型(多实例):对这个bean的每个请求都将创建一个新的bean实例,类似于new。默认情况下,Spring bean是单例模式。

  00-1010在配置文件中,将此代码修改为:

  在测试类中,将代码修改为:

  bean id= hi class= com . test . hi init-method= init scope= singleton application context context=new file systemxmlaplicationcontext( application context . XML );Hi hi1=(Hi)context . get bean( Hi );Hi hi2=(Hi)context . get bean( Hi );system . out . println(hi1);system . out . println(hi2);结果是:

  结论:两个变量指向一个对象。

  将配置文件更改为:

  bean id= hi class= com . test . hi init-method= init scope= prototype 其他都一样,运行测试类,结果是:

  结论:每次访问bean时,都会创建一个新的实例。

  此外,如果您想要在springBoot项目中配置一个或多个实例,您可以向相应的bean添加一个@scope()注释。

  00-1010 Spring官方文档中给出了五种bean作用域。

  SingonPrototype RequestSession全局会话实际上,Spring只有两个基本范围,即singleton和Prototype。

  可以参考spring源代码中BeanDefinition.java的定义。只有两种:

  string SCOPE _ SINGLETON=configurable bean factory。SCOPE _ SINGLETONstring SCOPE _ PROTOTYPE=configurable beanfactory。范围_原型;的其他范围是自扩展的。包括servletContenxt和thread官方网站文件中未列出的内容;SpringCloud等提供的刷新。

  其继承关系大致如下

  

目录

singletonScope,即singleton Bean,顾名思义,具有singleton模式的所有特征。只有一个bean实例将在spring容器中初始化并存储在缓存中。所有后续请求共享该对象。

 

  创建单例bean最简单的方法是直接在类名中添加@Service注释。

  PrototypeScope,即prototype Bean,每次被请求时都会创建一个新的Bean实例供直接使用。

  要创建原型Bean,您需要显示指定的scope属性。

  可以参考《春天的AbstractBeanFactory.java》中的doGetBean方法,了解两种豆的使用过程。

  单例bean的创建

  单实例bean存储在这样的映射中:

  singletonObjects的缓存: bean name-bean instance */private final MapString,Object singleton objects=new concurrent hashmapstring,Object(256);上面代码中的getSingleton方法用于根据beanName从map(singletonObjects)中获取bean。

  如果得不到,调用singletonFactory的createBean方法创建一个singleton bean(这里的createBean是一个抽象方法,具体实现交给各种作用域的实现类)。

  创建成功后,将其存储在singletonObjects中并返回引用。

  原型bean的创建

  挺满意的。上来就直接创建,然后分为befoew、createBean、after三个生命周期,为具体实现提供全面支持。

  至于最后一句getObjectForBeanInstance,如果上面创建了一个普通bean,会直接返回;如果创建了BeanFactory的实例,则使用工厂实例创建一个新的bean,然后返回。

  对于其他扩展出来的scope

  接口Scope.java中定义的这个方法将用于调用每个扩展范围的实现来创建一个bean:

  //从基础作用域返回给定名称的对象,Object get(String name,ObjectFactory?object factory);以上个人经验,希望能给大家一个参考,也希望大家能支持盛行的IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: