前言
Spring Boot中Bean默认的作用域为单例模式;而Spring IoC容器会在启动的时候实例化所有单例Bean。熟悉单例模式的朋友也许立刻想到了饿汉模式和懒汉模式。在Spring Boot中,@Lazy用于指定Bean是否取消预初始化,该注解可以用于直接或者间接用了@Component
注解的类,或使用了@Bean
的方法。
PS: Spring使用的是单例注册表实现的单例模式。
源码
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
boolean value() default true;
}
使用
@Lazy
注解使用在@Bean
方法上:
@Bean
@Lazy
public MyBean myBean() {
return new MyBean();
}
也可以在@Comfiguration
类上使用,该类中所有的@Bean
方法都会延迟初始化
@Configuration
@Lazy
public class MyConfig() {
@Bean
public MyBean myBean1() {
return new MyBean();
}
@Bean
public MyBean myBean2() {
return new MyBean();
}
}
在标注了@Lazy
的@Configuration
类内,在某个@Bean
方法上标注@Lazy(false)
,表明这个bean立即初始化。
@Configuration
@Lazy
public class MyConfig() {
@Bean
@Lazy(false)
public MyBean myBean1() {
return new MyBean();
}
}