spring 使用 ApplicationContex.getBean() 和 @Autowired 有什么不同?我如何决定选择哪一个?

spring what's different of using ApplicationContex.getBean() and @Autowired? How can I decide to choose which one?

我正在尝试通过阅读 broadLeaf 来学习一些 spring。

为什么有些 broadLeaf 使用 ApplictionContext.getBean() 而不是 @Autowired 注解?

示例

@Service
public class Car {
  @Autowired
  public Person driver;
}

@Autowired在豆车布线上受到尊重。默认构造函数 (new Car()) 通过 Spring.

创建实例后直接填充字段
ApplictionContext.getBean()

是一样的,但是:你必须通过自己的代码来调用它。

@Autowired 等同于 @Inject。区别不在于功能,而在于设计。 Spring 使用 @Inject 的上下文和依赖注入 (CDI) 作为控制反转 (IoC) 原则的一部分,应该是首选。这就是为什么

你好!

从根本上说,它们旨在做同样的事情,即从 spring 容器(即 ApplicationContext)中获取 bean 以供使用。您可以认为 @Autowired 实际上会在幕后完成 ApplictionContext.getBean() 所做的工作。

不同之处在于,使用 ApplictionContext.getBean() 时,开发人员自己负责整个过程。他们必须通过使用正确的参数手动调用 getBean() 来确保获得正确的 beans .但是当使用 @Autowired 时,开发人员不需要手动执行此过程。相反,他们只需要声明他们想要什么 bean,Spring 就会为他们获取这些 bean。所以这在某种程度上是控制反转 (IOC) 的精神,因为控制上述任务的责任被反转并从开发人员转移到框架。

作为最佳实践,我们应该始终首先使用 @Autowired。不仅更方便,更不容易出错,而且我们的领域代码不会依赖Spring框架class(即ApplictionContext),这让我们的代码看起来更干净。

如果你遇到@Autowired无法满足你的要求,因为你需要最大的灵活性来获取bean,那么检查ApplictionContext是否可以帮助你。