spring 如何将方法调用解析为 beans?

How does spring resolve method calls as beans?

考虑这段代码:

public class Bean1  {}

public class Bean2  {
    private final Bean1 bean1;

    public Bean2(Bean1 bean1){
        this.bean1 = bean1;
    }
}

@Configuration
public class MyConfiguration {
    @Bean
    public Bean1 bean1(){
        return new AImpl(); 
    }

    @Bean 
    public Bean2 bean2() {
        return new BImpl(bean1());
    }

    @Bean
    public Bean3 bean3() {
        return new BImpl(bean1());
    }
}

我对 Java 的了解表明,bean2bean3 中对 bean1 的两个引用应该不同,因为我调用 bean1() 方法两次,应该创建两个不同的对象。

但是,在Spring下,在同一个ApplciationContext等中,bean2bean3都会对[=29=的同一个对象有相同的引用] Bean1.

Java 这怎么可能? Spring 使用什么机制允许它以某种方式拦截方法调用并将 bean 作为这些调用的结果?

带有 @Configurable 注释的

Class 以特殊方式处理。它们是 parsed using ASM 并且通过扫描创建了特殊的 bean 定义。基本上每个 @Bean 注释都是一种特殊的工厂 bean。

因为这些方法被视为工厂 bean,所以它们只被调用一次(当然除非作用域不是单例)。

您的配置 class 未按原样执行。 您的 class 最先被 org.springframework.asm.ClassReader 阅读 class org.springframework.context.annotation.ConfigurationClassParser 解析您的配置 class。 @Bean 注释的每个方法都关联到 org.springframework.context.annotation.BeanMethod.