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

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

如果一个服务 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 (类如 EnhancerMethodProxy 等)。

正如调试可能揭示的那样,它们通常被称为 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/

相关文章:

java - 安装后运行的第一个应用程序中相机无法工作

java - 关闭 spring 文件的 XSD 验证

java - Spring 启动: MockMvc returning strange responses

java - @SpringBootTest 测试类是否正确?

java - JFrame 太小并且 pack() 似乎不起作用

java - Map 和 Hashmap 有区别吗?

Java Swing-更改按下的按钮的图标

java - Spring 3 MVC 嵌套请求映射

spring-boot - 在使用spring-boot 2.3的同时选择spring-data-elasticsearch 3.2

spring-mvc - Spring Boot + Spring MVC + Ratpack 可能吗?