我是 spring 初学者,ESP 控制反转。我很困惑理解以下之间的区别
<bean id="demo" class="Demo" lazy-init="false"/>
<bean id="demo" class="Demo" lazy-init="true"/>
<bean id="demo" class="Demo" lazy-init="default"/>
据我了解:lazy-init=false 在启动时创建 bean,lazy-init=true 不会在启动时创建 bean,而是根据特定 bean 的请求创建 bean。 如果我的解释有误,请纠正我。
lazy-init 的默认行为到底是什么?它会如何实例化?
默认行为为 false:
默认情况下,ApplicationContext 实现会急切地创建和 将所有单例 bean 配置为初始化过程的一部分。 一般来说,这种预实例化是可取的,因为错误在 立即发现配置或周围环境, 而不是几个小时甚至几天后。当这种行为不 如果需要,您可以通过以下方式防止单例 bean 的预实例化 将 bean 定义标记为延迟初始化。惰性初始化 bean 告诉 IoC 容器创建一个 bean 实例 第一次请求,而不是在启动时。
对于那些来到这里并使用 Java 配置的人,您可以使用如下注释将 Bean 设置为惰性初始化:
配置类中:
@Configuration
// @Lazy - For all Beans to load lazily
public class AppConf {
@Bean
@Lazy
public Demo demo() {
return new Demo();
}
}
用于元件扫描和自动接线:
@Component
@Lazy
public class Demo {
....
....
}
@Component
public class B {
@Autowired
@Lazy // If this is not here, Demo will still get eagerly instantiated to satisfy this request.
private Demo demo;
.......
}
bean
上的
lazy-init="default"
设置仅指由封闭的 beans元素的
default-lazy-init
属性设置的内容。 default-lazy-init
的隐式默认值为
false
。如果没有在 bean 上指定
lazy-init
属性,它总是会立即实例化。
如果lazy-init为true,那么当向bean发出请求时,该bean将被初始化。 spring容器初始化时,这个bean不会被初始化 和 如果lazy-init为false那么bean将通过spring容器初始化来初始化。
lazy-init="default" 作为 element 中的属性时,容器会选取 element 的 default-lazy-init="true|false" 属性指定的值并将其用作lazy-init =“真|假”。
如果元素中不存在default-lazy-init属性,则元素中的lazy-init =“default”将表现为lazy-init-“false”。