Spring中组件构造器标注@Lazy与给每个参数标注是否等效?
关于Spring中
@Lazy注解在构造器上的使用问题 问题1:在组件构造器上使用@Lazy注解,是否等同于给该构造器的每个参数都标注@Lazy?
答案是肯定的。当你直接在组件的构造器上标注@Lazy时,Spring会自动把懒加载的规则应用到这个构造器的所有参数依赖上,效果和给每个参数单独添加@Lazy注解完全一致。
这种设计是Spring为了简化配置而做的优化——如果某个组件的所有依赖都需要懒加载,你不用逐个给参数加注解,直接在构造器上标一次就能搞定所有参数的懒加载配置。
问题2:两种DogService构造器写法是否等效?
这两种写法完全等效,在Spring容器中的行为没有任何区别。
第一种逐个参数标注的写法:
public DogService(@Lazy CatService catService, @Lazy MouseService mouseService) { this.catService = catService; this.mouseService = mouseService; }
第二种构造器整体标注的写法:
@Lazy public DogService(CatService catService, MouseService mouseService) { this.catService = catService; this.mouseService = mouseService; }
两种写法都会让CatService和MouseService被延迟初始化:只有当DogService实际被调用、需要注入这两个依赖时,Spring才会去创建它们的实例。
额外补充个细节:如果构造器上标了@Lazy,同时某个参数单独标注@Lazy(false),那这个参数的配置会覆盖构造器的全局设置,该依赖会被立即初始化——不过这属于特殊场景,日常开发中很少用到。
内容的提问来源于stack exchange,提问作者Michiel Haisma
相关产品推荐
相关产品推荐

