@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 需要哪些依赖项 - 它们都列在签名中。