@Bean和@Autowired之间的区别
为什么我不能在这种情况下使用@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
注释创建的@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
它会变@Bean
有用。
@Bean BookingService bookingService() { return new BookingService(); }
注释@Bean
仅在spring应用程序上下文中将此服务注册为bean(即一种Object)。 简单来说,它只是注册,但没有。
@Autowired BookingService bookingService;
使用@Autowired
注释变量从Spring Application Context注入一个BookingService
bean(即Object)。
IE,@Bean的注册bean将注入使用@Autowired
注释的变量。
希望这能说清楚你的疑惑!
@DaveyDaveDave的精彩答案在示例中而不是
@Bean BookingService bookingService() { return new BookingService(); }
您可以在BookingService类上使用@Service注释
关于@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。
- 有没有一种简单的方法为每个类创建一个记录器实例?
- 按类型划分的弹簧布线比按名称布线要慢
- Struts2中的dependency injection访问会话Scoped Bean
- 如何正确地进行dependency injection(在Spring中)?
- 如何解决松散耦合/dependency injection与富域模型之间的冲突?
- ClassCastException:org.springframework.orm.jpa.EntityManagerHolder无法强制转换为org.springframework.orm.hibernate5.SessionHolder
- 如何在jersey 2.0中使用hk2注入常量?
- JavaConfig中的Spring Bean别名
- Jersey和spring集成 – bean Injections在运行时为null