SSM - Spring框架学习
概述
Spring框架主要的优势是在简化开发和 框架整合上,其主要内容包括以下几点:
简化开发:
- IOC
- AOP
- 事务处理
框架整合
- MyBatis
- MyBatis-plus
- Struts
- Struts2
- Hibernate
- ……
学习路线
- Spring的IOC/DI
- Spring的AOP
- AOP的具体应用,事务管理
- IOC/DI的具体应用,整合Mybatis
应用场景
- web、微服务以及分布式系统等
Spring全家桶:
- Spring Framework:Spring框架,是Spring中最早最核心的技术,也是所有其他技术的基础。
- SpringBoot:Spring是来简化开发,而**SpringBoot是来帮助Spring在简化的基础上能更快速进行开发**。
- SpringCloud:这个是用来做分布式之微服务架构的相关开发。
官网:https://spring.io,
系统架构图
Spring Framework的5版本目前没有最新的架构图,而最新的是4版本,所以接下来主要研究的是4的架构图
1.核心层
- Core Container:核心容器,这个模块是Spring最核心的模块,其他的都需要依赖该模块
2.AOP层
- AOP:面向切面编程,它依赖核心层容器,目的是==在不改变原有代码的前提下对其进行功能增强==
- Aspects:AOP是思想,Aspects是对AOP思想的具体实现
3.数据层
- Data Access:数据访问,Spring全家桶中有对数据访问的具体实现技术
- Data Integration:数据集成,Spring支持整合其他的数据层解决方案,比如Mybatis
- Transactions:事务,Spring中事务管理是Spring AOP的一个具体实现,也是后期学习的重点内容
4.Web层
- 这一层的内容将在SpringMVC框架具体学习
5.Test层
- Spring主要整合了Junit来完成单元测试和集成测试
核心概念
- IOC(Inversion of Control)控制反转:使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
- Spring技术对IOC思想进行了实现:Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的"外部"。
- IOC容器:负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象。
- Bean:被创建或被管理的对象在IOC容器中统称为Bean,IOC容器中放的就是一个个的Bean对象。默认情况下,Spring创建的Bean对象都是单例的(scope设置为singleton 或prototype)。
- DI(Dependency Injection)依赖注入:在容器中建立bean与bean之间的依赖关系的整个过程。例如,业务层需要依赖数据层,service就要和dao建立依赖关系。
介绍完Spring的IOC和DI的概念后,会发现这两个概念的最终目标就是:充分解耦,具体实现:
使用IOC容器管理bean(IOC)
在IOC容器内将有依赖关系的bean进行关系绑定(DI)
最终结果为:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。
Bean
Bean实例化
bean使用构造方法创建,Spring的IOC实例化对象的三种方式分别是:
- 构造方法(常用)
- 静态工厂(了解)
- 实例工厂(了解)
- FactoryBean(实用)
Bean生命周期
(1)Spring中对bean生命周期控制提供了两种方式:
- 在配置文件中的bean标签中添加
init-method
和destroy-method
属性 - 类实现
InitializingBean
与DisposableBean
接口,这种方式了解下即可。
(2)对于bean的生命周期控制在bean的整个生命周期中所处的位置如下:
- 初始化容器
- 1.创建对象(内存分配)
- 2.执行构造方法
- 3.执行属性注入(set操作)
- 4.执行bean初始化方法
- 使用bean
- 1.执行业务操作
- 关闭/销毁容器
- 1.执行bean销毁方法
(3)关闭容器的两种方式:
- ConfigurableApplicationContext是ApplicationContext的子类
- close()方法
- registerShutdownHook()方法
DI相关
Spring提供了两种注入方式,分别是:
- setter注入,提供可访问的set方法:setBookDao(BookDao bookDao)
- 简单类型
- 引用类型
- 构造器注入,BookServiceImpl(BookDao bookDao)
- 简单类型
- 引用类型
上述注入方式,不可避免地需要编写大量的配置文件,下面介绍一种更轻量方便的方法: 自动装配
自动装配方式:
- 按类型(常用):autowire="byType"
- 按名称
- 按构造方法
- 不启用自动装配
集合注入:
- 数组
- List
- Set
- Map
- Properties
编写方式,以数组为例:
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--数组注入-->
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
</bean>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
思考
- 为什么bean默认为单例?
- bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象,只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高。
- bean在容器中是单例的,会不会产生线程安全问题?
- 如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,
- 因为所有请求线程共用一个bean对象,所以会存在线程安全问题。
- 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,
- 因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
- 哪些bean对象适合交给容器进行管理?
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
- 哪些bean对象不适合交给容器进行管理?
- 封装实例的域对象,因为会引发线程安全问题,所以不适合。