java - spring如何将方法调用解析为bean?

标签 java spring dependency-injection jls

考虑这段代码:

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 将对类 的相同对象具有相同的引用Bean1.

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

最佳答案

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

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

关于java - spring如何将方法调用解析为bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32581680/

相关文章:

java - 如何从 URL 下载多个文件作为一个 zip 文件

java - @OneToMany 关系 hibernate

java - Jackson - 在运行时解析相同 key 下的不同模型

java - Maven 将依赖调解策略设置为最新而不是最近

java - Gradle 和 Maven 与 3d 派对 jar

android - 通过构建器注入(inject)的 Hilt 适配器为空

spring - 如何在 grails 服务中使用 DEPENDENCY INJECTION 有选择地设置属性以进行单元测试

java - jetty WebSocket 自定义事件

Spring : Auto Generate CRUD Rest Controller

Spring 表达式语言 (SpEL) 与 @Value : dollar vs. 哈希($ vs. #)