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

标签 java spring

在我的项目中,我惊讶地发现 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/

相关文章:

java - Eclipse 运行旧代码而不是更新代码

java - 如何让EhCache重置一个域与其他域之间的一对多关系的缓存?

java - Spring - 缺少必需的库 - hibernate3-3.2.3.GA.jar

java - AspectJ 加载时间编织不适用于 Spring bean

java - 将 List<Class> 转换为字符串 JAVAI

java - 在手动创建的实例中注入(inject)组件

java - Html Java 小程序

java找不到符号错误

spring - java.util.zip.ZipException : invalid LOC header (bad signature)

java - 部署失败: repository element was not specified in the POM