春天的豆子范围不同?

M S*_*ach 4 spring

我在http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html中解释了3个范围,即请求,原型和单例,我感到有些困惑 .我的疑虑是: -

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

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

单身人士: - 根据4.4.1的规定编写.

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

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

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

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

ska*_*man 10

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

正确.

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

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

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

对,那是正确的.只要您向容器询问bean,并且只有一个容器定义该bean,就会保留"singleton".

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

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