spring如何解析方法调用bean?

时间:2015-09-15 08:50:58

标签: 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的了解表明,bean1bean2bean3的两个引用应该不同,因为我将bean1()方法称为两次,两个不同应该创建对象。

但是,在Spring下,在相同的ApplciationContext等中,bean2bean3都将对类Bean1的同一对象具有相同的引用。

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

2 个答案:

答案 0 :(得分:4)

具有@Configurable注释的类以特殊方式处理。它们是parsed using ASM,并且从扫描特殊bean定义中创建。基本上每个@Bean注释都是一种特殊的工厂bean。

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

答案 1 :(得分:0)

您的配置类未按原样执行。 您的课程首先由org.springframework.asm.ClassReader阅读 类org.springframework.context.annotation.ConfigurationClassParser解析您的配置类。由@Bean注释的每种方法都与org.springframework.context.annotation.BeanMethod相关联。