【发布时间】:2011-01-06 06:40:57
【问题描述】:
Spring 执行 DI 并创建对象,因此您的程序无需担心创建对象。 但这里的问题是何时创建注入对象的实例。是在主程序使用实例时还是在创建主程序实例时。
【问题讨论】:
标签: java spring dependency-injection
Spring 执行 DI 并创建对象,因此您的程序无需担心创建对象。 但这里的问题是何时创建注入对象的实例。是在主程序使用实例时还是在创建主程序实例时。
【问题讨论】:
标签: java spring dependency-injection
在上下文启动时,上下文中的所有 bean 都会被实例化、注入和初始化。当从上下文中检索到第一个 bean 时,所有 bean 都可以使用了。
有两件事可以防止 bean 在上下文启动时被初始化:
scope="xyz" 属性配置了 different scope(例如 prototype、request 或 session)lazy-init="true",在这种情况下,它只会在明确要求它或需要它作为其他 bean 的依赖项时才会被实例化。【讨论】:
在评论中,OP 写道:
因此,由程序员决定是否需要延迟初始化或预先初始化 bean。这可能是非常主观的,但您能否告诉我在这种情况下遵循的任何最佳实践。
是的,由程序员(或系统集成商)决定。
实际上并没有任何“最佳实践”规则来决定。这样想:
如果你声明一个 bean 为延迟初始化,而它总是需要被实例化,你可能会使启动过程变慢。
如果在不总是需要 bean 时将 bean 声明为急切初始化,则会使启动过程变慢,并可能使用更多内存。在最坏的情况下,创建不必要的 bean 甚至可能导致启动失败。
简而言之,您需要了解您的应用程序。
【讨论】:
默认情况下,ApplicationContext 实现会在初始化过程中急切地创建和配置所有单例 bean。通常,这种预实例化是可取的,因为配置或周围环境中的错误会立即发现,而不是几小时甚至几天之后。当这种行为不可取时,您可以通过将 bean 定义标记为惰性初始化来防止单例 bean 的预实例化。延迟初始化的 bean 告诉 IoC 容器在第一次请求时创建一个 bean 实例,而不是在启动时。
【讨论】: