springboot
springboot
springboot优势:
- 快速搭建spring项目
- 纯java配置不需要xml配置,开箱即用很少的配置就可以搭建J2E项目
- 内嵌服务器可以快速部署
springboot基础配置
- spring-boot-parent配置在pom.xml中,主要做java默认版本编码格式默认资源过滤插件等配置,是可以不使用该,进行更改的
- @SpringBootApplicaton是一个由
- @Configuration,配置类,
- @EnableAutoCOnfiguration 开启自动化配置
- @ConponentScan(完成包扫描),该注解默认扫描的类都位于当前类所在包下
Web容器配置
- SpringBoot项目添加spring-boot-starter-web后默认为tomcat作为容器,可以在application,propertise中配置服务器,端口,项目出错跳转路径
- 可以进行https配置
- 配置Jetty,Undertow等服务器
类型安全配置属性
- 无论是Properties还是YAML配置都会被加载到SpringEnvironment中,Spring提供了==@Value注解以及 EnvironmentAware 接口==,将SpringEnvironment中的数据注入到属性上
- Spring Boot 对此进一步提出了类型安全配置属性 ,即使在数据量非常庞大的情况下,也可以更加方便地将配置文件中 的数据注入 Bean
application.properties
将这一段配置数据注入Bean
- @ConfigurationProperties 中的 prefix 属性描述了要加载的配置文件的前缀
- 此类配置可能会乱码,需要对中文进行转码,只需再IDEA/Settings做简单配置即可
Properties配置(YML配置)
- 一些自定义的配置
- YAML 的使用非常简单,利用缩进 来表示层级关系,并且大小写敏感
Profile配置
通过类似@Profile注解等解决方案,可以避免项目在开发环境/测试环境/生产环境之间来回切换时频繁大量的修改代码
springboot整合视图层技术
虽然目前前后端分离是趋势,但是视图层技术还是有一定的意义
- thymelef
- freemarker
springboot整合web开发
Json数据
- spring-boot-starter-web默认添加了了 jackson-databind 作为 JSON 处理器,可以直接返回json
- 前后端数据的主流传输方式为json
- 注解@Responsebody可以返回json数据,频繁使用该注解时可以使用@RestController注解
静态资源访问
- springmvc中需要手动对静态资源进行过滤
- springboot提供了自动化配置
默认策略
- springboot默认会过滤所有的静态资源,共有五个位置(任意位置下都会规律)
- ”classpath:/META-INF /resources
- classpath:/resources
- classpath:/static
- classpath:/public
- /
- 对于intellij可以将静态资源放在其默认创建出来的classpath:/static/目录下(一般都这样放置)
- springboot项目默认是不需要webapp目录的
classpath
- src 路径下的文件 在编译后都会放到 WEB-INF/classes 路径下。默认classpath 就是指这里
- 用maven构建 项目时,resources 目录就是默认的classpath
自定义策略
@ControllerAdvice
- @Controller增强版,主要用来处理全局数据,一般搭配@Exceptionhandler,@Modelattibute使用
- 最常用的使用场景就是全局异常处理,配合@Exceptionhandler定义全局异常捕获机制
- 添加@ControllerAdvice 注解即可。当系 统启动时,该类就会被扫描到 Spring 容器中
- 后定义 uploadException 方法,在该方法上添加了 @ExceptionHandler注解,其中定义的 MaxUploadS izeExceededException. class 表明该方法用来处理 Max UploadSizeExceededException 类型的异常
- 方法的参数可以有异常实例、 HttpServletResponse 以 及 HttpServletRequest 、 Model 等
- 果想让该方法处理所有类型的异常,只需将 Max U ploadS izeExceededException 改为 Exception 即可
自定义错误页
- springboot可以用@ControllerAdvice做全局异常处理,但是这种异常处理机制只能处理应用级别的异常而无法处理容器级别的异常,比如filter抛出的异常
- springboot在用户访问出错时会有一个默认的页面返回给用户,可以进行自定义
CORS支持
-
CORS跨域资源共享技术标准,支持多种HTTP请求(JSNOP只支持GET)
-
支持CORS的服务端在响应头中用Access-Control-Allow-Origin字段用来记录可访问该资源的域,浏览器会提取该字段该字段的值包含当前页面也在的域则不再对前段的跨域请求限制,这个流程只针对GET,POST,和HEAD请求且没自定义头
-
而复杂请求则会有两次请求,一次OPTIONS(用来判断真正请求是否可用)一次真正的请求,简单请求和复杂请求前端代码一致,额外处理均在后端完成
CORS简单请求实例
支持CORS浏览器请求
服务器支持CORS,响应格式为,主要是添加了Access-Control-Allow-Origin字段记录可以访问该资源的域(包含了当前页面所在的域)
CORS复杂请求实例
OPTIONS请求和处理
-
DELETE为例,前端浏览器发起的DELETE请求会先发送一个OPTIONS请求,这个请求将向服务端询问是否具备该资源的 DELETE 权限
-
服务端给浏览器响应,Allow 头信息表示服务端支持的请求方法当浏览器分析了请求头宇段之后,知道服务端支持本次请求,则进入下一步
HTTP/1.1 200 Access-Control-Allow- Origin: http://localhost:8081 Access-Control-Allow-Methods: DELETE Access- Control-Max-Age: 1800 Allow: GET, HEAD, POST, PUT , DELETE, OPTIONS , PATCH Content-Length : 0 Date: Thu, 12 Jul 2018 13 :20:26 GMT .. ..
DELETE请求
浏览器就会发送一个跨域的 DELETE 请求
服务器响应
- 至此一个跨域的DELETE请求完成,简单复杂请求的前端代码都是一样的,额外处理实在服务端完成的
- 在传统的JavaEE 开发中,可以通过过滤器统一配置,而 Spring Boot 中对此则提 供了更加简洁的解决方案
SpringBoot跨域解决
-
在注解在方法上配置@CrossOrigin(value=“http://localhost:8081”,maxAge=1800,allowHeaders=“*”)
在注解在方法上的细粒度的控制
- value表示支持的域
- maxAge:探测请求有效期
- allowHeaders表示允许的请求头
-
配置一个全局配置类
-
自定类实现WebMvcConfig接口,再实现其中addCorsMappings方法
-
addCorsMappings
- addMapping表示对哪种请求格式进行跨域处理
- allowHeaders允许的请求头
- allowedMethods允许的请求方法
- allowedOrigins 支持的域
-
配置类与XML配置
- springboot推荐使用Java完成相关配置工作而不建议将配置放入配置类,而是根据不同需求设置不同配置类
- 在相关配置类上加上@Configuration注解,@ComponentScan会扫描所有的Spring组件包括@Configuration,@ComponentScan在项目的入口类的@SpringbootApplication注解已经提供
- springboot并不推荐使用xml配置,尽量用java代替
注册拦截器
- springMVC提供了AOP风格的拦截器是更细粒度的控制
- springboot项目中,自定义类实现HandlerInterceptor接口,实现其中的方法,preHandle,Controller,postHandle,afterCompletion,且这几个方法是优先级逐渐降低的
启动系统任务
- spring中一些在系统启动时需要执行的任务如配置文件的加载数据库的初始化等,可以配置Listener解决
- springboot提供了ConmandLineRunner和ApplicationRunner两种方案,两者基本只在参数上有所区别
- 使用方法上是自定义类实现CommandLineRunner并实现run(),springboot项目在启动时会遍历所有CommandLineRunner实现类病调用其中run()方法,多个类之间可以用@Order进行排序
整合Servlet,Filter和Listener
这些基本web组件在spring springmvc整合后基本告别,springboot提供了几个注解能够对这几个组件进行标记
路径映射
- 一般情况下, 使用了页面模板后,用户需要通过控制器才能访问页面(有一些页面需要在控 制器中加载数据,然后渲染,才能显示出来)
- 对于在控制器中不需要加载数据,只是完成简单的跳转,可以直接配置路径映射,提高访问速度
- 如上配置完成后,就可以直接访问 http://localhost:8080/login 等地址
aop
- springboot提供了对aop的自动化配置解决方案
- 引入springboot-starter-aop依赖即可
其他
springboot项目启动后会默认找静态资源路径下的index.html找不到则会找动态的index文件作为首页文件3
Spring Boot 整合持久层技术
整合JdbcTemplate
- JdbcTemplate 是 Spring 提供的JDBC 模板框架,利用 AOP 技术来解决直接使用JDBC时 大量重复代码的问题
- JdbcTemplat巳 虽然没有 MyBatis 那么灵活,但是比直接使用 JDBC 要方便很多
- Spring Boot 中对 JdbcTemplate 的使用提供了自动化配置类 JdbcTemplateAutoConfiguration
整合MyBatis
- MyBatis 支持定制化 SQL、存储过程以及高级映射, MyBatis 几乎避免了所有的 JDBC 代码手动设置参数以及获取结果集
- 在传统的SSM框架整合中 ,使用MyBatis需要大量的XML配置,而在 Spring Boot 中, MyBatis 官方 提供了一套自动化配置方案,可以做到 MyBatis 开箱即用
创建项目
创建 Spring Boot 项目,添加 MyBatis 依赖、数据库驱动依赖以及数据库连接池依赖
创建数据库、表、实体类等
- 在项目的根包下面创建一个子包 Mapper, 在 Mapper 中创建 Book.Mapper
- 有两种方式指明该类是一个 Mapper
- 第一种,在 Book.Mapper 上添加 @Mapper 注解, 表明该接口是一个 MyBatis 中的 Mapper,这种方式需要在每一个 Mapper 上 都添加注解
- 在配置类上添加@MapperScan(”org.sang.mapper")引主解, 表示扫描 org.sang.mapper 包下的所有接口作为 Mapper
创建 BookMapper.xml()
- 在与 Boo刷apper 相同的位置创建 Book.Mapp巳r.xml 文件
可采用注解开发
创建 Service 和 Controller
配置 pom.xml 文件
-
在 Maven 工程中 , XML 配置文件建议写在 resources 目录下
-
上文的 Mapper.xml 文件写 在包下, Maven 在运行时会忽略包下的 XML 文件,因此需要在 pom.xml 文件中重新指明资源文件位置
<build> <resources> <resource> <directory>src/main/j ava</ directory> <includes> <include>**/* .xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build>
整合SpringDataJPA
多数据源
- 多数据源,是指Java EE 项目中采用了不同数据库实例中的多个库,或者同一个数据库实例中多个不同的库
- 采用 MyCat 等分布式数据库中间件是比较好的解决方案,这 样可以把数据库读写分离、分库分表、备份等操作交给中间件去做, Java 代码只需要专注于业务
- 同样可以使用 Java 代码解决类似的问题, 在SpringFramework中就可以配 置多数据源, SpringBoot继承其衣钵,只不过配置方式有所变化
JdbcTemplate 多数据源
- JdbcTemplate 多数据源的配置是比较简单的, 因为一个 JdbcTemplate 对应一个 DataSource, 开 发者只需要手动提供多个 DataSource, 再手动配置 JdbcTemplate
Mybatis多数据源
JPA多数据源
Spring Boot 整合 NoSQL
NoSQL 是指非关系型数据库
- NoSQL 不使用 SQL 作为查询语言
- 其数据存储可以不需要固定的表格模式
- 一般都有水平可扩展性的特征
- 分类有 键值存储(Redis),列存储(HBase),文档型数据库(MongoDB)图形数据库(DEX)
整合 Redis
- Redis 是一个使用 C 编写的基于内存的 NoSQL 数据库
- Redis 由一个 Key/Value 映射的字典构成,Redis 中 Value 的类型不局限于字符串,还支持列表、集合、有序集合、散列等
- Redis 不仅可以当作缓存使用,也可以配置数据持久化后当作 NoSQL 数据库使用,目前支持两种持久化方式: 快照持久化和 AOF 持久化
- Redis 也可以搭建集群或者主从复制结构,在高并发环境下具有高可用性
整合SpringBoot
- 创建 Spring Boot 项目,添加依赖