为什么在我的情况下上下文会创建 bean?
Why does in my case context creates the bean?
你能告诉我为什么在我的例子中上下文创建 "simple"
bean 如果它有循环依赖?在我看来,必须抛出一个关于循环依赖的异常!
配置class:
package config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "service")
public class AppConfig {
}
简单class:
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?
因为 simple
字段的设置仅在 创建 Simple
实例之后 完成,此时你有一个有效的 Simple
要分配给字段的实例。那就是场注入。创建 Simple
class.
的实例时,您不需要自动装配字段的实例
另一方面,使用构造函数注入你需要所有构造函数参数的有效实例。所以你需要一个 Simple
实例来创建 Simple
的实例,这当然是行不通的。
因此,spring 当它尝试创建一个 bean 时,它首先尝试解析所有 Autowired(依赖注入)。在我们的例子中,您正试图注入相同的 class。这意味着,Spring 在创建简单 bean 时,它会尝试解析注入的 classes,而后者又是相同的 class.
存在引发错误的循环依赖。
你能告诉我为什么在我的例子中上下文创建 "simple"
bean 如果它有循环依赖?在我看来,必须抛出一个关于循环依赖的异常!
配置class:
package config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "service")
public class AppConfig {
}
简单class:
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?
因为 simple
字段的设置仅在 创建 Simple
实例之后 完成,此时你有一个有效的 Simple
要分配给字段的实例。那就是场注入。创建 Simple
class.
另一方面,使用构造函数注入你需要所有构造函数参数的有效实例。所以你需要一个 Simple
实例来创建 Simple
的实例,这当然是行不通的。
因此,spring 当它尝试创建一个 bean 时,它首先尝试解析所有 Autowired(依赖注入)。在我们的例子中,您正试图注入相同的 class。这意味着,Spring 在创建简单 bean 时,它会尝试解析注入的 classes,而后者又是相同的 class.
存在引发错误的循环依赖。