为什么我不能在这种情况下使用@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
同样的事情的两种方法不是吗?
答案 0 :(得分:115)
@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
,并且在{1}}不同的。
答案 1 :(得分:7)
@Bean
BookingService bookingService() {
return new BookingService();
}
注释@Bean
仅在Spring应用程序上下文中将服务注册为bean(一种Object)。简单来说,它只是注册而不是别的。
@Autowired
BookingService bookingService;
使用@Autowired
注释变量从Spring Application Context注入BookingService
bean(即Object)。
(即)带有@Bean
注释的注册bean将被注入到用@Autowired
注释的变量。
希望这能清除你的怀疑!
答案 2 :(得分:4)
@Bean
BookingService bookingService() {
return new BookingService();
}
您可以在BookingService类
上使用@Service注释答案 3 :(得分:2)
这里有关于@Autowired注释的好文章:http://www.baeldung.com/spring-autowire
@Autowired注释可以通过在配置类上定义@ComponentScan(" namespace.with.your.components.for.inject")来实例化您的注射器
@Configuration
@ComponentScan("com.baeldung.autowire.sample")
public class AppConfig {}
所有组件必须用@Component注释标记。它取代了@Bean注释。
答案 4 :(得分:0)
@Bean仅用于元数据定义来创建bean(等效于tag)。 @Autowired是将依赖项注入到一个Bean中(等效于ref XML标签/属性)。
答案 5 :(得分:0)
无论您使用@Autowire实例化了哪个类,都可以在方法上使用@Bean将其实例化为带有@Configuration注释的类。
@Autowire和@Bean都是初始化Class实例的方法。
区别在于,如果使用@Bean实例化一个类,则可以更好地控制初始化。例如,如果要实例化Resilience4J断路器类,如果在使用@Bean的方法中进行实例化,则可以选择使用如下代码设置所有配置
aujourd'hui
在这种情况下,使用@Bean显然是更好的方法。