当前位置: 首页 > 知识库问答 >
问题:

Spring框架中原型bean作用域的实现

卢俭
2023-03-14

大家好,我想了解Spring IOC中原型作用域的工作原理。

对于原型bean,我试图通过:
1来理解。读了一遍又一遍,但不能完全理解(https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-scopes-other-injection)
2。试着通过源代码调试,只明白了一件事,如果我们不指定proxyMode,它就不会为原型bean创建代理。
3。原型作用域的默认scopedproxymode为default,通常等于no。除非在组件扫描中配置。

@Bean
@Scope("prototype")
public Employee employee(){
  return new Employee();
}
@Bean
@Scope("prototype")
public Employee employee(){
  return new Employee();
}

@Bean
@Scope("singleton")
public Department department(){
  return new Department();
}
@Bean
@Scope("prototype",proxyMode= ScopedProxyMode.TARGET_CLASS)
public Employee employee(){
  return new Employee();
}

@Bean
@Scope("singleton")
public Department department(){
  return new Department();
}
  1. 案例A、案例B和案例C将如何工作?
  2. 我正在尝试了解什么才是正确的方法。
  3. 同时未指定proxymode是否正确?
  4. 未设置proxyMode时会发生什么?那么原型是如何工作的?

我在internet上的实现示例中通常看到的情况是,人们经常没有配置proxyMode,要么是错误的,要么是不知道这个选项,或者可能他们是正确的。

谢谢你宝贵的时间。

共有1个答案

艾嘉石
2023-03-14
  • A、B和C都将在请求时返回Employee的新实例。
  • A和B是使用原型作用域的常用方法。
  • 不指定是通常的方法。尽管在某些情况下,范围是RequestScope或Session scope等,但指定ProxyMode可能是有意义的。关于指定proxyMode,请参见最后一段。
  • 如果未设置,则会得到预期的行为。也就是说,每次请求bean实例时,您都会获得新实例。

prototype作用域指示Spring在应用程序每次请求bean实例时实例化bean的一个新实例。

您应该考虑在以下场景中使用原型作用域:

    null

您的bean应该实现一些接口,这是一个很好的实践。在这种情况下,Spring使用JDK代理机制来创建类的代理。但实现接口不是一个要求。如果bean没有实现接口,那么Spring使用CGLIB库来创建bean的代理(除非用@configuration注释类,在这种情况下使用不同的代理机制)。

通过指定proxymode=scopedproxymode.target_class,您正在强制Spring使用CGLIB代理机制。最后,只要提供@scope(“prototype”)就足够了。

另外要注意的是,如果您有任何方法与bean的生命周期挂钩(如@predestroy,实现disposablebean接口,或destroymethod作为@bean中的标志),那么在原型范围的bean中永远不会调用这些方法。

 类似资料:
  • beanA实例与预期的一样,具有相同的哈希。但是,为什么在这种情况下,尽管beanB哈希值不同,但一个bean的两个实例之间的equals和==仍然返回true?

  • 假设有两个类ClassA和ClassB。假设ClassB依赖于ClassA。在配置文件中,如果我们将ClassA的作用域定义为singleton,而将ClassB的作用域定义为Prototype,那么每次创建ClassA的bean实例时ClassB的实例会发生什么?每次返回ClassA实例时,会返回相同的ClassB实例还是创建新实例? 谢谢!!!

  • 问题内容: 我试图将一个bean 注入一个bean中,以便对单例bean方法的每个新调用都具有原型bean的新实例。 考虑如下的单例豆: 我希望每次调用该方法时,都会使用一个新实例。 下面是原型bean: 似乎正在发生的事情是,Spring急于在该方法中交付PrototypeBean的新实例。也就是说,该方法中的两行代码将在每一行中创建一个prototypeBean的新实例。 因此,在第二行中,输

  • 我有一个Spring应用程序,我正在使用Vaadin编写Web UI。为此,我使用Spring Vaadin集成工具。 所以我扩展了Vaadin类来定制和使用它们。例如,我有一个主UI类,它是一个原型。(应为用户打开的每个浏览器窗口实例化一个新窗口。) 这导入了我的GameMapView,它也是一个原型组件,并扩展了VerticalLayout,然后我有了一个GameMap原型组件,它扩展了Gri

  • 问题内容: 我是spring框架的新手,从一些教程开始学习它。 我有以下文件, #MainProgram.java #HelloSpring.java #Bean.xml 当我把 我的输出是: 当我把 我的输出是: 方法是用作用域bean 调用的,但不能 在以下方面为我提供帮助, 这样对吗?如果是这样,可能是什么原因? 我也有一些疑问, 之间的区别或关系是什么 问题答案: 用singleton范围

  • 主要内容:singleton,prototype默认情况下,所有的 Spring Bean 都是单例的,也就是说在整个 Spring 应用中, Bean 的实例只有一个。 我们可以在 <bean> 元素中添加 scope 属性来配置 Spring Bean 的作用范围。例如,如果每次获取 Bean 时,都需要一个新的 Bean 实例,那么应该将 Bean 的 scope 属性定义为 prototype,如果 Spring 需要每次都返回一个相同