一尘不染

@Bean和@Autowired之间的区别

spring

为什么@Autowired在这种情况下不能使用?

@SpringBootApplication
public class Application {

    @Autowired
    BookingService bookingService;

    public static void main(String[] args) {
        bookingService.book("Alice", "Bob", "Carol");
    }
}

但可以使用 @Bean

@SpringBootApplication
public class Application {

    @Bean
    BookingService bookingService() {
        return new BookingService();
    }

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        BookingService bookingService = ctx.getBean(BookingService.class);
        bookingService.book("Alice", "Bob", "Carol");
    }
}

生成BookingService同一事物的两种方式不是吗?


阅读 5235

收藏
2020-04-13

共1个答案

一尘不染

@Bean@Autowired做两件事。此处的其他答案将更详细地解释,但更为简单:

  • @Bean 告诉Spring’这是此类的一个实例,请保留该类,并在我询问时将其还给我’。

  • @Autowired说“请给我一个该类的实例,例如,我@Bean之前用注释创建的一个实例”。

那有意义吗?在第一个示例中,你要让Spring给你一个的实例BookingService,但是你从未创建一个实例,因此Spring没有任何东西可以给你。在第二个示例中,你将创建一个的新实例BookingService,将其告知Spring,然后在该main()方法中要求其返回。

如果需要,可以从第二种main()方法中删除另外两行,并结合以下两个示例:

@SpringBootApplication
public class Application {

  @Autowired
  BookingService bookingService;

  @Bean
  BookingService bookingService() {
    return new BookingService();
  }

  public static void main(String[] args) {
    bookingService.book("Alice", "Bob", "Carol");
  }
}

在这种情况下,@Bean注释为Spring提供了BookingService,并加以@Autowired利用。

这将是一个毫无意义的示例,因为你都在同一个类中使用它们,但是如果你@Bean在一个类中定义了该类,而在另一个类中定义了它,则它将变得很有用@Autowired

2020-04-13