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 的了解表明,bean2
和 bean3
中对 bean1
的两个引用应该不同,因为我调用 bean1()
方法两次,应该创建两个不同的对象。
但是,在Spring下,在同一个ApplciationContext等中,bean2
和bean3
都会对[=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
.
考虑这段代码:
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 的了解表明,bean2
和 bean3
中对 bean1
的两个引用应该不同,因为我调用 bean1()
方法两次,应该创建两个不同的对象。
但是,在Spring下,在同一个ApplciationContext等中,bean2
和bean3
都会对[=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
.