Java Spring 配置何时定义bean和何时新建

Java Spring configuration when to define bean and when new

我有一个配置 class,我想知道我应该为每个 class 定义 bean 还是创建新的。

@Configuration
public class BookConfig {

  @Bean
  public Read readBook() {
    return new ReadBook(new Operation(), new Library(new Location()));
  }
}

@Configuration
public class BookConfig {

  @Bean
  public Operation operation() {
    return new Operation();
  }

  @Bean
  public Location location() {
    return new Location();
  }

  @Bean
  public Library library() {
    return new Library(location());
  }

  @Bean
  public Read readBook() {
    return new ReadBook(operation(), library());
  }
}

正确的方法是什么?

如果您不打算在任何时候使用 Operation 和 Location bean,那么您可以跳过该 bean 的创建并像第一个选项那样使用 new。 但是,如果您认为稍后会使用 Operation 和 Location bean,则第二种方法更好。尽管我建议稍作修改。您不必调用这些方法,而是将 bean 本身作为方法参数传递。

@Configuration
public class BookConfig {

  @Bean
  public Operation operation() {
    return new Operation();
  }

  @Bean
  public Location location() {
    return new Location();
  }

  @Bean
  public Library library(Location location) {
    return new Library(location);
  }

  @Bean
  public Read readBook(Location location, Library library) {
    return new ReadBook(location, library);
  }
}

作为一个经验法则,永远记住任何被制成 Bean 的东西都将由 Spring 引导上下文本身管理。任何您声明为“新”的东西都不会被 spring 引导管理,并将被视为一个普通的 java 对象。

Bean 默认情况下是单例的,并且具有所有生命周期方法 运行(除其他外)。在启动时 Spring 创建引导上下文期间,将解决 bean 依赖关系,您必须以不存在循环依赖问题的方式设计 classes。

如果你做一个“新”,那么这些对象的范围将被限制在 class 的特定实例中,并且一旦被垃圾收集,就会与实例一起销毁。