1. 源码流程图

https://www.processon.com/diagraming/63fad8c81c6b02464eef690a

2. BD 中设置属性

2.1. 使用方法

2.1.1. @Component 类上加上@Lazy 注解

1
2
3
4
5
@Lazy
@Component
public class XXXX {
...
}

2.1.2. 在@Configuration 类中配置@Bean 时添加@Lazy 注解

1
2
3
4
5
6
7
8
@Configuration
public class XXXX {
@Lazy
@Bean
public XXX getXXX() {
return new XXX();
}
}

2.1.3. @ComponentScan 配置延迟加载

使用包扫描的配置方式如下:

1
2
3
4
5
@ComponentScan(value = "XXX.XXX", lazyInit = true)
@Configuration
public class XXXX {
...
}

2.2. 设置时机⭐️🔴

%%
▶30.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230323-1908%%
❕ ^cqh37t

image.png

image.png

当使用 2.1 三种配置后,Spring 在扫描加载 Bean 时会读取@Lazy 和@Component 注解相应值,并设置 Bean 定义的 lazyInit 属性。读取注解配置时最终会调用 ClassPathBeanDefinitionScanner 及其子类实现的 doScan 方法,在这个方法中完成注解的读取配置。

https://www.processon.com/diagraming/63dd8eb4b59543238fa3a6a5
image.png

3. @Lazy 生效⭐️🔴

%%
▶38.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230304-1300%%
❕ ^50mrkk

https://www.processon.com/diagraming/63fad8c81c6b02464eef690a

image.png

image.png

4. 总结

从上面的例子我们可以总结及延伸出两个注意点:

  1. 非延迟加载的类中不能自动注入延迟加载的类,会导致延迟加载失效;
  2. 如果想要实现某个类延迟加载使用自动注入功能时需要调用链前都不存在非延迟加载类,否则延迟加载失效。

image.png

5. 实战经验

6. 参考与感谢

https://blog.csdn.net/Peelarmy/article/details/107339547
https://blog.csdn.net/wang489687009/article/details/120577472