Spring Bean 上下文中存在许多未使用的 bean 是否会浪费大量资源?

StackOverflow https://stackoverflow.com/questions/98320

  •  01-07-2019
  •  | 
  •  

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

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

有任何想法吗?

有帮助吗?

解决方案

取自 弹簧参考手册:

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

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

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

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

但是,除非您的 Bean 耗尽了文件锁或数据库连接等资源,否则如果您更容易为多个(但不同的)配置文件进行这一配置,那么我不会太担心简单的内存开销。

其他提示

除了其他评论之外:还可以通过使用 'default-lazy-init' 属性来指定要延迟初始化的整个配置文件 <beans/> 元素;例如:

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

这比添加要容易得多 lazy-init 归因于每一个豆子,如果你有很多豆子的话。

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

取决于对象。

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

最好删除引用和类。如果以后需要的话,您随时可以从版本控制中恢复。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top