1:设计初衷
SpringBoot为我们开发者提供了一种更快速、体验更好的开发方式,我们可以开箱即用,无需像写Spring那样配置各种XML文件,虽然Spring3.0时引入了基于java的配置,但是编写这些配置无疑是在浪费大量时间,其实SpringBoot还内置Tomcat
2:核心功能
复制代码
一:独立的运行Spring
SpringBoot 可以以jar包形式独立运行,运行一个SpringBoot项目只需要通过java -jar xx.jar来运行
二:内置Servlet容器
Spring Boot可以选择内嵌Tomcat、jetty或者Undertow,这样我们无须以war包形式部署项目
三:简化Maven配置
SpringBoot提供了一系列的start pom来简化Maven的依赖加载,例如,当你使用了spring-boot-starter-web
四:自动装配
SpringBoot会根据在类路径中的jar包,类、为jar包里面的类自动配置Bean,这样会极大地减少我们要使用的配置。
当然,SpringBoot只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean,而SpringBoot
没有提供支持,则可以自定义自动配置
五:准生产的应用监控
SpringBoot提供基于http ssh telnet对运行时的项目进行监控
六:无代码生产和xml配置
SpringBoot不是借助与代码生成来实现的,而是通过条件注解来实现的,这是Spring4.x提供的新特性
复制代码
Spring Boot只是Spring本身的扩展,使开发,测试和部署更加方便
3:本文开发环境需求
SpringBoot 2.4.1正式发行版,要求Java8并且兼容Java15;对应的Spring版本是5.3.2;而且要求Maven 3.3+ 但是最好使用3.5.4稳定版本,而Servlet容器的版本为Tomcat9.0(Servlet Version 4.0)、Jetty 9.4(Servlet Version 3.1)、Undertow 2.0(Servlet Version 4.0)
二:SpringBoot入门搭建
1:手动搭建案例
我们以一个简单的SpringBoot案例来突显出Spring的繁琐,我接下来将使用SpringBoot来实现一个简单的带Controller的案例
复制代码
第一步:使用IDEA构建一个普通的Maven项目
第二步:在构建好的maven工程中对pom文件修改
第三步:编写启动引导类
第四步:编写Controller
第五步:访问(默认8080端口) 以本案例http://localhost:8080/index/test
复制代码
pom.xml里面添加相应坐标
启动引导类编写
Controller编写
2:使用Spring Initializr快速搭建
自动创建的Maven坐标说明
三:SpringBoot基本分析
1:坐标中starters分析及依赖管理
starter是依赖关系的整理和封装。是一套依赖坐标的整合,可以让导入应用开发的依赖坐标更方便。利用依赖传递的特性帮我们把一些列指定功能的坐标打包成了一个starter,我们只需要导入starter即可,无需导入大量坐标;每个Starter包含了当前功能下的许多必备依赖坐标这些依赖坐标是项目开发,上线和运行必须的。同时这些依赖也支持依赖传递。如下Starter:
复制代码
spring-boot-starter-web内部封装的一些列坐标
复制代码
封装成各个Starter的好处就是让我们更加专注于业务开发,无需关心依赖导入,依赖冲突,及依赖的版本
问:为什么导入的一些Starter不需要写版本呢?
不指定版本是因为maven有依赖传递的特性,可推测starter在父级定义了并锁定了版本;spring-boot-dependencies.xml 文件可以给大家一个答案;继承关系为 spring-boot-starter-parent.xml ==> spring-boot-dependencies.xml 这里面锁定了我们常用的坐标及Stater
编写SpringBoot项目继承spring-boot-starter-parent的好处和特点
①:默认编译Java 1.8
②:默认编码UTF-8
③:通过spring-boot-denpendencies的pom管理所有公共Starter依赖的版本
④:spring-boot-denpendencies通过Maven的依赖传递和版本锁定特性来实现版本管理
⑤:随用随取,不用继承父类所有的starter依赖。
POM文件中的Maven插件功能
复制代码
复制代码
补充:可选择的启动器官网介绍,需要则查询这个手册
2:自动配置(AutoConfiguration)分析
所有我们要配置的项目Pivotal团队的开发人员,帮我们写好了,怎么实现的,主要是通过@Configuration实现 SpringBoot采用约定大于配置设计思想,将所有可能遇到的配置信息提前配置好,写在自动配置的jar包中。每个Starter基本都会有对应的自动配置。SpringBoot帮我们将配置信息写好,存放在一个jar包中:spring-boot-autoconfigure-2.4.1.jar;jar包里,存放的都是配置类,让配置类生效的"规则类"
复制代码
接下来我来介绍一个我们常见的配置类
一:找到项目的External Libraries
二:查找Maven:org.springframework.boot:spring-autoconfigue:2.4.1
三:内部有个spring-boot-autoconfigue-2.4.1.jar
四:点击org ==> web ==> servlet ==> ServletWebServerFactoryAutoConfiguration类
@Configuration(proxyBeanMethods = false) //代表是个配置类 SpringBoot为我们提供的每个配置类都有此注解
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration { ... }
补充:我们回到之前点击META-INF ==> spring.factories 这里面配置的是SpringBoot的全部配置类
补充:我们回到之前点击META-INF ==> spring-configuration-metadata.json 这里面配置着各种配置类的信息参数
复制代码
问:SpringBoot提供这么多配置类,难道是程序运行后就全部导入吗?
不会全部导入,只会根据当前项目的需求选择性的装配所需的配置类,这也是SpringBoot的自动装配一大特性;我们也可以设想一下,一次性装配全部配置类,那该多慢呀;
问:SpringBoot怎么知道程序运行后就自动装配呢?
我们找到SpringBoot入口函数,点开 @SpringBootApplication 注解会发现里面有个 @EnableAutoConfiguration 这个注解就是开启自动配置的
问:开启自动装配后,它咋知道要加载指定配置呢?那么多配置类呢
我们继续看上面的 ServletWebServerFactoryAutoConfiguration 配置类
复制代码
@Configuration(proxyBeanMethods = false)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
//配置类能否被自动装配主要看 @ConditionalOnClass注解
//此注解是否可以加载到一个叫 ServletRequest.class文件,一旦存在则自动装配
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration { ... }
复制代码
有了自动配置后,那么基本全部采用默认配置(这也就是为啥说约定大于配置的思想);那么要修改默认配置也是可以的,我们只需在配置文件配置指定的参数即可 官方全部可配置属性 如下常见配置:
复制代码
# 端口配置
server.port=8888
# 配置context-path项目访问根路径
server.servlet.context-path=/demo
# 开启debug模式,详细日志输出,用于开发的一种设置 默认是false
debug=true
# 配置日志 logging.level.{指定包下的日志}=debug
logging.level.cn.xw=debug
复制代码
四:SpringBoot的配置文件
SpringBoot是约定大于配置的,配置都有默认值。如果想修改默认配置,可以使用application.properties或application.yml或application.yaml自定义配置。SpringBoot默认从Resource目录加载自定义配置文件。application.properties是键值对类型;application.yml是SpringBoot中一种新的配置文件方式,在使用自定义配置时名称一定要为application,因为是提前约定好的,而且三个后缀名的文件都写上是有个先后顺序,后面可覆盖前面
三种类型文件的配置方式
1:yml/yaml配置文件语法及使用
YML文件格式是YAML(YAML Aint Markup Language)编写的文件格式。可以直观被电脑识别的格式。容易阅读,容易与脚本语言交互。可以支持各种编程语言(C/C++、Ruby、Python、Java、Perl、C#、PHP)。以数据为核心,比XML更简洁。扩展名为.yml或.yaml 官方网站 在线properties转yml
复制代码
1:大小写敏感
2:数据值前边必须有空格,作为分隔符
3:使用缩进表示层级关系
4:缩进不允许使用tab,只允许空格
5:缩进的空格数不重要,只要相同层级的元素左对齐即可
6:"#"表示注释,从这个字符一直到行尾,都会被解析器忽略。
7:数组和集合使用 "-" 表示数组每个元素
复制代码
yml基本格式写法
2:配置文件与配置类属性映射
(1):java配置获取基本的配置文件信息.properties类型
基本数据获取.properties
(2):java配置获取基本的配置文件信息并注入.yml/.yaml类型
复制代码
1、使用注解@Value映射
@value注解将配置文件的值映射到Spring管理的Bean属性值,只能映射基本数据类型
2、使用注解@ConfigurationProperties映射
通过注解@ConfigurationProperties(prefix=''配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射。
使用@ConfigurationProperties方式必须提供Setter方法,使用@Value注解不需要Setter方法
注:使用@ConfigurationProperties要在主函数上开启@EnableConfigurationProperties
复制代码
POJO实体类
application.yml配置文件
复制代码
//通过web的方式加载程序运行
@RestController //结合@ResponseBody 和 @Controller 两注解
@RequestMapping("/index")
public class IndexController {
//注入
@Autowired
private Student student;
@RequestMapping("/test")
public String testMethod() {
System.out.println(student.toString());
//Student{
// id=1001,
// name='张三',
// address='安徽六安',
// hobbys=[baseball, basketball, volleyball],
// score={yuwen=[66, 88], shuxue=[85, 99]},
// teachers={yuwenTeacher=Teacher{name='张老师', message='教语文'},
// shuxueTecher=Teacher{name='李老师', message='教数学'}}}
return "Hello !!";
}
}
复制代码
五:SpringBoot与其它技术集成
1:SpringBoot集成MyBatis 建表语句
集成Mybatis完成查询全部
(1):使用注解方式完成集成
pom.xml文件
resources下的application.yml配置文件
POJO、Mapper、Service、Controller文件
注:使用http://localhost:8080/student/findAll访问,还有就是Mapper文件夹里面的代码一定要写在主函数类当前包及其子包下,如果不在则需要在入口类添加@MapperScan或者@MapperScans注解扫描一下,这个是mybatis提供的
(2):使用Mapper.xml映射完成集成
更改application.yml
在resources下创建mapper/StudentMapper.xml
删除之前在Mapper使用注解的SQL语句删除,只留方法
2:Spring Boot 集成 Redis
springBoot集成Redis后,以上个案例的基础上做个查询学生缓存,如果第一次查询则缓存到redis服务器里,然后从redis读取数据返回到客户端
更改StudentController
3:Spring Boot 集成定时器
使用SpringBoot完成一个简易的定时器,每5秒输出一下当前的时间到控制台;
首先在入口函数类上面加@EnableScheduling注解,代表开启定时器
编写定时器类
4:Spring Boot 集成Test单元测试
复制代码
复制代码
复制代码
//@RunWith(SpringRunner.class) 在老版的SpringBoot项目需要这个
//2.2.0.RELEASE以后,springboot测试类不再需要@Runwith的注解
@SpringBootTest //注明为SpringBoot测试类
class DemomybatissApplicationTests {
//注入StudentService对象
@Autowired
private StudentService studentService;
@Test
void contextLoads() {
System.out.println(studentService.findAll());
}
}
复制代码
5:Spring Boot 发送HTTP请求
要在SpringBoot内部发送HTTP请求就得用到RestTemplate模板,它是Rest的HTTP客户端模板工具类;对基于HTTP客户端进行了封装;还实现了对象与JSON的序列化与反序列化;不限定客户端类型,目前常用的3种客户端都支持:HttpClient、OKHttp、JDK原生URLConnection(默认方式)
入口函数类更改
编写RestTemplate发送Http请求测试类
6:扩展
SpringBoot除了上面几个集成外还集成 MongoDB、ElasticSearch、Memcached、邮件服务:普通邮件、模板邮件、验证码、带Html的邮件、RabbitMQ消息中间件、Freemarker或者Thymeleaf等等
六:SpringBoot打包部署
启动方式有两种,一种是打成jar直接执行,另一种是打包成war包放到Tomcat服务下,启动Tomcat
1:打成Jar包部署运行
注:pom文件里的
复制代码
/**
* 第一步:使用IDEA工具把写的代码通过maven的package打包
* 第二步:找到打包后的target文件夹里面,把xxx.jar包扔给测试
* 第三步:自己测试的话使用cmd执行下面命令,前提得检查自己的pom.xml文件中是否有springboot的maven插件
* java -jar xxxx.jar
* 补充:在运行的时候传递参数 通过main函数的args接收
* java -jar xxxx.jar --server.port=8888
* 补充:在运行的时候配置jvm参数,使占用更少的内存
* java -Xmx80m -Xms20m -jar xxxx.jar
*/
复制代码
2:打成War包部署运行
注:pom文件里的
复制代码
创建一个类如:ServletInitializer.java,继承 SpringBootServletInitializer ,覆盖 configure(),
把启动类 Application 注册进去。外部 Web 应用服务器构建 Web Application Context 的时候,
会把启动类添加进去。
//如下代码创建的类 除了类名和注册的启动类不一样,其它是固定写法
//WEB-INF/web.xml
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//DemoApplication是自己当前项目的主函数
return builder.sources(DemoApplication.class);
}
}
复制代码
七:SpringBoot热部署
我们在之前每次写完代码之后都要重新部署运行,这样特别浪费时间,其实SpringBoot是支持热部署的,但是我们得有相对应的参数配置,导入坐标
复制代码
检查当前的pom.xml必须有此配置才可以,然后正常启动运行即可
复制代码
当我们的代码写文运行后,后期更改了代码无需重写部署,只需要按CTRL+F9(Build Project),这是快速构建项目,或点击有上角的锤子;
如果还觉得麻烦,那就设置,一旦更改代码,IDEA失去焦点就自动构建代码,我们要设置一下IDEA配置
八:SpringBoot配置文件深入
1:多环境配置文件
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发dev、测试test、生产pro等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
(1):单文件的多环境配置
单个application.yml配置文件完成多环境配置 不推荐
(2):多文件的多环境配置
多文件配置多环境 推荐
(3):profile激活方式
在上面我介绍了使用配置文件来指定配置环境:spring.profiles.active=xx;可是这个是有局限性的,除了这种方式激活还要另外2种
配置文件: 再配置文件中配置:spring.profiles.active=dev
虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev
命令行参数:java –jar xxx.jar --spring.profiles.active=dev
优先级:命令行参数 > 虚拟机参数 > 配置文件
2:松散绑定
不论配置文件中的属性值是短横线、驼峰式还是下换线分隔配置方式,在注入配置时都可以通过短横线方式取出值;使用范围:properties文件、YAML文件、系统属性
松散绑定配置文件介绍
3:配置路径及其加载顺序
4:外部配置加载顺序 官方文档
外部加载顺序就是说在程序运行时加载外部的配置信息的顺序,如我们常用的命令行下指定额外信息 java -jar xxx.jar --server.port=8888
中文介绍
5:修改配置文件位置及默认名称
我们知道配置文件只能以application.yml/properties来定义,但是名称不一样是可以指定具体文件名,也可以把配置文件放入其它位置并指定都是可以的;指定的方式我以cmd下指定参数 java -jar xxx.jar --xxx -xxx 方式指定,或在IDEA里面指定-xxx参数
# 自定义配置文件名称
--spring.config.name=myApplication
# 指定配置文件存储位置 或 指定配置文件存储位置及配置文件名称
--spring.config.location=classpath:/myconfig/myApplication.yml
注:多个配置参数以空格隔开 --xxx -xxx
九:SpringBoot监听器
我们知道JavaEE包括13门规范,其中Servlet规范包括三个技术点:Servlet、Listener、Filter;而本章介绍的是监听器,监听器就是监听某个对象的状态变化;SpringBoot中的监听器有很多种:如下
①:CommandLineRunner 应用程序启动完成后
②:ApplicationRunner 应用程序启动完成后
③:ApplicationContextInitializer 程序运行初始化前
④:SpringApplicationRunListener 多功能监听器
1:对开发者有益的监听器
CommandLineRunner 监听器使用
ApplicationRunner 监听器使用
2:对框架开发者有意义的监听器 功能多
ApplicationContextInitializer 监听器使用
SpringApplicationRunListener 监听器使用
使用ApplicationContextInitializer/SpringApplicationRunListener监听器必看 配置一些信息才可使用
十:自动配置实现分析
我们在导入spring-boot-starter-web启动器无需其它配置就可以之间用,还有我们导入spring-boot-starter-data-redis启动器后可以直接使用@Autowired直接注入RedisTemplate对象,很奇怪吧,这就是SpringBoot自动配置特性,在下几节我慢慢引入
1:@Import注解进阶
当我们需要导入某个类到spring容器中去,但spring恰好无法扫描到这个类,而我们又无法修改这个类(jar包形式)。我们就可以通过@import(xxx.class)是将这个类导入到spring容器中
(1):直接导入
复制代码
//配置类 springConfig
@Configuration
@Import(value={DateConfig.class}) //直接导入
public class SpringConfig { }
//普通类,里面有个@Bean注入方法 DateConfig
//被任何一个配置类引用,当前自己类也变为子配置类
public class DateConfig {
//创建时间对象放入容器
@Bean
public Date createDate() { return new Date(); }
}
复制代码
(2):通过配置类导入
复制代码
@Configuration
public class SpringConfig {
//创建时间对象放入容器
@Bean
public Date createDate() { return new Date(); }
}
@SpringBootApplication
@Import(value={SpringConfig.class}) //导入配置类
public class LintenerDemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(LintenerDemoApplication.class, args);
//打印时间对象
System.out.println(run.getBean(Date.class));
}
}
复制代码
(3):通过ImportSelector接口实现类导入 高级方式
使用ImportSelector接口
2:@Configuration注解进阶
相对这个注解大家肯定不陌生,只要是Spring注解配置类都有这玩意;其实只要添加@Configuration注解的类里面可以衍生出各种条件注解供我们使用,前提只能在注解类下使用,它就是@Conditional条件注解,这个条件注解又衍生出各种详细的条件注解
注:@EnableAutoConfiguration 其本质是 @Import 和 @Configuration的组合
复制代码
一:class类条件
@ConditionalOnClass == 存在指定类条件
@ConditionalOnMissingClass == 不存在指定类条件
二:属性条件
@ConditionalOnProperty == 属性条件,还可以为属性设置默认值
三:Bean条件
@ConditionalOnBean == 存在Bean条件
@ConditionalOnMissingBean == 不存在Bean条件
@ConditionalOnSingleCondidate == 只有一个Bean条件
四:资源条件
@ConditionalResource == 资源条件
五:Web应用条件
@ConditionalOnWebApplication == web应用程序条件
@ConditionalOnNotWebApplication == 不是web应用程序条件
六:其他条件
@ConditionalOneExpression == EL表达式条件
@ConditionalOnJava == 在特定的Java版本条件
复制代码
@Configuration还有一些加载顺序的方式
1:@AutoConfigureBefore==在那些自动配置之前执行
2:@AutoConfigureAfter==在那些自动配置之后执行
3:@AutoConfigureOrder==自动配置顺序
(1):@ConditionalOnClass 与 @ConditionalOnProperty 介绍
复制代码
@ConditionalOnClass注解属性介绍
Class>[] value():以类的class形式的数组
String[] name():以类的全路径名的字符串数组
@ConditionalOnProperty注解属性介绍
value 和 name:数组,获取对应property名称的值,它们只能存在其中一个
prefix:配置属性名称的前缀,比如spring.http.encoding
havingValue:可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
matchIfMissing:缺少该配置属性时是否可以加载。如果为true,没有该配置属性时也会正常加载;反之则不会生效
复制代码
案例讲解注解
RedisTemplate自动注入分析
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com