Java Spring框架中bean作用域的原型实现
大家好,我正试图了解在春季国际奥委会中原型范围是如何工作的 对于我试图理解的原型bean:Java Spring框架中bean作用域的原型实现,java,spring,Java,Spring,大家好,我正试图了解在春季国际奥委会中原型范围是如何工作的 对于我试图理解的原型bean: 1.一遍又一遍地读这篇文章,但无法完全理解() 2.试图通过源代码进行调试,只了解一件事:如果我们不指定proxyMode,它将不会为原型bean创建代理。 3.原型范围的默认ScopedProxyMode为默认值,通常等于NO。。除非在组件扫描中配置 我这里有三个例子: 案例A:在未定义proxymode的情况下独立使用的原型bean(不具有任何依赖项或不是任何bean的依赖项) 案例B:单例bean中
1.一遍又一遍地读这篇文章,但无法完全理解() 2.试图通过源代码进行调试,只了解一件事:如果我们不指定proxyMode,它将不会为原型bean创建代理。
3.原型范围的默认
ScopedProxyMode
为默认值,通常等于NO。。除非在组件扫描中配置
我这里有三个例子:
案例A:在未定义proxymode的情况下独立使用的原型bean(不具有任何依赖项或不是任何bean的依赖项)
案例B:单例bean中的原型bean作为未定义proxymode的依赖项
案例C:单例bean中的原型bean作为proxymode定义的依赖关系
这里的问题是:
- A、 B和C都将在请求时返回Employee的新实例李>
- A和B是使用原型作用域的常用方法李>
- 不指定是通常的方式。虽然在某些情况下,作用域是RequestScope或sessionscope等,但指定proxyMode可能是有意义的。关于指定代理模式,请参见最后一段李>
- 如果未设置,则获得预期的行为。也就是说,每次请求bean实例时都会得到新实例李>
您应该考虑在下面的场景中使用原型范围:
- 如果您有一个具有大量可写状态的bean,那么您可能会发现同步的成本大于创建一个新实例来处理来自依赖对象的每个请求的成本
- 一些依赖对象需要一个具有私有状态的bean,以便它们可以与依赖该bean的其他对象分开进行处理。在这种情况下,单身显然是不合适的。考虑原型。<李>
proxyMode=ScopedProxyMode.TARGET\u CLASS
,您就强制Spring使用CGLIB代理机制。最后,仅仅提供@Scope(“prototype”)
就足够了
另一方面,要知道,如果有任何方法钩住bean的生命周期(比如@PreDestroy
,实现DisposableBean
接口,或者destromethod
作为@bean
中的标志),那么这些方法将永远不会在原型范围的bean中调用
@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();
}