大家好,我想了解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();
}
我在internet上的实现示例中通常看到的情况是,人们经常没有配置proxyMode,要么是错误的,要么是不知道这个选项,或者可能他们是正确的。
谢谢你宝贵的时间。
prototype作用域指示Spring在应用程序每次请求bean实例时实例化bean的一个新实例。
您应该考虑在以下场景中使用原型作用域:
您的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 需要每次都返回一个相同