Spring的默认行为为lazy-init

我是初学者,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在启动时创buildbean,lazy-init = true不会在启动时创build一个bean,而是根据请求创build一个特定的bean。 在这里纠正我,如果我的解释是错误的。

lazy-init的默认行为是什么? 它将如何实例化?

默认行为是false:

默认情况下,ApplicationContext实现是作为初始化过程的一部分,急切地创build和configuration所有的singleton bean。 通常,这种预先实例化是可取的,因为configuration或周围环境中的错误被立即发现,而不是数小时甚至数天后。 当这种行为不可取时,可以通过将bean定义标记为lazy-initialized来防止单例bean的预先实例化。 一个惰性初始化的bean告诉IoC容器在第一次请求时创build一个bean实例,而不是在启动时。

我build议阅读

bean上的lazy-init="default"设置只能引用由封闭beans元素的default-lazy-init属性设置的内容。 default-lazy-init的隐式默认值是false

如果在bean上没有指定lazy-init属性,它总是被急切地实例化。

对于那些来到这里并正在使用Javaconfiguration的用户,可以使用如下所示的批注将Bean设置为lazy-init:

在configuration类中:

 @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; ....... } 

lazy-init是bean的属性。 lazy-init的值可以是true和false。 如果lazy-init为true ,那么在向bean发出请求时,该bean将被初始化。 这个bean在初始化spring容器的时候不会被初始化, 如果lazy-init是false,那么这个bean将被初始化为spring容器。

当我们使用lazy-init =“default”作为元素中的一个属性时,容器拾取由元素的default-lazy-init =“true | false”属性指定的 ,并将其作为lazy-init =“true | false ”。

如果元素中不存在default-lazy-init属性,则元素中的lazy-init =“default”的行为就像lazy-init-“false”一样。