Spring框架之IOC控制反转

169 阅读7分钟

IOC介绍

IOC控制反转
(IOC不是一门技术,而是一种设计思想)

含义:把对象创建和对象之间的调用过程,交给Spring管理。对于某一个具体的对象而言,以前是它控制其他对象,现在是所有对象都被Spring IOC控制\

使用IOC目的:减低计算机代码之间的耦合度,依赖注入。

耦合性(英语:Coupling,dependency,或称耦合力或耦合度)是一种软件度量,是指一程序中,模块及模块之间信息或参数依赖的程度。

IOC的底层原理

  • 1.xml解析
  • 2.工厂模式
  • 3.反射

OA%6@@_`}%4X9$D9OKN8F_0.png

降低耦合度

`%C~H%J98JPW2HUB6_NDJL1.png

这里伙伴们可能没懂什么是耦合。 注意看,没有工厂时,我们更改了UserDao的类名。那么就所有调用该对象的类都得改。就是很耦合。

有了工厂后,只需要更改工厂里的创建对象的类名就解耦了。

原来修改对象的实现方式需要去各个类分别改,使用了工厂模式就能在工厂类为全部类修改了,维护更简单

IOC过程

第一步:xml配置文件,配置创建的对象

<bean id="dao" class="com.atguigu.UserDao"></bean>

第二步:有service类和dao类,创建工程类

GI}7IGR{R96Q}WHJT0X68EH.png

IOC接口

IOC容器底层就是对象工厂
spring提供了IOC容器实现的两种方式(两个接口)

  • (1)BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供发给开发人员使用

    • 加载配置文件时候会创建对象,在获取对象(使用时)才会创建对象
  • (2)ApplicationContext:BeanFactory的子接口,提供更多更强大的功能,一般由开发人员进行使用 ApplicationContext继承了beanfactory,可以用beanfactory替换application

    • 加载配置文件时候会把配置文件对象进行创建

    • 两种方式在加载配置文件的时候,对象都会被创建,但BeanFactory设置的是惰性加载(懒加载是用的时候加载,饿加载是一开始就直接执行)

在BeanFactory中,

绿色标识为接口,蓝色标识为实现类 ConfigurableApplicationContext包含BeanFactory的扩展功能

1661742725537.png

在ApplicationContext中,

以下两个是ConfigurableApplicationContext的主要实现类 image.png

IOC操作Bean管理

1.Bean管理是什么?两个操作

  • Spring创建对象
  • Spring属性注入

2.Bean管理操作的两种方式

  • 基于XML配置文件方式实现
  • 基于注释方式实现

一、基于XML配置文件方式实现

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

  • 1.基于xml方式创建对象
<bean id="dao" class="com.atguigu.UserDao"></bean>

(1)在Spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
(2)在bean标签中有很多属性,介绍常用的属性 - id属性:唯一标识 - class属性:类全路径(包类路径) - 创建对象时,默认使用无参构造方法方法完成对象创建

  • 2.基于xml方式注入属性

2. DI:依赖注入,注入属性

第一种: set方法,main方法

1661744385721.png

1661747331473.png

第二种:有参构造注入

(1)创建类,定义属性。创建属性对应有参数构造方法

image.png 1661747663887.png

(2)在Spring配置文件中进行配置

1661747832480.png

第三种:p名称空间注入

可以简化基于xml配置方式

(1)添加p名称空间在配置文件中 1661748351148.png (2)进行属性注入,在bean标签里面进行操作 1661748425686.png

  • 3.xml注入其他类型属性

1.null值

image.png

2.属性值包含其他特殊符号

1661753641285.png

第四种:

  • 注入属性--外部bean

(1)创建两个类:service类和dao类

1661754034680.png

(2)在service调用dao里面的方法

1661754065370.png

1661754307768.png

(3)在Spring配置文件(.xml)中进行配置

1661754403512.png

  • 注入属性--内部bean

(1)一对多关系

(2)在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

(3)在Spring配置文件中配置

1661755286602.png

第五种:xml注入集合属性

1.注入数组类型属性

2.注入list集合类型属性

3.注入map集合类型属性 image.png

1661756647592.png

1661756687855.png

1661756765600.png

第六种:把集合注入部分提取出来

(1)在spring配置文件中引入名称空间util

1661758656521.png

1661758800332.png

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

Spring有两种类型,一种普通bean,另外一种工厂bean(FactoryBean)

普通bean:定义什么类型就返回什么类型
FactoryBean:在配置文件中定义的类型和返回的类型可以不同
步骤:
1.创建类,让这个类作为工厂bean,实现接口FactoryBean
2.实现接口的方法,在实现的方法中定义返回的bean类型

*FactoryBean接口,可以让用户通过实现该接口来自定义该Bean接口的实例化过程。即包装一层,将复杂的初始化过程包装,让调用者无需关系具体实现细节。

1661759556768.png 定义为MyBean但返回了Course

bean的作用域 在spring中,默认情况下,bean是单实例对象

如何设置单实例还是多实例?

用scope属性
singleton(单实例)
prototype(多实例)

singleton和prototype的区别

设置scope值是singleton时候,加载 spring配置文件时候就会创建单实例对象
设置scope值是prototype时候,不是在加载spring 配置文件时候创建对象,在调用getBean 方法时候创建多实例对象

单实例是因为把id作为key,然后创建一个bean实例作为value放进了一个map中,根据id在map中取,所以每次都是取到同一个实例

bean的生命周期

从对象创建到销毁的过程
过程:
1.通过构造器创建bean实例(无参数构造)
2.为bean的属性设置值和对其他bean的引用(调用set方法)
3.把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
4.调用bean的初始化的方法(需要进行配置)
5.把bean实例传递bean后置处理器的方法postProcessAfterInitialization
6.bean可以使用了(对象获取到了)
7.当容器关闭时,调用bean的销毁方法(需要进行配置销毁的方法)

xml自动装配

1.什么是自动装配?根据指定的装配规则(属性名或者属性类型),Spring自动将匹配的属性值进行注入
手动装配:

1661763324555.png

自动装配:

(1)根据属性名称自动注入 1661763436223.png

(2)根据属性类型自动注入

1661763672365.png 自动注入两个,byname的id要和属性一样,多个属性可写多个bean,bytype根据属性类型,有重复报错

外部属性文件

1.直接配置数据库信息

(1)配置德鲁伊连接池
(2)引入德鲁伊连接池依赖

1661766867101.png 2.引入外部属性文件配置数据库连接池

(1)创建外部属性文件,properties格式文件,写数据库信息

1661767059194.png (2)把外部properties属性文件引入到Spring配置文件中 *引入context名称空间

1661768491385.png

二、基于注释方式实现

1.什么是注解?

注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值) 使用注解,注解作用在类上,方法,属性 使用注解目的:简化xml配置

2.Spring针对Bean管理中创建对象提供注解

(1)@Component
(2)@Service(用于业务逻辑层)
(3)@Controller(外部层)
(4)@Repository(DAO层)
四个注解功能相同,都可以用来创建bean实例\

3.基于注解方式实现对象创建

步骤:
a.引入依赖
b.开启组件扫描
1661780799230.png c.创建类,在类上面添加创建对象注解
1661780838794.png 4.开启组件扫描细节配置 1661781171373.png

1661781209745.png *留意include和exclude

5.基于注解方式实现属性注入 (1)@AutoWired:根据属性类型进行自动装配

  • 创建service和dao对象,在两个类添加对象注解
  • 在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解

1661782164206.png 推荐写一个setter方法,并将AutoWire写在setter方法上,这样就算注入空值也不会报错

(2)@Qualifier:根据属性名称进行注入 要和@AutoWired一起使用

(3)@Resource:可以根据类型注入,也可以根据名称注入

1661782528892.png (4)@Value: 注入普通类型属性

1661782627553.png

6.完全注解开发
(1)创建配置类,代替xml文件
建包,创类,加上@Configuration代替xml文件,加上@ComponentScan

1661783195138.png

(2)编写测试类

1661783326754.png