Spring-@Lazy注解

579 阅读1分钟

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、注意:可以解决循环依赖。