【问题标题】:Circular reference exception循环引用异常
【发布时间】:2017-06-26 18:31:55
【问题描述】:

我对 Spring 框架有疑问。所以假设有以下代码:

@Service
@Scope("prototype")
public class A
{
  @Autowired
  private B b;

  public void foo()
  {
    System.out.println("A foo");
  }
}

@Service
@Scope("prototype")
public class B
{
  @Autowired
  private A a;

  public void foo()
  {
    System.out.println("B foo");
  }
}

并且有以下代码启动应用程序上下文:

@SpringBootApplication
public class DemoApplication
{
  @Autowired
  private A a;

  public static void main(String[] args)
  {
    SpringApplication.run(DemoApplication.class, args);
  }
}

如果我启动 spring 上下文,那么它将抛出循环引用异常(这是预期的)。我的问题是为什么如果我将 bean A 的范围更改为单例,那么一切都会正常工作?

【问题讨论】:

  • 使用原型作用域,您将创建一个 A,这将创建一个 B,这将创建一个 A,这将创建一个 B……永远。使用单例范围,您将创建一个 A,这将创建一个 B,它将自动连接回 A。

标签: java spring


【解决方案1】:

被省略 - 就像在创建对象之后进行的注入一样。

原型看起来像(没有弹簧)

public class A{
  private B b =new B();
}

public class B{
  private A a =new A();
}

单调看起来像(没有弹簧)

public class A{
  private static A a = new A();
  private static B b = B.getB();

  public static B getB(){
     return b;
  }}

public class B{
  private static B b = new B();
  private static A a = A.getA();

  public static B getB(){
     return b;
  }
}

对于原型,您使用创建 bean A 从 bean B 创建 bean A ........

对于 singelton,您使用在使用引用之前创建的单个对象

【讨论】:

  • 如果我将范围从原型更改为请求,您知道情况是否会改变吗?
  • 是/否。在一个请求中它是 singelton ,如果您有两个或多个不同的请求,它将作为不同请求的原型。会话范围相同
猜你喜欢
  • 2023-03-05
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2016-06-22
相关资源
最近更新 更多