我使用Spring框架编写了以下代码.

CODE

package com.spring.core.trialDI;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Configuration
@ComponentScan("com.spring.core.trialDI")
class LegendConfig {

}

@Component
class A {
    public A() {
        System.out.println("I am A constructor!");
    }
}

@Component
class B {
    A a;

    public B() {
        System.out.println("I am B constructor!");
    }

    @Autowired
    public void setA(@Qualifier("a") A a) {
        System.out.println("I am setA of B!");
        this.a = a;
    }
}

@Component
class C {
    A a;

    public C() {
        System.out.println("I am C constructor!");
    }

    @Autowired
    public void setA(@Qualifier("a") A a) {
        System.out.println("I am setA of C!");
        this.a = a;
    }
}
public class TrialTheory {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(LegendConfig.class);
        B b = applicationContext.getBean(B.class);
        C c = applicationContext.getBean(C.class);
    }
}

OUTPUT

I am A constructor!
I am B constructor!
I am setA of B!
I am C constructor!
I am setA of C!

现在和在main()方法中一样,我首先创建了一个B类型的Bean,所以class B的构造函数必须在setter之前先调用.(构造函数创建对象,其方法只能在创建后使用).

但是,为什么在任何人之前调用A构造函数呢?幕后发生了什么?

推荐答案

调用B b = applicationContext.getBean(B.class);并不意味着您创建了一个Bean(如果它是一个单例Bean,如您的示例所示).它只为您提供一个来自上下文的已经创建的Bean.Spring在其启动期间(在应用程序上下文创建阶段)创建单例Bean.

您可以在此处阅读有关Spring如何管理Bean的更多信息: https://docs.spring.io/spring-framework/reference/core/beans.html

Java相关问答推荐

Proguard配置以保留具有参数的注释的成员

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

Java Stream,需要更新列表对象列表

为什么我们不能实现两个接口,其中一个接口有相同的签名,其中一个接口有默认的实现在java?'

为什么我的ArrayList索引的索引总是返回-1?

对某一Hyroby控制器禁用@cacheable

为什么JAVA&S清洁器使用链表而不是并发HashSet?

无法初始化JPA实体管理器工厂:无法确定为Java类型<;类>;推荐的JdbcType

如何修复PDF重建过程中的文本定位

无法使用Java&;TestContainers获取AWS SQS队列的属性

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

如何在Java记录中设置BigDecimal类型属性的精度?

如何在 spring 数据的MongoDB派生查询方法中使用$EXISTS

是否为计划任务补偿系统睡眠?

根本不显示JavaFX阿拉伯字母

使用MediaPlayer类在一段时间后停止播放音乐

模拟JUnit未检测到返回字符串的方法的任何声纳覆盖

如何在右击时 Select 新行?

Java System.getProperty在哪里检索user.home?