Spring Bean 上下文中存在许多未使用的 bean 是否会浪费大量资源?
题
我的模型层正被几个不同的项目使用,我想为模型使用单个 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 的单个实例。
取决于对象。
但是,未使用的代码是“粗糙的”,并且会增加维护成本。
最好删除引用和类。如果以后需要的话,您随时可以从版本控制中恢复。