1、Spring的优缺点分析
参考视频3,文档。
Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。
除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。
spring缺点总结:
1、配置过于繁琐;
2、坐标导入容易出现冲突,较为麻烦。
2、SpringBoot的概述
2.1 SpringBoot解决上述Spring的缺点
SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想(即不配置的部分,我们直接使用约定的做法来做,减少 spring 的配置),可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
2.2 SpringBoot的特点
1) 为基于Spring的开发提供更快的入门体验;
2) 开箱即用,没有代码生成,也无需XML配置(使用默认值)。同时也可以修改默认值来满足特定的需求;
3) 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等;
4) SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式。其实就是SpringBoot在spring的基础上进行封装,使得我们可以更加方便地使用spring。即spring可以实现的功能,springboot都可以实现,只不过springboot由于进行封装,可以更加方便地实现!
2.3 SpringBoot的核心功能
SpringBoot的功能实际上就是在解决Spring中出现的2个问题:配置和依赖的问题,如下:
起步依赖:
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依
赖,这些东西加在一起即支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
自动配置:
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。
SpringBoot会自动帮我们判断一个对象内部需要什么东西,然后自动帮我们注入。
3、SpringBoot快速入门
3.1 springboot的代码实现
参考视频6,文档。
1 创建 Maven工程;
2 添加 Spring boot的起步依赖;
3 编写 Spring Boot引导类。注意,我们使用springboot,需要创建一个springboot的引导类作为程序入口;
4 编写 Controller;
5 测试
运行springboot引导类的main方法,如下:
访问 localhost:8080 ,出现如下页面,说明springboot内嵌的tomcat启动成功。(springboot内嵌的tomcat没有默认欢迎页面)
加上Controller类后,访问“http://localhost:8080/quick”,出现如下页面:
这里,我们就可以访问controller类,而这里我们没有做任何 springmvc 以及 spring 的配置,也没有配置Tomcat。之前如果使用 SpringMVC,需要配置 web.xml 以及 springmvc.xml,使用spring需要配置 applicationContext.xml,还需要配置Tomcat服务器。这里springboot底层帮我们全部实现。
1、编写 Spring Boot引导类 —— 提供springboot内嵌的tomcat服务器;
2、不需要编写配置类 —— springboot底层帮我们使用约定的配置,不需要我们手动配置。
3.2 springboot 快速入门的解析
参考视频8,文档解析。
1、@SpringBootApplication:标注SpringBoot的启动类,该注解具备多种功能(后面详细剖析)
2、SpringApplication.run(MySpringBootApplication.class) 代表运行SpringBoot的启动类,参数为SpringBoot启动类的字节码对象
3.3 SpringBoot工程热部署
我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大量的时间,我们可以在修改代码后不重启就能生效,在 pom.xml 中添加如下配置就可以实现这样的功能,我们称之为热部署。(参考视频9,文档)
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
dependency>
3.4 使用idea快速创建SpringBoot项目
参考文档,视频10.
4、SpringBoot原理分析
4.1 起步依赖原理分析
视频11,12,文档。
首先明确,springboot 是以功能为单位来导入依赖坐标的,比如我们需要使用web功能,就导入web功能的起步依赖,这个依赖底层就会集成 springmvc以及spring 的坐标。
分析spring-boot-starter-parent
在 “spring-boot-starter-parent” 中,如下配置默认导入我们的配置文件,如果没有配置文件,会按照默认配置执行。当然我们可以手动创建配置文件进行配置。
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
在当前依赖的爷爷依赖:“spring-boot-dependencies”中,一部分坐标的版本、依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了。所以起步依赖的作用就是进行依赖的传递。
我们定义“spring-boot-starter-parent”的版本为:2.0.1.RELEASE,在“spring-boot-dependencies”中,就会根据这个版本,给出其他技术的版本坐标。这样,前面使用其他各类技术导入坐标的时候可能出现的版本冲突的问题就解决了!因为“spring-boot-dependencies”中 有 ,这样就算我们子maven工程导入的技术坐标与父工程定义的不同,父工程的技术版本也会将我们导入的版本覆盖。
总结:“spring-boot-starter-parent” 的功能就是对一些技术进行版本的控制,解决导入不同版本的技术可能出现的版本冲突问题!
分析spring-boot-starter-web
我们导入 web 的起步依赖后,我们不需要再导入 spring 和 springmvc 的一堆坐标。从spring-boot-starter-web的pom.xml中我们可以发现,spring-boot-starter-web就是将web开发要使用的
spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。
总结:后期我们在开发某些功能的时候,只需要像web一样,导入某些功能的起步依赖就可以进行开发,而不需要导入一堆坐标!
4.2 自动配置原理解析
参考文档,视频13-15
springboot的默认配置就是把原先配置中一些默认的东西自动进行加载,这样我们就不需要创建配置文件进行配置。
@SpringBootApplication功能如下:
1、@Configuration注解的功能:@SpringBootApplication标注类就是 springboot 的启动类,其实 @SpringBootApplication 有@Configuration注解的功能,可以标注这个类是 spring 的配置类!
比如对于 MySpringBootApplication类,我们可以在这个类里面,像之前 spring 的配置类那样,创建方法进行如 DataSource 等的配置。
2、@ComponentScan注解的功能:会默认去扫描 启动类MySpringBootApplication类 所在包下的文件以及所在包的所有子包下的文件,将文件的对象加载到spring容器。参考下图。
3、@EnableAutoConfiguration :用于开启自动配置(主要参考视频14)。加载 spring.factories 文件,帮我们完成自动配置。
当然,我们也可以使用自己的配置文件去覆盖原来默认的配置(视频15),配置文件必须是 “**/application*.properties” 形式(也可以是yml文件)。
如何查找自动配置的属性?
找到 “spring.boot.autoconfigure” 的 “META-INF/spring-configuration-metadata.json”下面寻找相应的属性名,在自己的配置文件中将相应的属性值修改为自己需要的属性值即可。
5、SpringBoot的配置文件
5.1 SpringBoot配置文件类型
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置。
SpringBoot默认会从Resources目录下加载application.properties或application.yml(application.yaml)文件。其中,application.properties文件是键值对类型的文件,之前一直在使用,所以此处不在对properties文件的格式进行阐述。除了properties文件外,SpringBoot还可以使用yml文件进行配置,下面对yml文件进行讲解。
SpringBoot的配置文件,主要的目的就是对配置信息进行修改的,但在配置时的key从哪里去查询呢?我们可以查阅SpringBoot的官方文档:
官方文档
5.2 application.yml配置文件
YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。
YML文件的扩展名可以使用.yml或者.yaml。
其他内容参考文档,视频16-19
注意点:配置文件必须放置在 resources 目录下,springboot默认会去加载这个目录下的配置文件。“.properties”文件 的在 “.yml” 以及 “.yaml” 文件之后加载,因此 “.properties”文件的配置会覆盖 “.yml” 以及 “.yaml” 文件的配置。
语法
1)配置普通数据语法: key: value,value之前有一个空格;
2)配置 对象/Map 数据语法:
key:
key1: value1
key2: value2
或者:
key: {key1: value1,key2: value2}
如:
person:
name: haohao
age: 31
addr: beijing
#或者
person: {name: haohao,age: 31,addr: beijing}
注意:key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别
3)配置数组(List、Set)数据
语法:
key:
- value1
- value2
或者:
key: [value1,value2]
如:
city:
- beijing
- tianjin
- shanghai
- chongqing
#或者
city: [beijing,tianjin,shanghai,chongqing]
#集合中的元素是对象形式
student:
- name: zhangsan
age: 18
score: 100
- name: lisi
age: 28
score: 88
- name: wangwu
age: 38
score: 90
注意:value1与之间的 - 之间存在一个空格
5.3 配置文件与配置类的属性映射方式
参考视频20,21,文档,项目:SpringBoot_quickstart 下的 QuickController2类 、 QuickController3类。
我们在 配置文件中配置了某些自己的属性,配置文件会将这些属性加载到spring容器,我们可以通过 @Value注解 或者 @ConfigurationProperties注解 注入类的属性。
发现程序有如下的报错:我们没有 springboot注解配置的相应执行器,没有这个执行器我们也可以成功执行。配置参考视频22,加上这个执行器后,我们在配置yml配置文件的时候会有相应的提示。
6、SpringBoot与整合其他技术
6.1 SpringBoot整合Mybatis
参考文档,视频
1) 添加 Mybatis 的起步依赖;
2) 添加数据库驱动坐标;
3) 添加数据库连接信息,注意,相应的属性在 “spring.boot.autoconfigure” 的 “META-INF/spring-configuration-metadata.json”下面寻找,也可以查询官方文档;
4) 创建user表;
5) 创建实体Bean;
6) 编写 Mapper;
7) 配置 Mapper映射文件,我们这里使用配置文件开发,需要创建 UserMapper.xml;
8) 在 application.propertie中添加 Mybatis的信息,使得Mybatis与springboot整合,相应的属性到下图位置寻找;
9) 编写测试 Controller
10) 测试
6.2 SpringBoot整合Junit
步骤如下:(参考视频25)
1) 添加Jun的起步依赖;
2) 编写测试类;
3) 控制台打印信息。
6.3 SpringBoot整合Spring Data JPA
这部分大概知道就好,Spring Data JPA 框架我没有学,Spring Data JPA是持久层的框架,与Mybatis功能类似。
1) 添加 Spring data JPA的起步依赖;
2) 添加数据库驱动依赖;
3) 在 application properties中配置数据库和jpa的相关属性;
4) 创建实体配置实体;
5) 编写 UserRepository;
6) 编写测试类
6.4 SpringBoot整合Redis
参考视频27,步骤如下:
1) 添加redis的起步依赖;
2) 先启动 Redis 服务器,再配置redis的连接信息,使得我们的项目可以连接到Redis服务器;
3) 注入 RedisTemplate 测试 redis操作;