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

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

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

3. SpringIOC容器的核心接口

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

4. BeanDefinition
Spring在启动容器的时候,会把XML或者注解里的Bean的定义解析成Spring容器里的BeanDefinition
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第2张图片
5. BeanDefinitionRegistry
提供向IOC容器注册BeanDefinition对象的方法
按如图所示查看BeanDefinitionRegistry源码
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第3张图片
在BeanDefinitionRegistry源码中中我们看到registerBeanDefinition方法,这个方法的作用就是把我们的BeanDefinition给注册到BeanDefinition的实现类DefaultListableBeanFactory 中的beanDefinitionMap里

Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第4张图片
可以看到bean名为key beanDefinition为value
并将beanname存入beanDefinitionNames以便后续bean的实例化
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第5张图片
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的装载等功能。
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第6张图片
getBean方法:多个getBean方法有按类型获取Bean的有按名称获取Bean的
isSingleton方法:用来判断Bean在SpringIOC中是否为单例(默认Bean为单例,也就是利用getBean方法返回的大多数是同一个对象)
isPrototype方法:与isSingleton方法相反,如果isPrototype为true,则getBean()创建一个新的Bean去返回给调用者
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第7张图片
6. ApplicationContext
如果把Spring比作汽车
BeanFactory是汽车的发动机
ApplicationContext就是汽车带离合器底盘等主要组件
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第8张图片
7.ApplicationContext功能
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第9张图片
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第10张图片
8. 整个SpringIOC容器UML图

Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第11张图片
AnnotationConfigServletWebSeverApplicationContext:SpringBoot默认的容器类
从run()方法一步步找到springboot默认运行了AnnotationConfigServletWebSeverApplicationContext
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第12张图片

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

创建ioc包,创建config与entity,并创建一个entity实例Person
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第13张图片
在config下创建一个ApplicationConfig,这个主要是告诉IOC容器如何去装配Person这个Bean
类加入Configuration注解IOC容器就会根据这个类里的方法进行容器中Bean的装配,方法(返回Bean实例的方法)加入@Bean注解
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第14张图片
下面我们运行run方法
因为run方法返回的实例继承自是ApplicationContext
我们用ApplicationContext来接收,接收后利用getBean方法获取Bean实例并打印
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第15张图片

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

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

Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第16张图片
@SpringBootApplication包含了@ComponentScan注解的功能所以不用添加了
@ComponentScan只能扫描当前包以及子包当中,如果是包外的FrameWorkApplication可以设置自动扫描去指定扫描路径(不说了)
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第17张图片

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

Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第18张图片
报空指针异常,代表相关注入没有被实现!
在这里插入图片描述
首先将Dog加入@Component标签,将Dog装载如SpringIOC当中
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第19张图片
在Person中的Pet加入@Autowired注解,会自动寻找Pet的实例Dog注入到Person中
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第20张图片

当Pet有两个实现类的时候可以用@Primary注解设置主要实例
Spring基础:Spring IOC 应用(Bean实例装配、依赖注入实例及原理分析)_第21张图片

你可能感兴趣的:(Spring)