【发布时间】:2019-05-06 14:17:19
【问题描述】:
Spring 中@Bean 和@Autowired 有什么区别?
据我了解,我们可以同时使用 @Autowired 来注入依赖项,当接口仅在一个类中实现时,@Bean 当接口在多个类中实现时,在最后一种情况下使用 @configuration,是必需的。
提前致谢
【问题讨论】:
标签: java spring dependency-injection dependencies
Spring 中@Bean 和@Autowired 有什么区别?
据我了解,我们可以同时使用 @Autowired 来注入依赖项,当接口仅在一个类中实现时,@Bean 当接口在多个类中实现时,在最后一种情况下使用 @configuration,是必需的。
提前致谢
【问题讨论】:
标签: java spring dependency-injection dependencies
简而言之,@Bean 是生产者,@Autowired 是消费者,@Bean 注释让 spring 知道这个类的实例并且它持有它,@Autowired 注释要求请给我我们用 @Bean 注释创建的类的实例。
更详细的回答find here
【讨论】:
当你使用 @Bean 时,你是在告诉 Spring:
这是我希望你放入堆栈中的对象,稍后我会问 关于它的你
当您使用 @Autowired 时,您是在告诉 Spring:
现在请给我我已经告诉过你将其保存在堆栈中的对象(指@Bean 对象)
【讨论】:
当您使用 @Bean 时,您负责提供一个 Id 并在您希望使用 getBean() 方法使用该特定对象时调用该 Id。 Autowired 有助于避免调用部分,并在每次需要时返回一个对象。 Spring 处理返回适当对象的工作,并有助于减少引用特定 bean 的额外语法。
【讨论】:
Spring 提供了关于 Autowired 和 Bean API 的非常好的文档
@BEAN
@Target(value={METHOD,ANNOTATION_TYPE})
@Retention(value=RUNTIME)
@Documented
public @interface Bean
表示一个方法产生一个由 Spring 管理的 bean 容器。
在 Bean 上 @Target 注释确认它可以应用于 METHOD。
@AUTOWIRED
@Target(value={CONSTRUCTOR,METHOD,PARAMETER,FIELD,ANNOTATION_TYPE})
@Retention(value=RUNTIME)
@Documented
public @interface Autowired
将构造函数、字段、设置方法或配置方法标记为由 Spring 的依赖注入工具自动装配。这是 JSR-330 Inject 注释的替代方案。
在 Autowired @Target 上确认它可以应用于 CONSTRUCTOR、METHOD、PARAMETER、FIELD。
IoC 也称为依赖注入 (DI)。这是一个过程,对象仅通过构造函数参数、工厂方法的参数或在对象实例被构造或从工厂方法返回后设置的属性来定义它们的依赖关系,即与它们一起工作的其他对象.然后容器在创建 bean 时注入这些依赖项。
【讨论】: