1.Spring简介
Spring是于2003 年兴起的一个轻量级的Java 开源框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design
中阐述的部分理念和原型衍生而来,为了解决企业应用开发的复杂性而创建的。
Spring框架的主要优势之一就是服务各自打包,允许使用者自由选择服务和定制服务。同时可以集成各种其他优秀的框架
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffnn9KEh-1603980194499)(assets/image-20201028070446607.png)]
从简单性、可测试性和松耦合的角度而言,任何Java
应用都可以从Spring
中受益。
Spring的核心是控制反转(IOC
)和面向切面(AOP
)。
简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-68mDuqxx-1603980194501)(assets/image-20200909195909915.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TcrtIAU5-1603980194503)(assets/image-20200909200005767.png)]
2.Spring 优势
-
容器性质,方便解耦,简化开发
Spring提供的
IoC
容器,可以将对象间的依赖关系交由Spring容器进行控制,避免硬编码所造成的过度程序耦合。 -
AOP编程的支持
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
-
声明式事务的支持
通过声明式方式灵活的进行事务的管理,提高开发效率和质量
-
集成各种优秀框架
Spring不仅不排除其他各种优秀的框架,同时对这些框架(Mybatis、Quartz等)提供了很好的支持
-
降低JavaEE API的使用难度
Spring对JavaEE API 进行了封装,使得这些API降低了使用难度
-
良好的设计,容易扩展,很多可重用的组件
3.Spring模块
由于Spring是一个具有容器性质的框架,因此Spring框架由大约20个模块组成的特性组成,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E0ALzESn-1603980194506)(assets/image-20201009162424400.png)]
4.Spring IoC
4.1.项目架构
思考: 之前项目使用三层架构是否存在问题?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-78WQpKYn-1603980194509)(assets/image-20200909165520086.png)]
这种架构虽然能够使项目解耦,但是三层之间的相互调用就会带来一个新的问题:
web
层调用service
层就是在web
层创建service
层对象,然后调用其方法service
层调用dao
层也是在service
层创建dao
层对象,然后调用其方法
如果每层之间掉用比较频繁,就会频繁的创建对象,增大资源的消耗,且每层与每层的耦合度还是相对较高。
为了更好的解耦,降低模块之间的依赖程度,我们尝试将对象创建的过程交给专门的对象创建工厂管理。工厂对象可以选择创建一个容器,将所有创建好的对象放入容器中,也可以每次返回给我们新的对象。这样当web
层想要调用service
层时,直接从容器中获取service
对象即可。其项目图如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XkryyUTA-1603980194511)(assets/image-20200909171150553.png)]
Spring IoC就是一个类似这样的容器
4.2 IoC简介
Ioc (Inverse of Control)
控制反转,将对象的创建以及对象直接的依赖关系反转给Spring 容器,程序本身不进行维护。如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rnJo3DpK-1603980194515)(assets/image-20201011183545095.png)]
4.3 准备工作
-
准备Spring 开发所需jar包
可以从官网下载提供的Spring 仓库中下载(https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release),也可以从提供的资料里面找到。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZYITu3Ii-1603980194518)(assets/image-20201028070710793.png)]
下载解压后可以看到:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5H5LHjVM-1603980194520)(assets/image-20201011184405345.png)]
- docs : Spring API 和 规范文档说明
- libs: jar包以及对应的源码
- schema: 约束
注意: 使用的Spring版本为 5.1.9.Release
-
将核心容器jar包以及辅助包导入项目lib目录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QClycglb-1603980194523)(assets/image-20201028071148764.png)]
commons-logging / log4j 属于日志工具
-
创建pojo类
内容如下:
package com.briup.ioc.basic; public class User { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }
4.4 基于xml配置
- 创建配置文件,名字为:
first.xml
,放入com.briup.ioc.basic目录下。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0ywuSBt-1603980194524)(assets/image-20201028071725606.png)]
-
给配置文件追加约束
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPUT7a2y-1603980194526)(assets/image-20201011192052332.png)]
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
-
在配置文件中添加需要被Spring容器管理的资源
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- bean标签的作用:用于配置让Spring容器创建对象 class : 要创建对象的全限定类名 id: 对象的唯一标识 --> <bean class = "com.briup.ioc.basic.User" id = "user"></bean> </beans>
-
测试
创建测试类
内容如下:
package ioc_day1; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.briup.ioc.basic.User; public class IOCTest_day1 { @Test public void first() { ApplicationContext ac = new ClassPathXmlApplicationContext( "com/briup/ioc/basic/first.xml"); User user = ac.getBean(User.class); System.out.println(user); } }
结果如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJXDZok5-1603980194529)(assets/image-20201028072532349.png)]
IoC容器细节
-
ApplicationContext
结构图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YyvAEj7p-1603980194531)(assets/image-20201011194054333.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ymf34fgj-1603980194533)(assets/image-20201011200215290.png)]
-
BeanFactory
和ApplicationContext
的区别Spring容器的顶层接口,ApplicationContext是其子接口
ApplicationContext接口,它由BeanFactory接口派生而来,包含BeanFactory的所有功能
BeanFactory 创建容器时不会创建对象,当从容器里面获取对象时才会创建
ApplicationContext 创建容器时就会创建对象
-
ApplicationContext
实现类[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXOOJ4PF-1603980194535)(assets/image-20201011201743451.png)]
-
ClassPathXmlApplication
从类的根路径下加载配置文件
-
FileSystemXmlApplication
从磁盘路径加载配置文件,配置文件可以在磁盘任何位置
-
AnnotationConfigApplicationContext
用注解配置容器对象时,需要使用此类来创建spring容器,后面会着重讲这个
-
-
获取对象细节
在配置文件中配置对象,没有唯一标识时,可以通过Class类型的对象来获取