一、@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;
}
}
3 添加启动类
@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);
}
}
4 测试查看控制台
我User被初始化了.............
5 去掉Person上的 @Lazy注解,重启项目
我User被初始化了............. 我Person被初始化了.............
三、 @Lazy的作用
1、延迟加载bean对象(如上案列)
2、解决循环依赖问题
(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");
}
}
(2) 重启项目, 项目报错,代码中存在循环依赖
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");
}
}
(3) 重启项目,查看日志
我是用户配置 PersonConfig 我是用户配置 UserConfig
四、错误总结
1 在项目启动过程中,遇到异常错误
'url' attribute is not specified and no embedded datasource could be configue
解决方法:是项目没有将application.yml配置文件加载。点击maven中clean一下项目,重启项目即可。
摘自:https://blog.csdn.net/ABestRookie/article/details/120980987