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

时间:2018-07-25 15:09:14

标签: java spring spring-boot dependency-injection spring-bean

如果服务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());
   //}
}

1 个答案:

答案 0 :(得分:5)

简短答案

没有区别,但是第一种方法更可取。

好答案

您不使用java.lang.Integer实例,而是与由cglib生成并由Spring软件包org.springframework.cglib.proxy支持的内存中子类进行隐式交互(具有类似{{3 }},Enhancer等。

正如调试所揭示的那样,它们通常被称为MyConfig之类的东西。

MethodProxy开始初始化bean时,已经可以使用cglib代理了。代理的方法可以满足Spring的要求(例如,每次调用ClassName$$EnhancerBySpringCGLIB$$XXXXXXXX @Bean 方法都会返回相同的实例)。

可以声明Bean间的依赖关系。在第二种方法中,我们使用@Scope("singleton")some()知道它将在运行时引用代理方法。

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

您会立即看到Bean需要哪些依赖关系-它们都在签名中列出。