我是春天的初学者,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的默认行为究竟是什么?它将如何实例化?
答案 0 :(得分:62)
默认行为为false:
默认情况下,ApplicationContext实现急切地创建和 将所有单例bean配置为初始化过程的一部分。 通常,这种预先实例化是可取的,因为错误 立即发现配置或周围环境, 而不是几小时甚至几天。当这种行为不是 希望,你可以防止单例bean的预实例化 将bean定义标记为延迟初始化。一个懒惰的初始化 bean告诉IoC容器创建一个bean实例 首先要求,而不是在启动时。
答案 1 :(得分:22)
对于那些来到这里并使用Java配置的人,您可以使用以下注释将Bean设置为lazy-init:
在配置类中:
@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;
.......
}
答案 2 :(得分:21)
bean 上的lazy-init="default"
设置仅指包含 beans 元素的default-lazy-init
属性设置的内容。 default-lazy-init
的隐式默认值为false
。
如果bean上没有指定lazy-init
属性,则总是急切地实例化。
答案 3 :(得分:3)
lazy-init是bean的属性。 lazy-init的值可以是true和false。 如果lazy-init为true ,则在向bean发出请求时将初始化该bean。初始化spring容器时,不会初始化此bean 和 如果lazy-init为false ,则将使用spring容器初始化初始化bean。
答案 4 :(得分:1)
当我们使用 lazy-init =“default”作为元素中的属性时,容器会获取 default-lazy-init =“true | false”指定的值 element的属性,并将其用作lazy-init =“true | false”。
如果元素中不存在default-lazy-init属性,则元素中的lazy-init =“default”将表现为lazy-init-“false”。