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

mem*_*und 2 java spring dependency-injection spring-bean spring-boot

如果服务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());
   //}
}
Run Code Online (Sandbox Code Playgroud)

And*_*lko 5

简短的回答

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

答案很长

你不要用工作MyConfig实例,你含蓄与生成的内存子相互作用CGLIB和Spring的包支持org.springframework.cglib.proxy(与像类Enhancer,MethodProxy等等).

由于调试可能会显示,通常会调用它们ClassName$$EnhancerBySpringCGLIB$$XXXXXXXX或其他东西.

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

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

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

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