学习目标

一、Spring简介

1 Spring课程介绍

问题导入

我们为什么要学习Spring框架?

1.1 为什么要学

image-20210729171139088

1.2 学什么

1.3 怎么学

image-20210729171346022

 

2 初识Spring

问题导入

目前我们使用的是Spring几版本?

2.1 Spring家族

image-20210729171850181

2.2 Spring发展史

image-20210729171926576

 

3 Spring体系结构

问题导入

通过系统架构图,Spring能不能进行数据层开发?Spring能不能进行web层开发?

3.1 Spring Framework系统架构图

image-20210729172153796

image-20210729172352627

3.2 Spring Framework课程学习路线

image-20210729172513669

 

4 Spring核心概念

问题导入

问题1:目前我们的代码存在什么问题以及怎么解决这些问题?

问题2:请描述什么是IOC,什么是DI?

4.1 目前我们代码存在的问题

image-20210729173516149

4.2 核心概念

image-20210729174148134

 

二、IOC和DI入门案例【重点】

1 IOC入门案例【重点】

问题导入

<bean>标签中id属性和class属性的作用是什么?

1.1 门案例思路分析

  1. 管理什么?(Service与Dao)
  2. 如何将被管理的对象告知IOC容器?(配置文件)
  3. 被管理的对象交给IOC容器,如何获取到IoC容器?(接口)
  4. IOC容器得到后,如何从容器中获取bean?(接口方法)
  5. 使用Spring导入哪些坐标?(pom.xml)

1.2 实现步骤

1.3 实现代码

【第一步】导入Spring坐标

【第二步】定义Spring管理的类(接口)

【第三步】创建Spring配置文件,配置对应类作为Spring管理的bean对象

==注意事项:bean定义时id属性在同一个上下文中(IOC容器中)不能重复==

【第四步】初始化IOC容器(Spring核心容器/Spring容器),通过容器获取Bean对象

1.4 运行结果

image-20210729184337603

 

2 DI入门案例【重点】

问题导入

<property>标签中name属性和ref属性的作用是什么?

2.1 DI入门案例思路分析

  1. 基于IOC管理bean
  2. Service中使用new形式创建的Dao对象是否保留?(否)
  3. Service中需要的Dao对象如何进入到Service中?(提供方法)
  4. Service与Dao间的关系如何描述?(配置)

2.2 实现步骤

2.3 实现代码

【第一步】删除使用new的形式创建对象的代码

【第二步】提供依赖对象对应的setter方法

【第三步】配置service与dao之间的关系

在applicationContext.xml中配置

2.4 图解演示

image-20210729183104748

 

三、Bean的基础配置

问题导入

问题1:在<bean>标签上如何配置别名?

问题2:Bean的默认作用范围是什么?如何修改?

1 Bean基础配置【重点】

配置说明

image-20210729183500978

代码演示

见《IOC入门案例》applicationContext.xml配置

运行结果

见《IOC入门案例》运行结果

 

2 Bean别名配置

配置说明

image-20210729183558051

代码演示

image-20210729191924626

打印结果

image-20210729191954870

 

3 Bean作用范围配置【重点】

配置说明

image-20210729183628138

扩展:scope的取值不仅仅只有singleton和prototype,还有request、session、application、 websocket ,表示创建出的对象放置在web容器(tomcat)对应的位置。比如:request表示保存到request域中。

代码演示

image-20210729192420048

打印结果

image-20210729192730871

最后给大家说明一下:在我们的实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。

 

四、Bean的实例化

问题导入

Bean的实例化方式有几种?

1 Bean是如何创建的【理解】

bean本质上就是对象,创建bean使用构造方法完成

 

2 实例化Bean的三种方式

2.1 构造方法方式【重点】

image-20210729194137151

==注意:无参构造方法如果不存在,将抛出异常BeanCreationException==

2.2 静态工厂方式

image-20210729195248948

image-20210729195009198

2.3 实例工厂方式

image-20210729200203249

image-20210729200240820

2.4 实现FactoryBean<T>方式【扩展,了解】

UserDaoFactoryBean中实例化什么类型的对象泛型就是该类型。

使用之前的AppForInstanceUser测试类去运行看结果就行了。注意配置文件中id="userDao"是否重复。

 

五、Bean的生命周期【了解】

问题导入

问题1:多例的Bean能够配置并执行销毁的方法?

问题2:如何做才执行Bean销毁的方法?

1 生命周期相关概念介绍

 

2 代码演示

2.1 Bean生命周期控制

2.2 Bean生命周期控制

测试类代码同《3.2.1 Bean生命周期控制》中的测试代码

 

3 Bean销毁时机

 

六、依赖注入(DI配置)

1 依赖注入方式【重点】

问题导入

依赖注入有几种方式?

1.1 依赖注入的两种方式

1.2 setter方式注入

问题导入

setter方式注入使用什么子标签?

引用类型

image-20210729203626540

简单类型

image-20210729203728173

1.3 构造方式注入

问题导入

构造方式注入使用什么子标签?

引用类型

image-20210729203859855

简单类型

image-20210729204006542

参数适配【了解】

image-20210729204117697

1.4 依赖注入方式选择

  1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
  2. 可选依赖使用setter注入进行,灵活性强
  3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
  4. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
  5. 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
  6. ==自己开发的模块推荐使用setter注入==

 

2 依赖自动装配【理解】

问题导入

如何配置按照类型自动装配?

2.1 自动装配概念

2.2 自动装配类型

依赖自动装配

配置中使用bean标签autowire属性设置自动装配的类型

依赖自动装配特征
  1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

 

3 集合注入

3.1 注入数组类型数据

3.2 注入List类型数据

3.3 注入Set类型数据

3.4 注入Map类型数据

3.5 注入Properties类型数据

说明:property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array>、<list>、<set>、<map>、<props>标签