我有一个错误:应用程序上下文中某些bean的依赖关系形成了一个循环:很多答案建议使用@Lazy注解来修复这个问题,我想知道,使用@Lazy后对代码有什么影响?这个循环的发生是因为两个服务互相注入,我读到了关于@Lazy的文章,以及它是如何通过@Lazy修复这个问题的。它不会完全初始化bean,而是创建一个代理将其注入到另一个bean中,被注入的bean只有在第一次需要时才会完全创建。
@Lazy
byqmnocz1#
无论使用哪种注入方法,在所有情况下,都将提供代理对象,而不是对真实的依赖项的引用。需要注意的是,如果一个关系被标记为@Lazy,并不意味着依赖bean的创建被推迟,当依赖bean本身没有被标记为@Lazy时,Spring容器会急切地创建它,这种行为导致了一个结论,即延迟注入应该主要与延迟初始化一起使用。
来源:https://www.javacodegeeks.com/2018/03/spring-lazy-annotation-use-cases.html
q3qa4bjr2#
这是为了补充阿卜杜勒-拉赫曼的回答...@Lazy注解用于延迟bean的初始化。
注意:您可以通过注解方法来使单个bean惰性初始化,也可以通过注解类来使类(例如@Configuration)中的所有bean惰性初始化。资源:
@Configuration
有趣的事实:一些DI框架默认使用惰性初始化,特别是Guice和HK2。
2条答案
按热度按时间byqmnocz1#
无论使用哪种注入方法,在所有情况下,都将提供代理对象,而不是对真实的依赖项的引用。
需要注意的是,如果一个关系被标记为@Lazy,并不意味着依赖bean的创建被推迟,当依赖bean本身没有被标记为@Lazy时,Spring容器会急切地创建它,这种行为导致了一个结论,即延迟注入应该主要与延迟初始化一起使用。
来源:https://www.javacodegeeks.com/2018/03/spring-lazy-annotation-use-cases.html
q3qa4bjr2#
这是为了补充阿卜杜勒-拉赫曼的回答...
@Lazy
注解用于延迟bean的初始化。@Lazy
注解,则其代理对象在初始化代理对象时初始化bean(在应用程序上下文初始化时)。如果bean用@Lazy
注解,则其代理对象仍然在应用程序上下文初始化时被初始化,但是它的底层对象直到一个示例被请求时才被初始化。如果它是一个单例bean,那么它的值将被缓存以供以后使用。注意:您可以通过注解方法来使单个bean惰性初始化,也可以通过注解类来使类(例如
@Configuration
)中的所有bean惰性初始化。资源:
有趣的事实:一些DI框架默认使用惰性初始化,特别是Guice和HK2。