Java @Bean初始化-参数注入和直接方法访问之间的区别?

Java @Bean初始化-参数注入和直接方法访问之间的区别?,java,spring,spring-boot,dependency-injection,spring-bean,Java,Spring,Spring Boot,Dependency Injection,Spring Bean,如果一个服务bean依赖于另一个:将该bean作为方法参数注入,或者直接从方法引用获取,两者之间有什么区别吗 @Configuration public class MyConfig { @Bean public SomeService some() { return new SomeService(); } @Bean public AddService add(SomeService some) { return new AddServ

如果一个服务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
实例,而是隐式地与Spring包生成并支持的内存中子类(与类等)交互

正如调试可能揭示的那样,它们通常被称为
ClassName$$EnhancerBySpringCGLIB$$XXXXXXXX
或其他名称

当开始初始化bean时,它已经与cglib代理一起工作。代理方法的构造是为了满足Spring的要求(例如,
@Bean
@Scope(“singleton”)
方法的每次调用都将返回相同的实例)

它使得声明bean之间的依赖关系成为可能。在第二种方法中,我们使用
some()
this.some()
知道它将在运行时引用代理方法

为什么我会推荐第一种方法


您可以立即看到bean需要哪些依赖项—它们都列在签名中。

使用
@Configuration
时没有区别。请阅读以下内容: