什么是 IOC

(1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
(2)使用 IOC 目的:为了耦合度降低
(3)做入门案例就是 IOC 实现

IOC 底层原理

xml 解析、工厂模式、反射
IOC(概念和原理)_单实例

IOC(BeanFactory 接口)

1、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂
2、Spring 提供 IOC 容器实现两种方式:(两个接口)
(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用

  • 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
    (2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
  • 加载配置文件时候就会把在配置文件对象进行创建
    日常开发中,我们都使用ApplicationContext 去获取xml配置信息。

3、ApplicationContext 接口的实现类有哪些?
IOC(概念和原理)_单实例_02

对FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext 的解释
这两者的主要区别在于 读取xml文件的路径。
FileSystemXmlApplicationContext : 读取硬盘中的位置,即要加上盘符如:C://java/xxx.xml
ClassPathXmlApplicationContext: 直接读取当前工程下地址即可。
IOC(概念和原理)_xml_03

IOC 操作 Bean 管理(概念)

1、什么是 Bean 管理
Bean 管理指的是两个操作:
(1)Spring 创建对象
(2)Spirng 注入属性

2、Bean 管理操作有两种方式
(1)基于 xml 配置文件方式实现
(2)基于注解方式实现

IOC 操作 Bean 管理(基于 xml 方式)

1、基于 xml 方式创建对象
IOC(概念和原理)_xml_04
(1)在 spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建
(2)在 bean 标签有很多属性,介绍常用的属性

  • id 属性:唯一标识
  • class 属性:类全路径(包类路径)

(3)创建对象时候,默认也是执行无参数构造方法完成对象创建

2、基于 xml 方式注入属性
(1)DI:依赖注入,就是注入属性

3、第一种注入方式:使用 set 方法进行注入
(1)创建类,定义属性和对应的 set 方法
IOC(概念和原理)_创建对象_05
(2)在 spring 配置文件配置对象创建,配置属性注入
使用 <property></property> 标签完成属性注入,
name:类里面属性的名称
value:向属性注入的值
IOC(概念和原理)_spring_06
4、第二种注入方式:使用有参数构造进行注入
(1)创建类,定义属性,创建属性对应有参数构造方法
IOC(概念和原理)_配置文件_07
(2)在 spring 配置文件中进行配置

IOC(概念和原理)_单实例_08

IOC 操作 Bean 管理(xml 注入其他类型属性)

IOC(概念和原理)_spring_09

2、注入属性-外部 bean
1.创建一个UserService类 和 UserDaoImpl 类 和 UserDao接口
2.在UserService中注入UserDaoImpl,并且通过add()方法 再次调用 UserDaoImpl中的update方法
3.在spring配置文件中进行配置

IOC(概念和原理)_单实例_10

IOC(概念和原理)_spring_11

IOC(概念和原理)_配置文件_12

在未使用spring配置文件的情况下,我们是在UserService程序中创建一个UserDao的实现类,通过实现类去调用update方法,在使用spring之后,详细配置文件看下图所示:
IOC(概念和原理)_创建对象_13

3、注入属性-内部 bean
(1)一对多关系:部门和员工
一个部门有多个员工,一个员工属于一个部门
部门是一,员工是多
(2)在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

我们创建两个类,分别是Dept 部门类,Emp 员工类, 其中员工类的属性有Dept,代表着员工所在的部门信息具体类如下:
IOC(概念和原理)_配置文件_14
IOC(概念和原理)_xml_15

(3)在 spring 配置文件中进行配置
IOC(概念和原理)_配置文件_16

还有一种写法通过对象.属性的方式进行注入操作。该方法需要有对应的get方法,去得到这个属性
具体步骤如下所示

IOC(概念和原理)_配置文件_17

IOC 操作 Bean 管理(xml 注入集合属性)

1、注入数组类型属性
2、注入 List 集合类型属性
3、注入 Map 集合类型属性
(1)创建类,定义数组、list、map、set 类型属性,生成对应 set 方法
IOC(概念和原理)_单实例_18
(2)在 spring 配置文件进行配置
IOC(概念和原理)_xml_19

如何在List集合中,注入对象属性,即 List<Book> list; 要求这个集合当中的所有属性都是Book类型

1.创建Book类,提供set方法
IOC(概念和原理)_spring_20

2.在配置文件中进行配置,配置内容如下

IOC(概念和原理)_spring_21

把集合注入部分提取出来

(1)在 spring 配置文件中引入名称空间 util
IOC(概念和原理)_配置文件_22

(2)使用 util 标签完成 list 集合注入提取
IOC(概念和原理)_spring_23

(3) 完成对象对List集合属性的注入即对util标签的使用
其实也就是通过<bean> 标签创建对象,然后通过<property>标签对字段进行赋值操作
<ref>标签就是引入util标签内的内容。
IOC(概念和原理)_创建对象_24

IOC 操作 Bean 管理(FactoryBean)

1、Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
2、普通 bean:在配置文件中定义 bean 类型就是返回类型

3、工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型
IOC(概念和原理)_创建对象_25

IOC(概念和原理)_xml_26

IOC(概念和原理)_xml_27

IOC 操作 Bean 管理(bean 作用域)

1、在 Spring 里面,设置创建 bean 实例是单实例还是多实例
2、在 Spring 里面,默认情况下,bean 是单实例对象

IOC(概念和原理)_创建对象_28
3、如何设置单实例还是多实例
(1)在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
(2)scope 属性值
第一个值 默认值,singleton,表示是单实例对象
第二个值 prototype,表示是多实例对象
IOC(概念和原理)_配置文件_29

IOC(概念和原理)_创建对象_30
(3)singleton 和 prototype 区别
第一 singleton 单实例,prototype 多实例
第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
getBean 方法时候创建多实例对象