春天的豆子范围不同?

时间:2011-06-26 13:54:38

标签: spring

我在3个范围之间有点困惑,即请求,原型和单身人士解释 http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html。我的怀疑是: -

RequestScope: - 来自客户端的Web请求,在同一个请求中,我们使用语句factory.getBean(“MyBean1”)创建bean 它会返回两个不同的实例。我的理解是它将返回与在同一http请求下完成的相同的实例。对?虽然它将返回两个不同的 原型请求时的实例。正确的吗?

原型: - 每次发出对该特定bean的请求时,它都会导致创建一个新的bean实例。 根据经验,您应该将原型范围用于所有有状态的bean,而单例范围应该用于无状态bean。 为什么它与请求范围以及它对有状态bean的支持有何不同。

Singleton: - 根据4.4.1。

部分编写
  

请注意,Spring的单例bean概念与开创性定义的Singleton模式完全不同   Gang of Four(GoF)模式书。 GoF Singleton硬编码对象的范围,使得特定的一个且仅一个实例   将根据ClassLoader创建类。 Spring单例的范围最好按容器和每个bean描述。

我的问题在于声明“Spring单例的范围最好按容器和每个bean描述”

每个容器: - 我们在任何应用程序中都有多个核心容器吗?我的理解是 如果我们在应用程序中两次创建BeanFactory factory = new XmlBeanFactory(“MyXml”),我们可以说存在两个容器实例。对吗? 在这种情况下,即使声明为singleton,我们也可以使用两个bean实例。这是对的吗?

在某些网站上声明,Spring核心容器可以避免对单例进行编程。这里他们的意思是我们没有代码单身容器 将为我们提供。对?这里的问题是如果我们在bean中声明公共构造函数。容器是否仍然为该bean提供单例(范围是此bean的xml文件中的单例)?

1 个答案:

答案 0 :(得分:10)

  

RequestScope: - 来自客户端的Web请求,在同一个请求中,我们使用语句factory.getBean(“MyBean1”)创建bean,它将返回两个不同的实例。我的理解是它将返回与在同一http请求下完成的相同的实例。对?虽然它会在原型请求的情况下返回两个不同的实例。正确的吗?

正确。

  

原型: - 每次发出对该特定bean的请求时,它都会导致创建一个新的bean实例。根据经验,您应该将原型范围用于所有有状态的bean,而单例范围应该用于无状态bean。为什么它与请求范围以及它对有状态bean的支持有何不同。

所有范围都支持有状态bean,只需要在管理该状态时要非常小心。您需要仔细考虑决定该州的范围。状态是当前请求的本地状态,还是调用getBean的方法的本地状态?各种范围如何处理有状态bean没有区别。

  

每个容器: - 我们在任何应用程序中都有多个核心容器吗?我的理解是,如果我们在应用程序中两次创建BeanFactory factory = new XmlBeanFactory(“MyXml”),我们可以说存在两个容器实例。对吗?在这种情况下,即使声明为singleton,我们也可以使用两个bean实例。这是对的吗?

是的,这是正确的。只要您向容器询问bean,并且只有一个容器定义该bean,就会保留“singleton”。

  

在某些网站上声明,Spring核心容器可以避免对单例进行编程。这里他们的意思是我们没有单独容器的代码将为我们提供它。对?这里的问题是如果我们在bean中声明公共构造函数。容器是否仍然为该bean提供单例(范围是该bean的xml文件中的单例)?

如果只是调用new MyBean(),当在Spring中将MyBean定义为bean时,则不会保留单例。 Spring无法控制你在容器外面做的事情。