|
|
## 一、spring是什么
|
|
|
spring是一个非常优秀的java框架,其目标是为了简化java企业级开发,内部包含了很多技术,比如:控制反转&依赖注入、面向切面编程、spring事务管理、通过spring集成其他框架、springmvc、springboot、springcloud等等
|
|
|
## 二、概念
|
|
|
### 1.容器
|
|
|
spring容器的概念,容器这个名字起的相当好,容器可以放很多东西,我们的程序启动的时候会创建spring容器,会给spring容器一个清单,清单中列出了需要创建的对象以及对象依赖关系,spring容器会创建和组装好清单中的对象,然后将这些对象存放在spring容器中,当程序中需要使用的时候,可以到容器中查找获取,然后直接使用。
|
|
|
|
|
|
### 2.IOC控制反转
|
|
|
使用者之前使用B对象的时候都需要自己去创建和组装,而现在这些创建和组装都交给spring容器去给完成了,使用者只需要去spring容器中查找需要使用的对象就可以了;这个过程中B对象的创建和组装过程被反转了,之前是使用者自己主动去控制的,现在交给spring容器去创建和组装了,对象的构建过程被反转了,所以叫做控制反转;IOC是是面相对象编程中的一种设计原则,主要是为了降低系统代码的耦合度,让系统利于维护和扩展。
|
|
|
|
|
|
### 3.DI依赖注入
|
|
|
依赖注入是spring容器中创建对象时给其设置依赖对象的方式,比如给spring一个清单,清单中列出了需要创建B对象以及其他的一些对象(可能包含了B类型中需要依赖对象),此时spring在创建B对象的时候,会看B对象需要依赖于哪些对象,然后去查找一下清单中有没有包含这些被依赖的对象,如果有就去将其创建好,然后将其传递给B对象;可能B需要依赖于很多对象,B创建之前完全不需要知道其他对象是否存在或者其他对象在哪里以及被他们是如何创建,而spring容器会将B依赖对象主动创建好并将其注入到B中去,比如spring容器创建B的时候,发现B需要依赖于A,那么spring容器在清单中找到A的定义并将其创建好之后,注入到B对象中。
|
|
|
|
|
|
### 4.AOP面向切面编程
|
|
|
|
|
|
## 三、原理
|
|
|
|
|
|
### 1.IOC容器
|
|
|
容器负责对象实例化、初始化,对象和对象之间依赖关系配置、对象的销毁、对外提供对象的查找等操作,负责对象的整个生命周期。
|
|
|
放到容器中的对象需要在xml或java注解配置,列出需要让ioc容器管理的对象,以及可以指定如何构建对象(init方法,destory方法,构造函数初始化等),当容器启动时就会加载这个配置文件,然后将这些对象给组装好以供外部访问。IOC容器也叫Spring容器,在源码中是一个Map
|
|
|
|
|
|
容器的使用步骤:
|
|
|
1. 引入spring相关maven配置或jar包
|
|
|
2. 创建bean配置文件,比如bean xml
|
|
|
3. 在bean xml文件中定义好需要spring容器管理的bean对象
|
|
|
4. 创建spring容器,并给容器指定需要装载的bean配置文件,当spring容器启动后,会加载这些配置文件,然后创建好配置文件中定义好的bean对象,将这些对象放在容器中以供使用
|
|
|
5. 通过容器提供的方法获取对象
|
|
|
|
|
|
#### 重要的接口
|
|
|
##### 1.BeanFactory
|
|
|
作为spring容器的顶层接口,提供了容器最基本的功能。
|
|
|
![[Snipaste_2023-02-14_14-43-52.png]]
|
|
|
其中getBean用于按照名称或类型查找bean并返回,isSingleton用于判断是否单例,getBeanProvider用于获取指定类型bean对象的获取器。
|
|
|
|
|
|
##### 2.ApplicationContext
|
|
|
通过ListableBeanFactory间接继承了BeanFactory,并进行了扩展,增加了很多功能,AOP、国际化等
|
|
|
![[Snipaste_2023-02-14_15-15-50.png]]
|
|
|
|
|
|
##### 3.ClassPathXmlApplicationContext
|
|
|
实现了ApplicationContext接口,并且容器可以从classpath加载Bean xml配置,然后创建xml中配置的bean
|
|
|
![[Snipaste_2023-02-14_19-51-09.png]]
|
|
|
|
|
|
##### 4.AnnotationConfigApplicationContext
|
|
|
实现了ApplicationContext接口,通过注解方式扫描并创建bean
|
|
|
![[Snipaste_2023-02-14_19-54-08.png]]
|
|
|
|
|
|
## 四、FAQ
|
|
|
#### 1.如何定义bean xml文件
|
|
|
`<bean id="bean唯一标识" name="bean名称" class="完整类型名称" factory-bean="工厂bean名称" factory-method="工厂方法">`
|
|
|
每个bean都有一个名称,叫做bean名称,bean名称在一个spring容器中必须唯一,否则会报错,通过bean名称可以从spring容器获取对应的bean对象。
|
|
|
|
|
|
##### bean名称别名定义规则
|
|
|
1. 当id存在的时候,不管name有没有,取id为bean的名称
|
|
|
2. 当id不存在,此时需要看name,name的值可以通过 ,;或者空格 分割,最后会按照分隔符得到一个String数组,数组的第一个元素作为bean的名称,其他的作为bean的别名
|
|
|
3. 当id和name都存在的时候,id为bean名称,name用来定义多个别名
|
|
|
4. 当id和name都不指定的时候,bean名称自动生成,生成规则下面详细说明
|
|
|
|
|
|
##### 例
|
|
|
![[Snipaste_2023-02-15_09-26-16.png]]
|
|
|
![[Snipaste_2023-02-15_09-28-15.png]]
|
|
|
|
|
|
|
|
|
#### 2.容器创建bean实例的方法
|
|
|
+ 通过反射调用构造方法创建bean对象
|
|
|
+ 通过静态工厂方法创建bean对象
|
|
|
+ 通过实例工厂方法创建bean对象
|
|
|
+ 通过FactoryBean创建bean对象
|