gpt4 book ai didi

java - Spring 在手动类实例化期间注入(inject)@Autowired 字段

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:26 26 4
gpt4 key购买 nike

在我的项目中,我惊讶地发现 Spring (4.3) 似乎试图为类 Autowiring 依赖项,即使它们是手动实例化的。

MyClass.java(注意 Lombok 注释):

@NoArgsConstructor
@AllArgsConstructor
public class MyClass {
@Autowired
private MyClassDependency dependency;
}

MyClassDependency.java 使用工厂方法并且没有 Spring 注释:

public class MyClassDependency {
public static MyClassDependency create() { return new MyClassDependency(); }
}

导致 NoSuchBeanDefinitionException 的 Spring 配置:

@Configuration
public class SpringConfig {
@Bean
public MyClass myClass() {
return new MyClass(MyClassDependency.create());
}
}

提供 bean 让 Spring 开心:

@Configuration
public class SpringConfig {
@Bean
public MyClass myClass() {
return new MyClass(); // let autowire inject dependencies
}
@Bean
public MyClassDependency myClassDependency() {
return MyClassDependency.create();
}
}

这对我来说是一个很大的惊喜。我想要更简单的第一个版本的配置......这种行为来自哪里/受控? (有可能是我遗漏了它或从某些依赖项中提取了它)。

PS:澄清一下,MyClass 代码不在我的控制范围内,但我可以更改 Spring 配置。我希望了解 Spring 如何使用 bean 方法拦截构造函数调用,以及是否可以改用构造函数。

最佳答案

问题如下:

  1. 您使用@Autowired 注释了一个字段 - 它告诉 Spring,需要在那里注入(inject)一个依赖项
  2. 您使用@Bean 注释了一个方法 - 它将返回值放入 Spring 的上下文中。
  3. 当 Spring 处理 @Bean-annotated 对象的返回值时,它开始处理它的注释 - 并且有一个带有注释的字段,它告诉 Spring 在那里注入(inject)一个依赖项,即使该字段已经有一个值分配。
  4. Spring 尝试在此处注入(inject)依赖项,但该依赖项在 Spring 上下文中不存在,因此注入(inject)失败。

所以有了@Bean,但是手动注入(inject)@Autowired 依赖相互冲突,你现在可能明白了,为什么——你不应该手动注入(inject)Autowired beans! Autowired 是一个注解,告诉 CI 容器做一些注入(inject)工作。

关于java - Spring 在手动类实例化期间注入(inject)@Autowired 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53737175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com