-1

请回答以下问题。

1) bean 在哪里加载。它们会被加载到 Spring ApplicationContext 中吗?
或者它们由 ApplicationContext 加载到堆中。
2)在一个spring Web Application中,如果一天左右没有使用Application,ApplicationContext对象会被垃圾回收吗?

3)如何使单例线程安全?
4) Spring 中存在线程安全问题的其他对象是什么。
5) BeanPostProcessor 的方法为应用程序中的每个 bean 执行。
如果复杂应用程序中有数千个对象,它是如何处理的。
beanpostProcessors 线程安全吗?

4

1 回答 1

1

我认为您最好将这些问题分开 - 每个问题都值得一个专门的线程恕我直言。

  1. 在任何情况下,Spring 都会为您加载 bean。如何?它读取有关 bean 的元数据(基于 xml/注解),并将它们连接在一起。所以 spring 为你做了一个“新”,但是如何访问这个 bean?这里 ApplicationContext 发挥作用。它就像所有这些 bean 的容器,一个允许通过名称 (getBean("beanName") ) 访问 bean 实例的容器。在一种非常简单的方法中,您可以将应用程序上下文视为按名称映射的 bean。我并不完全理解这里的“堆”问题。Spring bean 只是存在于 JVM 中的 Java 对象,所以是的,基本上它们是在堆中加载的。唯一的区别是它们是由弹簧加载的,而不是由您的代码加载的。

  2. 应用程序上下文不会被垃圾收集,因为它存储在整个 Web 应用程序中(并且可以从中访问)。当然,如果这些应用程序上下文创建的 bean 不是单例或其他东西,它们可能会被垃圾收集。我知道这是一个模糊的答案,请随时完善您的问题。

  3. Singleton 在其核心架构中与线程安全无关。是的,spring 提供了一个“单例”bean 范围。这意味着每次执行 getBean 调用时都会得到相同的实例,因此它是一个单例(只要您仅在春季管理此 bean)。这个定义不会影响 bean 的设计,所以如果你,比如说,通过调用它的构造函数(new 关键字)来创建这个类的一个实例,你会得到一个完全不同的这个类型的对象,而不是由春天。了解 Spring 作为框架的责任从哪里开始以及何时结束很重要:) 所以如果你希望你的单例是线程安全的,你应该将它设计为线程安全的。最好是无状态的,但同样,它与弹簧无关,所以请在不同的线程中询问,

  4. 不是很明白这个问题,所以我不能回答,对不起:(

  5. 同样,bean 后处理器的线程安全性取决于实际编写的内容,即您的代码,而不是基础设施代码。

希望这可以帮助

于 2013-10-03T05:00:52.047 回答