8

我的模型层被少数不同的项目使用,我想为模型使用单个 XML Spring 配置文件,无论哪个项目正在使用它。

我的问题是:由于并非所有项目都使用了所有 bean,如果没有实例化,我是否会浪费大量资源?我不太确定 Spring 加载它们有多懒惰,因为直到现在它才成为问题。

有任何想法吗?

4

4 回答 4

8

取自Spring 参考手册

ApplicationContext 实现的默认行为是在启动时急切地预实例化所有单例 bean。预实例化意味着 ApplicationContext 将急切地创建和配置其所有单例 bean,作为其初始化过程的一部分。通常这是一件好事,因为这意味着配置或周围环境中的任何错误都会立即被发现(而不是可能的数小时甚至数天)。

但是,有时这种行为不是我们想要的。如果您不希望在使用 ApplicationContext 时预先实例化单例 bean,则可以通过将 bean 定义标记为延迟初始化来选择性地控制它。延迟初始化的 bean 向 IoC 容器指示是否应在启动时或首次请求时创建 bean 实例。

通过 XML 配置 bean 时,这种延迟加载由 [bean 元素] 上的 'lazy-init' 属性控制;例如:

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>

但是,除非您的 bean 正在使用文件锁或数据库连接之类的资源,否则如果您更容易为多个(但不同的)配置文件进行这种配置,我不会太担心简单的内存开销。

于 2008-09-19T01:08:13.717 回答
5

In addition to the other comments: it's also possible to specify a whole configuration file to be lazily initialized, by using the 'default-lazy-init' attribute on the <beans/> element; for example:

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

This is much easier than adding the lazy-init attribute to every bean, if you have a lot of them.

于 2008-09-29T19:18:22.480 回答
0

默认情况下,Spring bean 是单例的,并且在创建应用程序上下文时(在启动时)被实例化。因此,假设您没有覆盖默认行为,那么将创建每个 bean 的单个实例。

于 2008-09-19T00:51:39.933 回答
-1

取决于对象。

但是,未使用的代码是“粗糙的”,会增加维护成本。

最好删除 refs 和 classes。如果以后需要,您始终可以从版本控制中恢复。

于 2008-09-19T00:58:31.417 回答