【问题标题】:Different beans scope in spring?春季不同的豆类范围?
【发布时间】:2011-09-22 23:39:36
【问题描述】:

我对 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 概念与开创性中定义的单例模式有很大不同 四人帮 (GoF) 模式书。 GoF Singleton 对对象的范围进行硬编码,使得特定对象的一个​​且只有一个实例 每个 ClassLoader 都会创建一个类。 Spring 单例的范围最好按照容器和 bean 来描述。

我的问题是关于“Spring 单例的范围最好按照容器和每个 bean 来描述”

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

在一些网站上说,Spring 核心容器避免了对单例编程的需要。这是否意味着我们不必为单例容器编写代码 将为我们提供。正确的?这里的问题是如果我们在 bean 中声明公共构造函数。容器是否仍会为该 bean 提供单例(范围是该 bean 的 xml 文件中的单例)?

【问题讨论】:

    标签: spring


    【解决方案1】:

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

    正确。

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

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

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

    是的,没错。仅当您向容器请求 bean 并且只有一个容器定义该 bean 时,“单例”才会保留。

    在一些网站上说,Spring 核心容器避免了对单例编程的需要。这是否意味着我们不必为单例容器编写代码将为我们提供它。正确的?这里的问题是如果我们在 bean 中声明公共构造函数。容器是否仍会为该 bean 提供单例(范围是该 bean 的 xml 文件中的单例)?

    如果你只是简单的调用new MyBean(),当MyBean在Spring中被定义为一个bean,那么单例将不会被保留。 Spring 无法控制您在容器之外执行的操作。

    【讨论】:

    • 感谢 skaffman 的回复。只是想确认两件事:我们可以在给定应用程序中使用以下代码拥有两个核心容器吗? -- BeanFactory factory1 = new XmlBeanFactory("MyXml") , BeanFactory factory2 = new XmlBeanFactory("MyXml") 。第二点是即使我们在 bean 中声明公共构造函数,如果我们从核心容器中获取它,我们也会有单例实例。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多