在我的情况下,为什么要创建bean?

时间:2018-07-08 14:38:07

标签: java spring spring-annotations

您能告诉我为什么在我的情况下,如果"simple" bean具有循环依赖性,为什么会创建它?在我看来,必须抛出一个关于循环依赖的异常! 配置类:

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "service")
public class AppConfig {
}

简单类:

package service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Simple {

    @Autowired
    private Simple simple;


    public Simple getSimple() {
        return simple;
    }
}

启动器:

import config.AppConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import service.Simple;


public class Launcher {

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        Simple simple1 = ctx.getBean("simple", Simple.class);
        System.out.println(simple1.getSimple());
    }

}

应用程序的输出为“ service.Simple@6b53e23f”。如果我添加构造函数

@Autowired
public Simple(Simple simple) {
    this.simple = simple;
}

然后发生异常"Error creating bean with name 'simple': Requested bean is currently in creation: Is there an unresolvable circular reference?"

那当我在字段中放置@Autowired时为什么创建了bean?

2 个答案:

答案 0 :(得分:3)

因为仅在创建simple实例后 完成Simple字段的设置,此时您有一个有效的Simple实例可分配给领域。那就是场注入。创建Simple类的实例时,不需要自动装配字段的实例。

另一方面,使用构造函数注入,您需要所有构造函数参数的有效实例。因此,您需要一个Simple实例来创建一个Simple实例,这当然是行不通的。

答案 1 :(得分:0)

因此,在春季尝试创建bean时,它首先尝试解决所有自动装配(依赖注入)的问题。在我们的情况下,您尝试注入相同的类。这意味着,Spring在创建Simple bean时会尝试解析注入的类,而这些类又是同一类。

有一个循环依赖项会引发错误。