Java中循环引用“a circular reference“的问题

打印 上一主题 下一主题

主题 810|帖子 810|积分 2430

a circular reference
  1. org.springframework.beans.factory.BeanCurrentlyInCreationException:
  2. Error creating bean with name 'AxxxxService':
  3. Bean with name 'BxxxxService'
  4. has been injected into other beans [CxxxxService] in its raw version as part of a circular reference,
  5. but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching -
  6. consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.
复制代码
1)我在远程调用的api接口中的实现类里(ReiDetailApiImpl implements ReiDetailApi 这个类中使用了 ReiDetailService.selectByAdmin(id) 方法

什么是循环引用?

循环引用指的是两个或多个对象相互依靠,导致依靠关系形成一个闭环。在依靠注入框架中,如果A对象依靠于B对象,而B对象又依靠于A对象,就形成了循环引用。 (形成一个环)
  1. public class A {
  2.     private B b;
  3.     @Autowired
  4.     public A(B b) {
  5.         this.b = b;
  6.     }
  7. }
  8. public class B {
  9.     private A a;
  10.     @Autowired
  11.     public B(A a) {
  12.         this.a = a;
  13.     }
  14. }
复制代码
类A依靠于B,而类B依靠于A。这种环境会导致循环引用问题
解决循环引用

在Spring框架中,@Lazy 注解可以用来耽误加载一个bean,尤其是用来解决循环引用的问题。
通过将 @Lazy 应用于bean的注入,可以让Spring容器在创建bean时耽误对依靠的注入,从而避免在对象创建时直接解析和注入依靠,从而打破循环引用。
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.context.annotation.Lazy;
  3. import org.springframework.stereotype.Service;
  4. import lombok.Data;
  5. @Data
  6. @Service
  7. public class AService {
  8.     private BService bService;
  9.     @Autowired
  10.     public AService(@Lazy BService bService) {
  11.         this.bService = bService;
  12.     }
  13.     public void performAction() {
  14.         bService.doSomething();
  15.     }
  16. }
  17. @Data
  18. @Service
  19. public class BService {
  20.     private AService aService;
  21.     @Autowired
  22.     public BService(@Lazy AService aService) {
  23.         this.aService = aService;
  24.     }
  25.     public void doSomething() {
  26.         System.out.println("Doing something...");
  27.     }
  28. }
复制代码
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.context.annotation.Lazy;
  3. import org.springframework.stereotype.Service;
  4. import lombok.Data;
  5. @Data
  6. @Service
  7. public class AService {
  8.     private BService bService;
  9.     @Autowired
  10.     public AService(@Lazy BService bService) {
  11.         this.bService = bService;
  12.     }
  13.     public void performAction() {
  14.         bService.doSomething();
  15.     }
  16. }
  17. @Data
  18. @Service
  19. public class BService {
  20.     private AService aService;
  21.     @Autowired
  22.     public BService(@Lazy AService aService) {
  23.         this.aService = aService;
  24.     }
  25.     public void doSomething() {
  26.         System.out.println("Doing something...");
  27.     }
  28. }
复制代码
我在实际应用中
  1. @Resource
  2. @Lazy
  3. private MyTestService myTestService;//注入service
复制代码
@Lazy注解 用于耽误加载Bean,避免循环引用问题

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表