使用idea 搭建一个 SpringBoot + Mybatis + logback 的maven 项目(One)
Spring 四大特性:
- starter 一个功能依赖
- Automatic configuration 自动配置
- cli 操作
- 监控容器
1. 含义:简化Spring应用开发,一个快速开发框架
2. 官网:https://spring.io/projects/spring-boot
3. 作用:
(1) 解决J2EE笨重的开发,繁多的配置,低下的开发效率,复杂的部署流程,第三方技术集成难度大
(2) Spring全家桶 时代
(3) Spring boot =》J2EE一站式解决方案
(4) Spring cloud =》分布式整体解决方案
4. 三大特性==》
(1) 组件自动装配:Web MVC,Web Flux,JDBC
(2) 嵌入式Web容器:tomcat,jetty,Undertow
(3) 生产准备特性:指标,健康检查,外部化配置
5. 优点:
(1) 快速构建独立运行的Spring项目
(2) 无须依赖外部Servlet容器,应用无需打成WAR包;项目可以打成jar包独自运行
(3) 提供 一系列 starter pom 来简化 Maven 的依赖加载;
(4) 大量的自动配置,对主流开发框架的无配置集成;
(5) 无须配置XML,开箱即用,简化开发,同时也可以修改默认值来满足特定的需求;
(6) Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式;
(7) 极大提高了开发、部署效率
(8) 与云计算的天然集成
6. @SpringBootApplication 用于标识 一个引导类,说明 当前是一个 SpringBoot项目
7. SpringBoot与SpringMVC的关系
(1) SpringBoot的WEB组件集成SpringMVC框架
(2)
8. springboot原理分析
(1) 通过Maven父子依赖关系
(2) 从spring3.0以后提供注解,springMVC内置注解加载整个springMVC容器
(3) 使用Java代码编写SpringMVC配置初始化
(4) 再使用java语言创建tomcat容器,加载class文件
9. 微服务:解析==》架构风格(服务微化)
10. 在maven的conf的setting.xml配置文件添加以下配置的profiles标签
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
11. 导入的jar包
12. 开发步骤
(1) 创建一个maven工程==》不勾选任何工程
(2) 导入依赖的spring-boot的jar包
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<type>pom</type>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
(3) 编写主程序,启动spring-boot应用
(4) @SpringBootApplication 来标注一个主程序,说明这是一个spring boot应用
(5) 编写相关的service,controller等逻辑代码
(6) 主程序:启动
(7) 简化部署
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
打包成:项目名.jar
在doc命名:java -jar 项目名.jar
13. 快速创建spring-boot项目==》步骤
(1) File ==》 News ==》New Project ==》Spring Initialzer
14. 前端控制器上的@Controller和@ResponseBody ==》可以用@RestController
15. EnableAutoConfiguration
(1) 注解启动类
(2) 作用:扫包范围 默认在当前类里面
(3) 缺点:只扫当前类,别的类扫不到
16. 配置文件
(1) resources文件夹目录结构
① Static:保存所有的静态资源==》js,css,images
② Templates:保存所有的模板页面;(spring-boot内置默认不支持JSP页面,要想支持就一定是war包,然后导入相应的pom依赖);
1) 模板引擎:
a. Freemarker
b. Velocity
c. thymeleaf
③ Apllcation.properties:Spring-boot应用的配置文件
(2) Spring-boot全局配置文件
Application.properties
编写格式
实体类.属性值 =value
实体类.集合=value,value,.......
Application.yml ==》标记语言
解析:以数据为中心,配置数据的时候具有面向对象的特征,比json,xml等 更适合做配置文件
作用:修改SpringBoot自动配置的默认值
yml基本语法
K+:+空格+v+空格+:表示一堆键值对
案例:
Server:
Port:6060
Path:/项目名或者前端控制器的@RequestMapper的value 值
类属性值
实体类:
属性值:value
Map: {key:value}
list:
- value
- value
对象
属性值: value
在实体类上加注解@ ConfigurationProperties(prefix = ‘实体类’) ==》 把实体类的属性值绑定yml上的值
把@ ConfigurationProperties(prefix = ‘实体类’)组件加到容器中 @Component(在实体类上加)
17. Spring-boot单元测试类解析
(1) @RunWith(SpringRunner.class) ==》spring的驱动器
(2) @SpringBootTest==》Springboot单元测试
18. @Value和@ConfigurationProperties的区别
19. @ ConfigurationProperties(prefix = ‘实体类’)==》扫描所有配置文件
20. @PropertySource:加载指定的指定单个配置文件
解析:@PropertySource(value={“classpath”:xxx.properties})
21. @ImportResource(location:”xxx.xml”):导入Spring的配置文件(applicationContext.xml)
不推荐使用,使用全注解方式配置
推荐使用配置类的方式来添加组件
22. 配置文件占位符 ==》properties配置文件上使用
(1) 随机数
${random.value}
(2) 占位符获取之前所配置的值,如果没有可以值,可使用指定的默认值
${实体类.属性值}value
${实体类.属性值:默认值}value
23.Profile
(1) 含义:是Spring对不同环境提供不同配置功能的支持,可以通过激活指定的环境
(2) 作用:开发、测试等多环境
(3) 用法
Properties格式的配置文件
Application.properties ==》默认配置文件
比如里面的内容是
Server.port=6060
#激活开发环境
Spring-profiles.active=dev
#激活生产环境 ==》一样的用法
Application-dev.properties ==》开发环境
比如里面的内容是
Server.port=5050
Application-pro.properties==》生成环境
比如里面的内容是
Server.port=3030
yml格式的配置文件
应该这样写
#默认端口号环境
Server:
Port:8080
#激活对应的端口号,比如激活开发环境
Spring:
Profiles:
Active:dev
---
#开发环境
Server:
Port:6060
Spring:
Profiles:dev
---
#测试环境
Server:
Port:3030
Spring:
Profiles:prod
命令行方式
方式1:Edit==》Program arguments
--spring.profiles.active=dev 或者prod
方式2:Edit==》VM options
--Dspring.profies.active=dev 或者prod
注意:建议把配置application.properties文件放在resources/config下,优先 级最高
24.自动配置原理
SpringBoot启动的时候加载主配置类,开启了自动配置功能==》 @EnableAutoConfiguration
@EnableAutoConfiguration作用:
利用EnableAutoConfigurationImportSelector给容器中导入一些组件
可查看SelectImports()方法的内容
List<String> configuration=getCandidateConfigration(annontationMetatada,attribute);
获取候选的配置
SpringFactoriesLoader.loadFactoryNames():扫描所有jar包类路径下 META-INF/spring.factories,把扫描到文件内容包装成properties对象
从properties中获取到EnableAutoConfiguration.class类(类名)对应的值, 然后把他们添加到容器中
总概括一句话:将类路径下META-INF/spring.factories里面的所有 EnableAutoConfiguration的值加入到容器中。
25.SpringBoot的SpringMVC自动配置原理
(1) SpringBoot自动配置了ContentNegotiatingViewResolver 和 BeanNameViewResolver这个两个beans
(2) 这连个Beans主要是作为视图解析器==》视图解析器的作用就是根据方法的返回值获取视图对象view,从而确定如何渲染
(3) 通过ContentNegotiatingViewResolver : 组合所有的视图解析器
(4) 自动注册 Converter , GenericConverter ,Formatter这三个Beans
(5) 对 HttpMessageConverters 的支持
(6) 自动注册 MessageCodesResolver
(7) 自动注册 ConfigurableWebBindingInitializer 。
26.Webjars:以jar包的方式引入静态资源
网站:https://www.webjars.org/
访问以下maven
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1-1</version>
</dependency>
静态资源文件夹==》都放在resources文件里
“classpath:/META-INF/resources”,
“classpath:/resources”,
“classpath:/static”,
“classpath:/public/”
“/:当前项目的根路径”
27.模板引擎
(1) JSP
(2) Velocity
(3) Freemaker
(4) Thymeleaf==》推荐使用
① 使用步骤
1) 导入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2)使用
@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8;
//把html页面放在classpath:/templates/下,就会自动渲染
public static final String DEFAULT_PREFIX = "classpath:/templates/";
//去除后缀
public static final String DEFAULT_SUFFIX = ".html";
语法:
在html页面的<html>标签里导入命名空间
xmlns:th="http://www.thymeleaf.org"==》作为自动提示功能
语法请查看API文档
28. 国际化==》<中文 转 英文>
(1) 文件命名:i18n
国际化配置文件:页面名.properties
中文:页面名_zh_CN.properties
英文:页面名_en_US.properties
(2) 步骤:
① 编写国际化配置文件,抽取页面显示的
② 使用ResourceBundleMessageSource管理国际化资源文件
Spring-boot已自动配置好管理国际化资源文件的组件
@Configuration
@ConditionalOnMissingBean(value = MessageSource.class, search = SearchStrategy.CURRENT)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Conditional(ResourceBundleCondition.class)
@EnableConfigurationProperties
public class MessageSourceAutoConfiguration {
private static final Resource[] NO_RESOURCES = {};
@Bean
@ConfigurationProperties(prefix = "spring.messages")
public MessageSourceProperties messageSourceProperties() {
return new MessageSourceProperties();
}
@Bean
public MessageSource messageSource() {
MessageSourceProperties properties = messageSourceProperties();
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
if (StringUtils.hasText(properties.getBasename())) {
//设置国际化资源文件的基础名(去掉语言国家代码的) messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(
StringUtils.trimAllWhitespace(properties.getBasename())));
}
③ 在页面使用fmt:message去除国际化内容
国际化原理:国际化Locale<区域信息对象>;LocalResolver<获取区域信息对象>
源码解析:
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
public LocaleResolver localeResolver() {
if (this.mvcProperties
.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.mvcProperties.getLocale());
}
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
return localeResolver;
}
默认的就是根据请求头带来的的区域信息获取Locale进行国际化
④ 点击链接切换国际化
1) IDEA小功能:页面修改完成后ctrl+F9,重新编译
29. 防止重复提交最好的办法:重定向
30. 公共部分抽取
(1) 转义行内写法:[[~{ }]]
(2) 不转义行内写法:[(~{ })]
31. 错误处理机制
(1) 原理
参考ErrorMvcAutoConfiguration;错误处理的自动配置
看一下ErrorPageCustomizer错误页面定制器
当应用出现了4xx或5xx之类的错误 ,ErrorPageCustomizer就会被激活,它 主要用于定制错误 处理的响应规则,就会发送一个/error请求,它会交给 BasicErrorController进行处理
BasicErrorController 就会接收 /error 请求处理。
BasicErrorController 会接收一个/error请求, 两个 方法处理,第1个 erroHtml响应html数据, 还有一个error用来响应json数据 的, 使用了 ErrorViewResolver (DefaultErrorViewResolver)组件进行封装视图
DefaultErrorViewResolver 去解析具体响应的错误页面。
DefaultErrorAttributes 错误页面可获取到的数据信息
通过 BasicErrorController 的方法中响应的 module 可定位到响应哪些数 据,从而引出 ErrorAttributes 的实现类 DefaultErrorAttributes , DefaultErrorAttributes 中绑定的所有值都可在页面获取到。
32. 配置嵌入式Servlet容器
(1) SpringBoot默认是用嵌入式的Servlet容器==》tomcat
(2) 注册Servlet、Filter、Listener
① ServletRegistrationBean :注册自定义Servlet
② FilterRegistrationBean :注册自定义Filter
③ ServletListenerRegistrationBean :注册自定义Listener
(3) 其他的Servlet容器
① Jetty(用于长连接,比如聊天功能)
② Undertow(不支持JSP)
(4) 优缺点:
① 优点:简单,便捷
② 缺点:默认不支持JSP,优化定制比较复杂
------------------------------------------------------------------------------------------------------
(5) Spring-Boot与关系型数据库的关系==》JDBC,MyBatis,Spring-Data,JPA
① 导入的配置解析:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
② 自动配置原理参考:Ctrl+N查看DataSourceConfiguration的类
33.缓存==》JSR107缓存机制
(1) Xxx
① CachingProvider:缓存提供者,管理和控制多个缓存CacheManger管理器
② CacheManger:缓存管理器管理很多缓存Cache
③ Cache:缓存
④ Entry:缓存的记录
⑤ Expiry:有效期
(2) 导包:
<!-- https://mvnrepository.com/artifact/javax.cache/cache-api -->
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.0</version>
</dependency>
(3) 缺点:使用复杂
34.Spring缓存抽象
(1)步骤
① 开启缓存:@EnableCaching
② 然后在对应的方法上加上@Cacheable==》用于查询
1)属性
a. cacheNames/value:指定缓存的名字
b. Key=”#id”==》参数的值
a) 或者:#root.methodName+’[’+#id+’]’
c. Condition:指定符合条件的情况下才缓存
d. CacheManger:缓存管理器管理很多缓存Cache
e. Unless:否定缓存
f. Sync:是否使用异步模式
③ 在配置类上写对应的方法并加入到组件上
(2)原理:
简单来说:@Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,如果没有就运行方法,并将结果放入到缓存。以后再来调用就可以直接使用缓存中数据
(3) @CachePut:既调用方法,又更新缓存数据==》用于修改
(4) @CacheEvict:缓存清除==》用于删除
① 属性:allEntries=true;清空缓存中所有数据
(5) @Caching:定义复杂的缓存规则
(6) @CacheConfig:抽取缓存的公共配置
35.消息服务
(1) 常见规范
① JMS:java消息服务
② AMQP:高级队列消息协议
(2) 概念
① 消息代理:消息中间件的服务器
② 目的地
1) 目的地==》两种形式
a. 队列==》点对点消息通信
b. 主题==》发布<public>,订阅<subscribe>消息通信
36.检索:ElasticSearch==》全文搜索
(1) 下载docker pull elasticsearch
(2) 底层代码用Java编写
(3) 启动:docker run -e ES_JAVA_OPTS=”-Xms256m -Xmx256m”-d -p 9200:9200 -p 9300:9300 --name 别名 镜像ID
① 解析:在启动检索的时候把内存控制在256兆之间
(4) 网页访问:IP地址:9200
(5) 官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
(6) spring默认支持两种技术来和ES交互
① Jest==》默认不生效:导入io.sarchbox.client.JestClient包
<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
② SpringData ElasticSearch
37.热部署原理:使用类加载器<classloader>,重新读取字节码文件到jvm内存
(1) 优点:
① 提高运行效率,不需要启动服务器
(2) 缺点:
① 如果项目大的情况下会非常卡--比较占内存
38. 性能优化
(1)
39.定时任务
(1) 异步任务
① 在service层的实现方法里给方法加上@Async
1) 解析:告诉spring这是一个异步方法,这个方法开辟单独线程进行执行
② 在程序入口加上:@EnableAsync 开启异步注解功能
③ 原理:底层使用多线程技术,使用AOP技术在运行时,创建一个单独线程进行执行
(2) 定时任务
① @Scheduled:设置定时
② Enable@Scheduling:开启基于注解的定时任务
(3) 邮件发送
① 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
docker run --name zk -p 2181:2181 some-zookeeper --restart always -d zookeeper
40.Dubbo和SpringCloud区别
(1) Dubbo
① 一个分布式服务框架
② 主要解决服务远程调用问题,所谓RPC
(2) SpringCloud
① 一个分布式的整体解决方案
1) 比如:
a. 配置管理
b. 服务发现
c. 熔断
d. 路由
e. 微代理
f. 控制总线
g. 一次性token
h. 全局锁
i. 分布式session
j. 集群状态
② 常用的5大组件
1) 服务发现:Netflix Eureka
2) 客户端负载均衡:Netflix Ribbon
3) 断路器:Netflix Hystrix
4) 服务网关:Netflix Zuul
5) 分布式配置:Spring Cloud Config
41.监控和管理断点
(1) Autoconfig:所有自动配置信息
(2) Auditevents:审计事件
(3) Beans:所有Bean的信息
(4) Configprops:所有状态信息
(5) Dump:线程状态信息
(6) Env:当前环境信息
(7) Health:应用健康状态
(8) Info:当前应用信息
(9) Metircs:应用的各项指标
(10) Mappings:@RequestMapping映射路径
(11) Shutdown:关闭当前应用
(12) Trace:追踪信息
42.监控
(1) Actuator:监控应用,没有界面,启动时返回json格式
① 打开:http://127.0.0.1:8080/actuator/beans ==》查看spring的beans
② 打开:http://127.0.0.1:8080/actuator/health ==》监控是否健康
③
(2) AdminUI:底层是Actuator监控应用,实现可视化界面
① 打开:http://localhost:8080/#/applications
43.Spring WebFlux
(1) 优势:
① 支持非常高的并发量
(2) controller类里
① Flux<T>用于Get请求
② Mono<T>用于POST请求或者PUT,DELETE
44.SpringBoot整合MyBatis事务的传播行为:==》共七个
(1) 分别是:
① Propagation.REQUIRED ==》如果存在一个事务,则支持当前的事务。如果没有则开启一个新的事务
② Propagation.SUPPORTS==》如果存在一个事务,则支持当前的事务。如果没有则开启,则非事务的执行
③ Propagation.MANDATORY==》如果存在一个事务,则支持当前的事务。如果没有则开启,就抛出异常
④ Propagation.REQUIRES_NEW==》总是开启一个新的事务,如果一个事务已存在,则将这个事务挂起
⑤ Propagation.NOT_SUPPORTED==》总是非事务地执行,并挂起任何存在的事务
⑥ Propagation.NEVER==》总是非事务地执行,如果存在一个活动事务,就抛出异常
⑦ Propagation.NESTED==》如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动的事务,就按Propagation.REQUIRED属性执行
(2)步骤:
① 在service层加注解@Transactional
② 在启动类上加:@EnableTransactionManagement
③ 导入lohback.xml文件,配置<logger name=”priv.linyu.项目名.service.impl”level=”TRACEA”>
④ 导入依赖:logback-core
(3) @Transactional(readOnly = true) ==》只读事务==》 查询功能
(4) @Transactional(propagation = Propagation.REQUIRED)==》事务策略 ==》修改功能
(5)