如果一个服务 bean 依赖于另一个:将那个 bean 作为方法参数注入(inject)或直接从方法引用中获取有什么区别吗?
@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 生成的内存中子类交互并由 Spring 的包支持 org.springframework.cglib.proxy
(类如 Enhancer
、 MethodProxy
等)。
正如调试可能揭示的那样,它们通常被称为 ClassName$$EnhancerBySpringCGLIB$$XXXXXXXX
或其他名称。
当 BeanFactory
开始初始化 beans,它已经可以与 cglib 代理一起使用。代理的方法被构造成满足 Spring 的要求(例如,每次调用 @Bean
方法将返回相同的实例)。@Scope("singleton")
它可以声明 bean 间的依赖关系。在第二种方法中,我们使用 some()
或 this.some()
知道它将在运行时引用代理方法。
为什么我会推荐第一种方法?
您会立即看到 bean 需要哪些依赖项 - 它们都列在签名中。
关于java - @Bean 初始化 - 参数注入(inject)与直接方法访问之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51522278/