gpt4 book ai didi

java - @Bean 和 @Autowired 的区别

转载 作者:IT老高 更新时间:2023-10-28 13:02:40 26 4
gpt4 key购买 nike

为什么在这种情况下我不能使用 @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的方式不是一回事吗?

最佳答案

@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 在另一个中。

关于java - @Bean 和 @Autowired 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34172888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com