@Lazy注解的使用

@Lazy注解主要有两种用途:

一是可以减少Spring的IOC容器启动时的加载时间。
二是可以解决bean的循环依赖问题。

@Lazy的简介

@Lazy注解用于标识bean是否需要延迟加载。

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

}

查看注解源码可知,只有一个参数, 默认为true, 即添加该注解的bean对象就会延迟初始化.

@Lazy的使用

  1. 准备一个Springboot环境
  2. 准备两个实体类对象
@Data
@NoArgsConstructor
public class User {

    private String name;
    private String phone;
    private Integer age;
    private Person person;

    public User(String name, String phone, Integer age) {
        System.out.println("我User被初始化了.............");
        this.name = name;
        this.phone = phone;
        this.age = age;
    }
}
@Data
@NoArgsConstructor
public class Person {

    private String name;
    private String phone;
    private Integer age;
    private User user;

    public Person(String name, String phone, Integer age) {
        System.out.println("我Person被初始化了.............");
        this.name = name;
        this.phone = phone;
        this.age = age;
    }
}
  1. 添加启动类
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public User createUser() {
        return new User("韩宣生", "11111", 24);
    }

    @Bean
    @Lazy
    public Person createPerson() {
        return new Person("韩立", "11111", 24);
    }
}
  1. 测试查看控制台

我User被初始化了.............

  1. 去掉Person上的 @Lazy注解,重启项目

我User被初始化了.............
我Person被初始化了.............

@Lazy的作用

上面是延时加载Bean对象
下面演示解决循环依赖问题

  1. 添加两个配置类
@Component
public class PersonConfig {

    private UserConfig userConfig;

    public PersonConfig( UserConfig userConfig) {
        this.userConfig = userConfig;
        System.out.println("我是用户配置 PersonConfig");
    }

}
@Component
public class UserConfig {

    private PersonConfig personConfig;

    public UserConfig(PersonConfig personConfig) {
        this.personConfig = personConfig;
        System.out.println("我是用户配置 UserConfig");
    }
}
  1. 重启项目, 项目报错,代码中存在循环依赖
    Description:
    The dependencies of some of the beans in the application context form a cycle:
    解决办法,给其中一个添加@Lazy注解,如
@Component
public class PersonConfig {

    private UserConfig userConfig;


    public PersonConfig(@Lazy UserConfig userConfig) {
        this.userConfig = userConfig;
        System.out.println("我是用户配置 PersonConfig");
    }

}
  1. 重启项目,查看日志

我是用户配置 PersonConfig
我是用户配置 UserConfig

posted @ 2022-10-10 10:14  NeverLateThanBetter  阅读(1406)  评论(0编辑  收藏  举报