@Bean和@Autowired的区别

2022-08-31 08:57:30

为什么在这种情况下我不能使用?@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


答案 1

@Bean并做两件截然不同的事情。这里的其他答案解释得更详细一些,但更简单:@Autowired

  • @Bean告诉斯普林“这是这门课的一个例子,请坚持下去,并在我问的时候把它还给我”。

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

这有意义吗?在你的第一个例子中,你要求Spring给你一个实例,但你从来没有创建过一个,所以Spring没有什么可以给你的。在第二个示例中,您正在创建一个新的实例 ,告诉 Spring 有关它的信息,然后在该方法中要求将其取回。BookingServiceBookingServicemain()

如果需要,可以从第二个方法中删除另外两行,并组合两个示例,如下所示: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");
  }
}

在本例中,注释为 Spring 提供了 ,并利用了它。@BeanBookingService@Autowired

这将是一个稍微毫无意义的例子,因为你在同一个类中使用它,但是如果你在一个类中定义了定义,而在另一个类中定义了它,它就会变得很有用。@Bean@Autowired


答案 2
@Bean
BookingService bookingService() {
    return new BookingService();
}

注释仅在 spring 应用程序上下文中将服务注册为 Bean(对象的种类)。简而言之,它只是注册,没有别的。@Bean

@Autowired
BookingService bookingService;

用变量注释会从Spring应用程序上下文中注入一个bean(即Object)。@AutowiredBookingService

(即)带有注释的注册对象将被注入到带有 注释的变量中。@Bean@Autowired

希望这能消除您的疑虑!


推荐