Spring和Springboot中容器注入那些事

本文探讨了Spring和SpringBoot中容器管理bean的概念,包括Spring如何存储bean以及BeanDefinitionMap的作用。深入讲解了SpringIoC(控制反转)的思想和优点,如松耦合、易于测试和复用。此外,还讨论了依赖注入(DI)的重要性,特别是@Autowired和@Resource注解的区别,强调在存在多个相同类型对象时,命名和匹配规则的重要性。

Spring和Springboot中容器注入那些事

spring容器如何去存储我们的bean

底层:每一个bean对应了一个BeanDefinition对象,每个bean注册到Map中。如何证明呢?

在这里插入图片描述

在这里插入图片描述

答案是:使用BeanDefintionMap来存储的所有的bean。 也就是说springioc就是一个map,仅此而已。

springioc负责:对象的初始化,对象管理,对应的依赖注入,对象的生命周期,对象的获取等(对象的生命周期的管理)

一般情况下,JVM不会回收这块空间,因为它是一个强引用,除非调用了destroy()方法,才会进行垃圾回收。

什么是SpringIoc

什么是SpringIoc:

Ioc不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建对象,从而导致类与类之间的高耦合,难于测试:有了Ioc容器后,把创建和查找对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象中间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个结构体系变得非常灵活。

spring把java中传统的面向对象的方式用容器技术技术完成,这个容器可以装配,方便进行管理和处理

优点:节约内存空间,方便

Spring Boot 支持多种依赖注入方式,主要包括以下几种: 1. **构造器注入** 构造器注入是通过类的构造函数来实现依赖注入。这种方式可以确保依赖对象在创建时就被注入,并且适合强制性依赖的场景。例如: ```java @RestController public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @GetMapping("/user/{userId}") public String getUserInfo(@PathVariable String userId) { return userService.getUserInfo(userId); } } ``` 2. **字段注入** 字段注入是将 `@Autowired` 注解直接放在字段上,Spring 会自动注入对应类型的 Bean。这种方式代码简洁,但缺点是无法控制依赖注入的顺序,且不容易进行单元测试。例如: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/user/{userId}") public String getUserInfo(@PathVariable String userId) { return userService.getUserInfo(userId); } } ``` 3. **Setter 注入** Setter 注入通过 `@Autowired` 注解标记在 setter 方法上,Spring 会调用这个方法来注入依赖。适用于某些需要选择性注入的场景,或者对于可选的依赖进行注入。例如: ```java @RestController public class UserController { private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } @GetMapping("/user/{userId}") public String getUserInfo(@PathVariable String userId) { return userService.getUserInfo(userId); } } ``` 4. **方法注入(如使用 `@Resource`)** `@Resource` 注解同样可以标注在 setter 方法上,在 bean 初始化的过程中完成属性的依赖注入。它与 `@Autowired` 类似,但 `@Resource` 默认按名称进行注入[^4]。 5. **使用 `@Qualifier` 解决多个 Bean 的冲突** 当存在多个相同类型的 Bean 时,可以通过 `@Qualifier` 注解配合 `@Autowired` 来指定具体的 Bean 名称,以解决依赖注入时的冲突问题。 ### 自动注入的核心特性 Spring 框架的自动注入成为了其核心特性之一,并且被广泛应用于各类项目中。后续的框架技术也借鉴了 Spring 的自动注入概念,提供了类似的功能来简化依赖注入的过程。例如,`@Autowired` 是 Spring Boot 中常用的自动注入注解,默认情况下它是按照类型进行注入的[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫拾壹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值