首页 > 解决方案 > 使用 @Lazy 时创建 Bean 和初始化 Bean 的区别

问题描述

Spring IOC 在启动时创建并初始化 bean。bean的创建和初始化有什么区别?

在使用@Lazy 时,据说@Lazy 注解的bean 会被延迟实例化。这是否意味着,将在 ApplicationContext 启动时创建 bean [就像其他未使用 @Lazy 注释的 bean 一样],并且仅在首次引用时进行初始化?

标签: spring

解决方案


@懒惰的

指示是否要延迟初始化 bean。可用于任何直接或间接使用@Component 注释的类或使用@Bean 注释的方法。

如果 @Component 或 @Bean 定义上不存在此注解,则会发生急切初始化。如果存在并设置为 true,则 @Bean 或 @Component 在被另一个 bean 引用或从封闭的 BeanFactory 显式检索之前不会被初始化。如果存在并设置为 false,则 bean 将在启动时由执行单例预初始化的 bean 工厂实例化。

如果 @Configuration 类上存在 Lazy,则表明该 @Configuration 中的所有 @Bean 方法都应该被延迟初始化。如果 @Lazy 在 @Lazy 注释的 @Configuration 类中的 @Bean 方法上存在且为 false,则表示覆盖了“默认惰性”行为并且应该急切地初始化 bean。

除了用于组件初始化之外,此注解还可以放置在标记为 Autowired 或 Inject 的注入点上:在这种情况下,它会导致为所有受影响的依赖项创建延迟解析代理,作为使用 ObjectFactory 的替代方法或提供者。


推荐阅读