总结:@bean产生bean给到spring 容器,@Autowired获取bean (@bean和beans.xml是2种不同配置bean的方法)
https://juejin.cn/post/6887071268017799182
为什么我不能在这种情况下使用@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它会变得很有用.

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐