Spring IoC(ApplicationContext) 容器一般都会在启动的时候实例化所有单实例 bean 。如果我们想要 Spring 在启动的时候延迟加载 bean,即在调用某个 bean 的时候再去初始化,那么就可以使用 @Lazy 注解。
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
/**
* Whether lazy initialization should occur.
*/
boolean value() default true;
}
1、TYPE
1.1、当把@Lazy
注解写在某个类上(该类上有@Component
注解)时,表示该Bean是一个懒加载的Bean,表示该Bean是在用到时才会去创建,而不是Spring启动时创建;
1.2、当把@Lazy
注解写在一个@Configuration
注解所在类上时,表示该类内部所有@Bean
所定义的Bean都是懒加载的Bean。
2、FIELD
当把@Lazy
注解加在一个字段上时,Spring会给该属性赋值一个由CGLIB所生成的一个代理对象,当该代理对象执行某个方法时,才会真正的根据字段的类型和名字从Spring容器中去找到某个Bean对象,并执行该Bean对象所对应的方法。
3、METHOD
当把@Lazy
注解写在一个@Autowired
注解所在方法上时,那么Spring会给该方法的所有入参赋值一个代理对象。
4、PARAMETER
当把@Lazy
注解写在一个@Autowired
注解所在方法中的某个参数前时,那么Spring会给该入参赋值一个代理对象。
5、CONSTRUCTOR
5.1、当把@Lazy
注解写在一个@Autowired
注解所在构造方法上时,Spring会给该方法的所有入参赋值一个代理对象;
5.2、注意:可以解决循环依赖。