Spring中@Lazy注解的使用示例教程
Spring在应用程序上下文启动时去创建所有的单例bean对象, 而@Lazy注解可以延迟加载bean对象,即在使用时才去初始化.
所以,@Lazy注解, 一是可以减少Spring的IOC容器启动时的加载时间, 二是可以解决bean的循环依赖问题
1 @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对象就会延迟初始化.
2 @Lazy的使用
以SpringBoot环境为例
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被初始化了.............
3 @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
4 错误总结
1 在项目启动过程中, 遇到异常错误
'url' attribute is not specified and no embedded datasource could be configu
解决方法: 是项目没有将application.yml配置文件加载. 点击maven中clean一下项目, 重启项目即可.
到此这篇关于Spring中@Lazy注解的使用的文章就介绍到这了,更多相关Spring @Lazy注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
springboot+mongodb 实现按日期分组分页查询功能
这篇文章主要介绍了springboot+mongodb 实现按日期分组分页查询功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2018-07-07Java的DataInputStream和DataOutputStream数据输入输出流
这里我们来看一下Java的DataInputStream和DataOutputStream数据输入输出流的使用示例,两个类分别继承于FilterInputStream和FilterOutputStream:2016-06-06SpringBoot 使用 OpenAPI3 规范整合 knife4j的详细过程
Swagger工具集使用OpenAPI规范,可以生成、展示和测试基于OpenAPI规范的API文档,并提供了生成客户端代码的功能,本文给大家介绍SpringBoot使用OpenAPI3规范整合knife4j的详细过程,感兴趣的朋友跟随小编一起看看吧2023-12-12MyBatis注解开发-@Insert和@InsertProvider的使用
这篇文章主要介绍了MyBatis注解开发-@Insert和@InsertProvider的使用,具有很好的参考价值,希望对大家有所帮助。2022-07-07
最新评论