java Lazy注解对Spring Boot 服务注入有什么影响?

lnvxswe2  于 2022-12-25  发布在  Java
关注(0)|答案(2)|浏览(304)

我有一个错误:
应用程序上下文中某些bean的依赖关系形成了一个循环:
很多答案建议使用@Lazy注解来修复这个问题,我想知道,使用@Lazy后对代码有什么影响?
这个循环的发生是因为两个服务互相注入,我读到了关于@Lazy的文章,以及它是如何通过@Lazy修复这个问题的。
它不会完全初始化bean,而是创建一个代理将其注入到另一个bean中,被注入的bean只有在第一次需要时才会完全创建。

byqmnocz

byqmnocz1#

无论使用哪种注入方法,在所有情况下,都将提供代理对象,而不是对真实的依赖项的引用。
需要注意的是,如果一个关系被标记为@Lazy,并不意味着依赖bean的创建被推迟,当依赖bean本身没有被标记为@Lazy时,Spring容器会急切地创建它,这种行为导致了一个结论,即延迟注入应该主要与延迟初始化一起使用。

来源:https://www.javacodegeeks.com/2018/03/spring-lazy-annotation-use-cases.html

q3qa4bjr

q3qa4bjr2#

这是为了补充阿卜杜勒-拉赫曼的回答...
@Lazy注解用于延迟bean的初始化。

  • 延迟到何时?* 需要时。相反,如果bean@Lazy注解,则其代理对象在初始化代理对象时初始化bean(在应用程序上下文初始化时)。如果bean用@Lazy注解,则其代理对象仍然在应用程序上下文初始化时被初始化,但是它的底层对象直到一个示例被请求时才被初始化。如果它是一个单例bean,那么它的值将被缓存以供以后使用。
  • 为什么?* 在创建bean非常耗时或资源密集型的情况下,它非常有用。

注意:您可以通过注解方法来使单个bean惰性初始化,也可以通过注解类来使类(例如@Configuration)中的所有bean惰性初始化。
资源:

有趣的事实:一些DI框架默认使用惰性初始化,特别是Guice和HK2。

相关问题