@Bean 初始化 - 参数注入与直接方法访问之间的区别?
@Bean initialization - difference between parameter injection vs. direct method access?
如果一个服务 bean 依赖于另一个:将那个 bean 作为方法参数注入或直接从方法引用中获取有什么区别吗?
@Configuration
public class MyConfig {
@Bean
public SomeService some() {
return new SomeService();
}
@Bean
public AddService add(SomeService some) {
return new AddService(some);
}
//alternative:
//@Bean
//public AddService add() {
// return new AddService(some());
//}
}
简答
没有区别,但第一种方法更可取。
长答案
您不使用 MyConfig
实例,您隐式地与 cglib and backed by Spring's package org.springframework.cglib.proxy
(with classes like Enhancer
, MethodProxy
等生成的内存中子类交互。
调试可能会显示,它们通常被称为 ClassName$$EnhancerBySpringCGLIB$$XXXXXXXX
或其他名称。
当BeanFactory
开始初始化bean 时,它已经可以与cglib 代理一起工作。代理的方法是为了满足 Spring 的要求而构建的(例如,每次调用 @Bean
@Scope("singleton")
方法都会 return实例)。
它可以声明 bean 间的依赖关系。在第二种方法中,我们使用 some()
或 this.some()
知道它将在运行时引用代理方法。
为什么我会推荐第一种方法?
您会立即看到 bean 需要哪些依赖项 - 它们都列在签名中。
如果一个服务 bean 依赖于另一个:将那个 bean 作为方法参数注入或直接从方法引用中获取有什么区别吗?
@Configuration
public class MyConfig {
@Bean
public SomeService some() {
return new SomeService();
}
@Bean
public AddService add(SomeService some) {
return new AddService(some);
}
//alternative:
//@Bean
//public AddService add() {
// return new AddService(some());
//}
}
简答
没有区别,但第一种方法更可取。
长答案
您不使用 MyConfig
实例,您隐式地与 cglib and backed by Spring's package org.springframework.cglib.proxy
(with classes like Enhancer
, MethodProxy
等生成的内存中子类交互。
调试可能会显示,它们通常被称为 ClassName$$EnhancerBySpringCGLIB$$XXXXXXXX
或其他名称。
当BeanFactory
开始初始化bean 时,它已经可以与cglib 代理一起工作。代理的方法是为了满足 Spring 的要求而构建的(例如,每次调用 @Bean
方法都会 return实例)。@Scope("singleton")
它可以声明 bean 间的依赖关系。在第二种方法中,我们使用 some()
或 this.some()
知道它将在运行时引用代理方法。
为什么我会推荐第一种方法?
您会立即看到 bean 需要哪些依赖项 - 它们都列在签名中。