Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)

本文详细介绍了Spring框架中的IOC容器工作原理,包括Bean的配置、依赖注入、自动装配等核心功能。解析了BeanDefinition、BeanFactory和ApplicationContext等关键接口的作用,以及Spring如何通过依赖检查、自动装配和回调方法等特性支持Bean的生命周期管理和依赖关系建立。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. SpringIOC容器
a. Spring启动时去读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表
b. 然后根据这张注册表去实例化bean
c. 装配好bean之间的依赖关系
d.为上层提供准备就绪的运行环境
Spring提供一个配置文件,描述Bean还有Bean之间的依赖关系,利用Java的反射功能,实例化Bean,并建立Bean之间的依赖关系。
在这里插入图片描述
2. SpringIOC支持的功能

a.依赖注入
b.依赖检查
c.自动装配
d.支持集合
e.指定初始化方法和销毁方法
f.支持回调方法

3. SpringIOC容器的核心接口

a.BeanFactory
b.ApplicationContext
这两个核心接口用于表示容器

4. BeanDefinition
Spring在启动容器的时候,会把XML或者注解里的Bean的定义解析成Spring容器里的BeanDefinition
在这里插入图片描述
5. BeanDefinitionRegistry
提供向IOC容器注册BeanDefinition对象的方法
按如图所示查看BeanDefinitionRegistry源码
在这里插入图片描述
在BeanDefinitionRegistry源码中中我们看到registerBeanDefinition方法,这个方法的作用就是把我们的BeanDefinition给注册到BeanDefinition的实现类DefaultListableBeanFactory 中的beanDefinitionMap里

在这里插入图片描述
可以看到bean名为key beanDefinition为value
并将beanname存入beanDefinitionNames以便后续bean的实例化
在这里插入图片描述
5. BeanFactory:Spring最核心的接口
a.提供IOC的配置机制
b.包含Bean的各种定义,便于实例化Bean
c.建立Bean之间的依赖关系
d.Bean生命周期的控制
体系结构:
BeanFactory是顶级容器接口,前面讲的BeanDefinitionRegistry以及DefaultListableBeanFactory 都是从它扩展衍生出来的。
Spring通过看接口直接的继承关系以及他们的名字就能大体看出他们之间的含义。
ListableBeanFactory:定义了访问容器中Bean定义信息的若干方法,如:查看Bean的个数,获取某一类型Bean的配置名,查看容器中是否包含某个Bean等
HierarchicalBeanFactory:通过这个接口Spring可以建立父子层级关联的容器体系,子容器可以访问父容器的Bean,父容器是不能访问子容器的Bean的,Spring使用父子容器实现了很多功能,比如SpringMVC中展现层的Bean位于一个子容器中, 而业务层和持久层的Bean位于父容器中,这样展现层就可以应用业务层和持久层的Bean,而业务层和持久层则看不到展现层的Bean。
ConfigurableBeanFactory:增强了IOC容器的可定制性,定义了设置类装载器,属性编辑器以及属性初始化后置处理器等方法

AutowireCapableBeanFactory:定义了容器中的Bean按某种规则,比如按名字匹配按类型匹配等,按照这些规则对Bean进行自动装配
SingletonBeanRegistry:允许在运行期间向容器中注册Singleton的实例Bean的方法
通过这些方法,也证明了BeanFactory体系确实提供了IOC的基础及依赖注入及Bean的装载等功能。
在这里插入图片描述
getBean方法:多个getBean方法有按类型获取Bean的有按名称获取Bean的
isSingleton方法:用来判断Bean在SpringIOC中是否为单例(默认Bean为单例,也就是利用getBean方法返回的大多数是同一个对象)
isPrototype方法:与isSingleton方法相反,如果isPrototype为true,则getBean()创建一个新的Bean去返回给调用者
在这里插入图片描述
6. ApplicationContext
如果把Spring比作汽车
BeanFactory是汽车的发动机
ApplicationContext就是汽车带离合器底盘等主要组件
在这里插入图片描述
7.ApplicationContext功能
在这里插入图片描述
在这里插入图片描述
8. 整个SpringIOC容器UML图

在这里插入图片描述
AnnotationConfigServletWebSeverApplicationContext:SpringBoot默认的容器类
从run()方法一步步找到springboot默认运行了AnnotationConfigServletWebSeverApplicationContext
在这里插入图片描述

9. 装配Bean实例
从实际的用法中来学习Bean是如何装载到IOC中的,学习如何IOC获取Bean实例并使用,之后在分析IOC容器的创建配置,以及Bean创建的底层原理。

创建ioc包,创建config与entity,并创建一个entity实例Person
在这里插入图片描述
在config下创建一个ApplicationConfig,这个主要是告诉IOC容器如何去装配Person这个Bean
类加入Configuration注解IOC容器就会根据这个类里的方法进行容器中Bean的装配,方法(返回Bean实例的方法)加入@Bean注解
在这里插入图片描述
下面我们运行run方法
因为run方法返回的实例继承自是ApplicationContext
我们用ApplicationContext来接收,接收后利用getBean方法获取Bean实例并打印
在这里插入图片描述

10.扫描装配Bean实例
如果一个个Bean都通过上面的方式注入到Spring容器中将很繁琐。

下面我们通过扫描装配Bean
我们直接在Person加入@Component注解
在person的属性上加入@value

在这里插入图片描述
@SpringBootApplication包含了@ComponentScan注解的功能所以不用添加了
@ComponentScan只能扫描当前包以及子包当中,如果是包外的FrameWorkApplication可以设置自动扫描去指定扫描路径(不说了)
在这里插入图片描述

11.依赖注入实例
在person类中注入pet
pet是个接口,具体实现为Dog

在这里插入图片描述
报空指针异常,代表相关注入没有被实现!
在这里插入图片描述
首先将Dog加入@Component标签,将Dog装载如SpringIOC当中
在这里插入图片描述
在Person中的Pet加入@Autowired注解,会自动寻找Pet的实例Dog注入到Person中
在这里插入图片描述

当Pet有两个实现类的时候可以用@Primary注解设置主要实例
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值