我的模型层被少数不同的项目使用,我想为模型使用单个 XML Spring 配置文件,无论哪个项目正在使用它。
我的问题是:由于并非所有项目都使用了所有 bean,如果没有实例化,我是否会浪费大量资源?我不太确定 Spring 加载它们有多懒惰,因为直到现在它才成为问题。
有任何想法吗?
取自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 正在使用文件锁或数据库连接之类的资源,否则如果您更容易为多个(但不同的)配置文件进行这种配置,我不会太担心简单的内存开销。
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.
默认情况下,Spring bean 是单例的,并且在创建应用程序上下文时(在启动时)被实例化。因此,假设您没有覆盖默认行为,那么将创建每个 bean 的单个实例。
取决于对象。
但是,未使用的代码是“粗糙的”,会增加维护成本。
最好删除 refs 和 classes。如果以后需要,您始终可以从版本控制中恢复。