考虑以下代码:
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的了解表明,bean1
和bean2
中bean3
的两个引用应该不同,因为我将bean1()
方法称为两次,两个不同应该创建对象。
但是,在Spring下,在相同的ApplciationContext等中,bean2
和bean3
都将对类Bean1
的同一对象具有相同的引用。
Java中的可能性如何? Spring使用什么机制允许它以某种方式拦截方法调用并将bean作为这些调用的结果?
答案 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
相关联。