SpringBoot
背景介绍
在项目发展初期都是大多数都是单体应用,单体应用相比拆分后的系统架构来说,部署简单、测试容易。但是有明显的短板。
- 复杂性高:随着业务的不断迭代,项目的代码量会急剧的增多,项目模块也会随着而增加,模块与模块之间的关系就会变成的很复杂,整个项目就会变成的非常复杂,在新增和修改代码的时候都会做很多的测试,很容易会由于一处的变动影响之前业务的功能。
- 部署评率低:随便代码的增多,首先部署会越来越消耗时间,还有我们在修复一个很小很小的bug的时候整个项目都要重新部署,所以我们会集中一个时间点部署多个需求。
- 可靠性差:这个很容易理解,假如某个影响出现了死循环,导致内存溢出,会影响整个项目挂掉。
- 扩展性差:我们在新增业务的时候,代码层面会考虑在不影响现有的业务基础上编写代码,提高了代码的复杂性。
横向拆分:maven管理软件,根据项目的三个结构层次控制层依赖、业务层依赖、持久层,进行分模块的开发(多个人,有的开发控制层,有的开发业务层,有的开发持久层)
纵向拆分可以解决功能强耦合的问题,纵向拆分就是根据业务功能将系统的不同部分切分成独立运行的系统,相互间有数据调用根据接口访问.
而SpringBoot在解决包括项目耦合、并发集中在内的大部分问题而产生的一种基于Spring框架的,能够完成独立运行、自动配置的一种工具框架。
SpringBoot优势体现
- 独立运行的spring项目
springboot封装了spring所有的启动过程,可以通过简单的方法实现启动一个具备所有spring框架功能的进程.如果不做web应用.不需要tomcat这种外部容器来加载spring配置文件从而生成spring容器的过程.spring4.x时代,几乎将所有的配置内容都转化成了注解; - web应用(springboot)内嵌的servlet
不用配置任何tomcat插件.不用将项目发布到任何外部tomcat容器运行;直接在依赖中完成了默认的servlet容器整合.一旦启动了spring的独立运行的机制,可以加载内嵌的servelt实现web应用的独立运行 - springboot提供简化依赖,对主流开发包的无配置集成
根据开发人员依赖的不同内容,早就封装了简化依赖,实现依赖的传递性,例如,当开发一个web应用时,不考虑持久层,只需要依赖spring-boot-starter-web将会给你传递过来tomcat-embed,jackson,log4j,其他非常多的jar包; - springboot自动配置
默认自动的扫描范围:启动springboot工程,所有在扫描范围内的@Controller,@Service,@Autowired都会加载到内存中根据依赖完成相关自动配置:springboot可以根据在项目中完成的依赖资源引入,自动配置相关内容(根本看不到xml文件了);例如:引入了spring-boot-starter-web,springboot的自动配置就会判断功能是需要开发一个web应用,完成tomcat的自动加载,自动启动默认端口8080,例如:引入了spring-boot-starter-jdbc,mybatis等,springboot自动配置数据源(提供必要的条件 driverClass,url,username,password等)
有图如下:

springboot使用初始化
利用maven的父子继承,继承SpringBoot实现Spring Boot项目开发
- 在SpringBoot项目中的pom文件内声明父工程,代码如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version><!-- 版本号 -->
</parent>
<!-- 改变默认JAVA编译版本和编码 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
下图是springBoot的org.springframework.boot 组下提供的一些Starters
2. 声明启动类
@SpringBootApplication//springboot启动的核心注解
public class SpringBootTest01 {
/**
* spring boot封装了一个SpringApplication类中的静态方法run()
* 可以用来加载当前的运行环境,创建sprin框架的底层内容实现独立运行的spring容器
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(SpringBootTest01.class, args);
}
}
注意: Spring在3.x版本出现了组合注解的概念,例如包括@Controller和@ResponseBody的注解@RestController
SpringBoot的大显身手
一些衍生注解介绍
- @ComponentScan
前提程序能扫描加载这个注解,可以代替xml中<context:component-scan base-package="cn.tedu">
标签, 这个注解所在的类所在包就是base-package的值 - @Configuration(@ImportSources)
前提程序能扫描加载这个注解将一个spring的xml配置文件的内容转化成代码内容完成的配置类注解;代替一个独立的xml,在xml中所需要配置的所有,可以在这个类以@Bean表示 - @ConfigurationProperties
前提是被容器扫描加载到,可以根据这个注解的配置读取properties文件中的key=value的数据内容;一般配合Component注解实现加载;最重要的是可以实现加载到容器中的Key=Value的值根据Key的名称实现多级读取,多级读取的代码举例如下:
// 需要注入的类
@Component//容器一旦扫描,对象创建
@ConfigurationProperties(prefix="a.b")//读取内存中所有properties
//文件加载过来的key=value值,对属性进行set赋值
public class ConfigProperties {
public ConfigProperties(){
System.out.println("configProperties加载了");
}
private String name;
private String className;
private ConfigProperties02 center;
}
//假设容器在配置文件中读取到以下下键值对
a.b.name=zhao
a.b.className=1997
a.b.center.centerName=beijing
/**
* 此时容器会根据读取的prefix的值匹配Key将其赋值给对应的属性,而多级读取是将第三个对象引用
* 所在类的属性centerName的值赋为beijing
*/
- @ConditionalOnClass({A.class,B.class})
spring4.x出现的一个重要的自动配置的衍生注解,条件注解,前提扫描到条件注解时,根据加载的A.class,B.class判断当前配置是否生效,配合@Configuration完成。条件中指定的类,如果存在于当前环境中(包路径可以扫描),才加载反之不加载
SpringBoot运行过程和功能分析
- SpringBoot启动原理图

2. SpringBoot启动流程分析图

3. 简述加载
run方法加载

独立运行的特点已经执行成功,但是怎么将配置和注解自动扫描。我们需要的是
- 核心注解 @SpringBootApplication,这是一个组合注解主要包括
- @ComponentScan:启动类上添加的核心注解作用之一,对自定义的代码实现扫描范围的约束(启动类的同级包,下级包的所有spring注解的扫描)
- @EnableAutoConfiguration:springboot自动配置,根据依赖加载configuration类逻辑开启自动配置;所有依赖中需要配置springboot的情况都会在包中传递一个
**.**
.autoconfigure的jar包,例如我们依赖的starter-web就传递了一个spring-boot-autoconfigure的jar包。在包的META-INF文件夹中,存在一个spring.factories**的文件,当前依赖的自动配置想要让springboot加载的所有配置类信息。它是通过内部的@Import(EnableAutoConfigurationImportSelector.class)注解导入的seletor类实现的。这也就是为什么要将其他业务类放在启动了所在的下级或者同级包的缘故 - ***@SpringBootConfiguration***标识启动类也是配置类(配置类中有@ComponentScan就相当于xml里有个componet-scan标签)。读取springboot相关的配置文件包括:application.properties(全局配置文件)、banner.txt(启动横幅字符串)、bootstrap.properties(配置客户端的加载文件)
Springboot正确的打开方式
配置文件介绍
- application.properties
- application.yml(与楼上只存在一个,底层存储采用LinkedHasMap是有序的,楼上无序,)
- banner.txt
- 额外配置利用注解@ImportResource,在配置类的头导入额外的xml配置
整合Mybatis
- 导入依赖,根据SpringBoot的自动配置功能,此时项目无法正常加载。需要配置文件的属性
<!-- JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 整合MyBatis需要的依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
- 在配置文件application.properties配置属性
#datasource 数据源配置
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///test
spring.datasource.username=root
spring.datasource.password=root
#mybatis 配置
#别名包
mybatis.typeAliasesPackage=cn.zhao.pojo
#mapper映射文件所在
mybatis.mapperLocations=Classpath:mapper/*.xml
#驼峰命名开启
mybatis.configuration.mapUnderscoreToCamelCase=true
#mapper 抽象接口扫描,注解实现
#@MapperScan("包名")从而扫描mapper抽象接口所在包
- 愉快的的写代码吧(持久层啊)
解决使用Springboot后Jsp(我也不知道我为什么这么写,不都是HTML了吗。哪里还有JSP)文件不能直接解析(并不是很重要)
Jsp本质需要被Tomcat容器翻译成 .java文件的servlet代码的,倒是SpringBoot内嵌的Tomcat,无法直接解析Jsp文件,需要添加一些其他的依赖资源,解决不能直接对接的问题。依赖如下:
<!-- 解析SpringBoot的Jsp页面添加的依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>8.5.11</version>
</dependency>
此外,添加后工具以后,在配置文件中配置好我们需要的,SpringBoot提供的前后缀拼接功能所需要的字符串
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
SpringBoot项目的打包运行
如果没有插件支持,运行会会报出没有住清单的错误,需要插件支持,插件添加
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>