Spring Boot 中的依赖注入:幕后向导
是否曾经感觉 Spring Boot 是一个神奇的管家,不知怎的,它只是 知道 你需要什么,然后把它放在银盘上送给你?这基本上就是依赖注入 (DI)。您可能已经使用过 DI 一百次,却没有停下来思考:Spring 到底是如何知道注入什么以及何时注入?
如果这听起来像您,欢迎加入!我们将进行一次有趣的幕后之旅,了解 Spring Boot 的 DI 如何发挥其魔力,从它如何管理 bean、@Autowired 和 bean 生命周期(从诞生到销毁)开始。在本博客结束时,您将像专业人士一样展示您新发现的 DI 知识。
通俗地说,依赖注入就像是让杂货送货上门,而不是自己出去买。它是将“注入”依赖项(bean)的责任委托给 Spring,这样您就不必手动创建对象或担心它们的生命周期。
假设您是一名厨师,经营着一个繁忙的厨房(您的应用程序)。你没有时间每次需要鸡蛋、牛奶和糖时都跑出去买。如果有人(比如 Spring)能够神奇地在您需要的时候准确地交付您需要的一切,那不是很棒吗?
这正是 Spring DI 所做的:它找到您需要的所有成分(bean)并将它们注入到您的代码中,而无需您费力。很整洁吧?
好吧,这就是奇迹发生的地方。当您使用 SpringApplication.run() 运行 Spring Boot 应用程序时,Spring 会引导 ApplicationContext - 将其视为您的管家的说明手册。它确切地知道要获取什么以及何时获取。
我们一步步分解:
容器初始化: 当你点击 SpringApplication.run() 时,Spring 容器(又名 ApplicationContext)就会启动。这就像打开虚拟餐厅的大门,一切准备就绪。
Bean 创建: 容器会扫描您的代码以查找 @Component、@Service、@Repository 或 @Controller 等注释。其中每一个都成为一个 bean——一个由 Spring 管理的对象。将它们视为厨房中的基本成分:面粉、糖、鸡蛋等。
BeanFactory 来救援: Spring Boot 使用 BeanFactory 来创建和管理这些 bean。该工厂确切地知道如何以及何时创建您的 Bean,确保它们在需要时可用。
依赖注入:一旦bean准备好了,Spring就会在你用@Autowired标记的地方注入它们。这就像咖啡师不仅会煮咖啡,还会将咖啡送到需要的地方。你甚至不需要考虑它——一切都会出现。
啊,很好的 @Autowired 注释。有没有想过 Spring 如何神奇地知道在哪里注入依赖项?它有点像一个侦探,将您的需求与注册表中正确的 bean 相匹配。
其工作原理如下:
类型匹配:当Spring看到@Autowired时,它会在容器中寻找相同类型的bean。想象一下,您订购了咖啡豆(一个 CoffeeService 类),Spring 会在其 Bean 存储库中查找并说:“啊,我已经有了这些!让我给你注射。”
限定符: 但是如果您有多个相同类型的 bean 怎么办?在这种情况下,Spring 可能会崩溃并抛出“NoUniqueBeanDefinitionException”之类的异常。但别担心——你可以通过使用 @Qualifier 指定要注入哪个 bean 来让 Spring 平静下来:
@Autowired @Qualifier("espressoBean") private CoffeeService coffeeService;
public class CoffeeShop { private final CoffeeService coffeeService; @Autowired public CoffeeShop(CoffeeService coffeeService) { this.coffeeService = coffeeService; } }
Spring 继续自动驾驶,将 bean 注入到构造函数中,瞧,一切顺利!
Spring Boot 中的 Bean 不仅仅是对象。他们拥有充实的生活、完整的起源故事、充实的职业生涯和最终的退休生活。让我们跟踪一下 bean 的生命周期:
实例化(诞生): 首先,Spring 创建 bean 的一个实例。这就像豆子的诞生一样。春天说:“给你,小家伙!”并将其传递到容器中。
依赖注入: 创建 bean 后,Spring 会用依赖项填充它(就像蛋糕配方中的成分)。这就是@Autowired 发挥作用的地方。您的 Bean 获得了正常工作所需的一切。
初始化后: 如果你有用@PostConstruct注释的方法,Spring会在注入依赖项后调用这些方法。这就像在豆子开始工作之前给它涂上一层新油漆。
准备行动: 现在你的豆子已经活过来了。它已经准备好迎接世界了!
预销毁(退休): 当应用程序关闭时,Spring 调用 @PreDestroy 方法让 bean 正常退出。这是 Bean 的退休聚会,它清理其资源。
Bean 销毁: 最后,bean 被销毁。是时候安息了。
以下是如何在代码中跟踪这些生命周期事件:
@Component public class CoffeeBean { @PostConstruct public void onStart() { System.out.println("Bean is ready to brew some coffee!"); } @PreDestroy public void onEnd() { System.out.println("Bean is retiring. Goodbye, world!"); } }
并非所有豆类的预期寿命都相同。 Spring Boot 允许您为 beans 定义不同的范围——基本上是它们的寿命。最常见的两个是:
Singleton(默认): bean 只有一个实例,在整个应用程序中共享。这就像整个咖啡店都拥有一台浓缩咖啡机。
原型: 每次需要时都会创建一个新的 bean 实例。想象一下,每个订单都有一台新鲜的浓缩咖啡机。它占用大量资源,但有时是必要的。
@Component @Scope("prototype") public class LatteMachine { // This bean is made fresh for every use }
好吧,让我们来谈谈使用 SpringApplication.run() 运行 Spring Boot 应用程序时会发生什么。这个方法是启动整个 DI 过程的大师。
将您的 Spring Boot 应用程序视为一家咖啡店。你是主人,豆子就是你的原料:咖啡、牛奶、糖等。你不用自己跑来跑去管理这些原料,而是有一个咖啡师(Spring 容器)来获取所有东西并将其准确地交付到它所在的位置需要。
您所要做的就是下订单(设置您的 @Autowired 字段),咖啡师会处理剩下的事情 — 为您的客户完美地冲泡一杯充满依赖的咖啡(应用程序)。
归根结底,依赖注入使得 Spring Boot 成为如此强大的框架。它简化了您的生活,管理您的 Bean,并确保您的代码易于维护和扩展。
既然您已经窥视了幕后,您就拥有了许多开发人员认为理所当然的超能力。所以,继续吧——像现在的向导一样开始使用 DI。下次您看到@Autowired 时,您就会确切地知道幕后发生了什么。
希望这篇博客能让您对Spring Boot DI有更深入的了解,并给您留下微笑。现在去注入一些豆子并向你的朋友展示它是如何完成的!
对于一个有趣、信息丰富且易于理解的博客来说怎么样?如果您需要更多调整,请告诉我!
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3