文章目录
概述
一、概述
- Spring boot框架是在Spring4.0基础之上进一步封装扩展而成的一个框架,其核心依然是Spring框架。
- 在Spring boot框架中,最重要的功能在于自动配置,最核心的注解就是@EnableAutoConfiguration。它能根据类路径下的jar包和配置动态加载配置和注入bean。
Spring boot框架的处理流程如图所示:
接口协议:RESTFUL
REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统。RESTFUL是一种设计风格,提供了一组设计原则和约束条件。如果一个架构符合REST原则,就称它为RESTful
架构。
RESTFUL
是面向资源的,就是用RUL定位资源,用HTTP METHOD描述操作。在REST很好地利用了HTTP本身就有的一些特征,如HTTP动词、HTTP状态码、HTTP报头等等。
常用的HTTP动词如下:
- GET 获取资源
- POST 添加资源
- PUT 修改资源
- DELETE 删除资源
实际上,这四个动词实际上就对应着增删改查四个操作,这就利用了HTTP动词来表示对资源的操作。
常用的HTTP报头有很多,以下是常见的几个:
- Authorization 认证报头
- Cache-Control 缓存报头
- Cnotent-Type 消息体类型报头
HTTP报头是描述HTTP请求或响应的元数据,它的作用是客户端与服务器端进行相互通信时,告诉对方应该如何处理本次请求。以下是一些典型的RESTFUL接口使用示例:
- 查询列表:GET: http://localhost/users
- 新增用户:POST: http://localhost/user
- 更新用户信息:PUT:http://localhost/user
- 删除用户:DELETE: http://localhost/user
Spring boot提供了注解的方式来实现对restful接口的支持。
1、@Controller
将当前控制器注入到Spring的上下文环境中,一般只用在控制器层。类似的会有业务逻辑层的@service
和其它组件的@Component
,表示将当前类加入到Spring上下文中。
2、@RequestBody
和@ResponseBody
分别表示请求体和响应体,使用@RequestBody注解用在方法参数变量前,表示接收使用payload方式上传的数据项,一个方法只能有一个使用@RequestBody
注解的参数;使用@ResponseBody
注解在方法体或类前,表示将return
的值作为响应体直接返回。
Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTFUL风格的web服务,其让部署管理和使用API接口文档变得非常简单。只需要简单的几行配置,使用注解就可以使用强大的API接口文档展示和接口测试功能,并使API保持高度同步。
3、在启动类上添加@EnableSwagger2注解。
4、改造控制器中的接口,增加参数接收。
5、访问接口,默认地址为:
http://localhost:8080/swagger-ui.html#/
二维码直接输出
很多时候,需要查看或下载的图片信息并不需要往本地文件系统长期存储,而是希望在内存中处理完后直接向客户端输出流直接输出,那么这里需要通过response对象的输出流直接输出。注意在这种情况下,在action中不要再有返回值,使用void即可。
下面定义二维码操作工具类,需要使用开源的Google Zxing库。ZXing
是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。
ZXing使用步骤:
3. 在接口方法中调用
定时任务
定时任务,又叫任务调度,使程序在运行过程中自动按指定间隔和次数进行某些任务的执行。比如人们需要在每天凌晨两点的时候自动进行数据备份,或者自动进行前一天的数据统计等工作,这个时候定时任务的使用将大大减少人力投入。
基本用法
-
明确所需要执行的定时任务目标,比如每分钟输出
一次时间。 -
在启动类上添加注解@EnableScheduling即可开启定时
任务功能。 -
创建要调度的任务。
另外,定时任务支持定期执行和cron表达式两种,其中注解Scheduled有以下属性:
@Scheduled(fixedRate = 6000) :上一次开始执行
时间点之后6秒再执行。
@Scheduled(fixedDelay = 6000) :上一次执行完毕
时间点之后6秒再执行。
@Scheduled(initialDelay=1000, fixedRate=6000) :
第一次延迟1秒后执行,之后按fixedRate的规则每6秒执行一次。
@Scheduled(cron=“*/0 3 * * * ?”)对应cron表达式。
Cron表达式
在Linux中,经常用到cron服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的任务。
Cron表达式定义了一套规则,用比较直观的方式通过年月日时分秒和星期、结合通配符的使用,实现复杂的定时任务调度表达式。Cron表达式是一个字符串,划分为6个或7个段,格式如下:
Cron表达式特殊字符介绍:
- :表示匹配该域的任意值。假如在Minutes域使用, 即表示每分钟都会触发事件。
- ?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会,
- 为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。
- -:表示范围。例如在Minutes域使用5-20,表示从5分钟到20分钟每分钟触发一次。
拦截器
- Springboot的拦截器需要实现HandlerInterceptor接口。下面写一个请求记录的拦截器:每一次请求中在控制台输出如下日志信息,以方便开发过程中控制器action的定位。
- (此调试信息的格式参照了国内的一个极速 web 开发框架jFinal的输出功能,在调试阶段对于接口调用情况能及时的查看)
在eclipse和idea中都可以通过在控制台输出的全路径限定类名:
形式的内容上,点击括号内的文件名:行号,快速定位到指定文件。然后再搜索调用的方法名或者uri快速定位到方法。在同时开启mybatis语句输出的情况下,输出实例如下:
要实现Springboot的拦截器,需要创建实现HandlerInterceptor的类:
需要实现HandlerInterceptor接口的三个方法:
这里实现的重点是preHandle方法。因为开发环境下需要在请求到来时先输出请求地址等信息,以便问题定位,再执行实际的业务逻辑。否则如果放在后置处理,当业务出错时,将会影响此处调试信息的输出。详细代码:
创建配置类,实现WebMvcConfigurer接口中的addInterceptors方法,以下内容表示将符合/**规则的url,即所有url都交由这个拦截器进行拦截处理。
缓存技术
- Spring缓存引入了基于注解的缓存技术,它本质上不是一个具体的缓存实现,而是提供一套规范接口,通过很少的配置即可使用强大的缓存功能。
- 传统的缓存方案中缓存代码和业务代码耦合度很高。比如定义了一个CacheKit工具类,可以对cache根据键进行读取和写入,可是使用的时候也需要先手动判断缓存是否存在,再决定是从缓存中取还是从其它数据源取。需要将操作缓存的逻辑写在每个业务方法中。
- Spring的缓存技术非常灵活,通过注解的方式,不仅能够使用SpEL(Spring表达式语言)来定义缓存的key和各种条件,还提供开箱急用的缓存临时存储方案,可与主流的缓存实现(如EHCache)很方便的集成。
Spring Boot中缓存的使用步骤:
-
引入cache起步依赖
-
在启动类上添加注解@EnableCaching启用缓存功能
- 在数据访问接口增加缓存注解@Cacheable
@Cacheable
既可以注解在方法上,也可以注解在类上,当标记在方法上表示当前方法需要使用缓存,当标记在类上表示当前类的所有方法都需要使用缓存。
对于使用@Cacheable
支持缓存的方法,Spring会在方法数据返回后将结果缓存下来,以便在后续的方法调用中利用同样参数执行该方法时可以先从缓存中取值,减少数据库的并发压力。
Spring
管理缓存是以对象方式管理,以键值对方式存储,其中对于键有不同的策略:默认策略和自定义策略。
@Cacheable注解可以指定的属性包括:
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
String key() default "";
String keyGenerator() default "";
String cacheManager() default "";
String cacheResolver() default "";
String condition() default "";
String unless() default "";
boolean sync() default false;
Spring Boot中缓存的使用步骤:
4.在类路径创建ehcache的配置文件
模板引擎
在Web应用开发中,如果后端要返回的数据是一个完整的html页面,使用模板引擎可以使业务与显示模板分离。Jsp本身也是模板引擎的一种,Jsp的出现解决了servlet输出页面时大量重复代码编写的问题。Jsp功能非常强大,但是由于可以在Jsp中编写java代码,如果使用不当容易破坏项目的分层架构,因此市面上又出现了其它的模板引擎来替代Jsp。
基本使用
Springboot的模板引擎就是在当前Java Web项目内部编写html等前端代码,经过Springboot的处理,可以在后端经过模板编译和变量替换后输出到前端。后端编译有利于搜索引擎抓取内容,适合于门户等需要第三方搜索开发。
在Springboot中,要引入freemarker模板引擎,首先在pom.xml中引入starter。
可以在application.yml中配置如下,指定模板文件后缀名为ftl,模板从类路径下的templates文件夹下加载。
上面的配置表示模板文件放在类路径的templates,
实际上一般放置在项目src/main/resources目录下建
templates目录,将模板文件放在这下面即可。
通过上面的配置后,就可以在控制器的action之中进行页面的反馈显示。通过return字符串的方式定位templates目录下的文件,如return“index”即表示渲染templates文件夹下的index.ftl文件给客户端显示。
自定义标签
自定义标签常用在cms建站之中,可以在不改变Java代码的情况下改变页面显示。自定义标签是通过Java代码实现,然后通过页面应用标签实现,而数据权限的控制权还是掌握在自己手中。例如,在freemarker中自定义标签默认的语法格式为:
自定义标签需要实现TemplateDirectiveModel接口的execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)方法,然后需要调用以下代码进行标签注册才可以在模板中使用。
定义自定义标签,有以下步骤:
- 自定义标签类
- 配置标签类
定义自定义标签,有以下步骤:
3. 使用自定义标签
这里可以根据自己的业务情况从数据库中获取数据进行渲染
异常处理
- 程序在运行过程中,不可避免的会遇到各种异常情况。默认的异常提示信息或页面常会因为格式的问题而显得对用户不友好。异常如果不捕获,会影响程序的正常运行;如果在每个地方都处理又显得很繁琐。所以,一个全局的异常拦截和处理器就显得非常有必要。
- 和使用@
RestController
注解一样,实现异常拦截的方式也非常简单,这里通过@RestControllerAdvice
注解的类及其中的@ExceptionHandler
注解来处理运行时异常。
常用异常捕获
登录验证
请求体解析时的异常
Json转换过程抛出异常
参数转换时抛出的异常
参数解析时抛出的异常
数据类型转换异常
http动词不符合预期时的异常
数据源异常
通用异常处理
主键重复异常
在业务实现的过程中,有时候需要开发者
定义自己的异常处理类,以便对于异常的特
殊处理及返回值构造。自定义异常类需要继
承RuntimeException,示例如下:
将自定义异常类加入异常处理,如下代码所示:
通过上面的注解配置@ExceptionHandler(RRException.class),将异常捕获加入到当前的Spring容器之中。当程序通过throw RRException()抛出异常时,程序将会执行到此方法,那么客户端接收到的返回值就是这里返回的r值。
多环境配置
- 由于开发、测试与部署需要使用不同的底层环境支持,比如数据库连接、文件存储路径、日志路径等,为了减少测试与部署过程的工作量,此处可以考虑准备多个配置文件以便在不同环境中使用。
- 在Springboot中,多环境配置需要满足
application-{profile}.yml
格式。其中,{profile}对应启动运行环境的标识,如果常用的有开发、测试、线上环境,那么在此处可以放置三个文件分别为:
application-dev.yml:开发环境 application-test.yml:测试环境
application-prod.yml:生产环境
在主文件application.yml中配置指定当前环境。
公共的配置可放在主配置文件中,其它依赖特殊环境的配置放在对应环境的文件中即可。
工程打成jar包后,可以在运行的时候对配置进行选择,而不需要每次打包前都手动去修改spring.profiles.active的值。
例如,在生产环境,可以使用prod配置执行启动jar包,命令如下:
java -jar xxx.jar --spring.profiles.active=prod
表示当前程序启动时,传入的spring.profiles.active值为release,将选用application-prod.yml文件中配置的参数来启动项目。比如,在application-dev.yml中,指定启动端口为8080,在application-prod.yml中指定启动端口为8888,那么如果不传入spring.profiles.active参数,系统将会使用默认的配置值dev,启动程序占用的端口就是8080,而通过–spring.profiles.active=prod参数指定后,启动的端口就是8888。
项目部署
对于Java Web项目来说,一般有两种部署方式,分别是打包部署和使用Web服务器部署。
通过maven打成war包,然后通过java -jar 项目名.war启动即可。以下为maven插件的配置:
要想把项目放入tomcat容器中启动,需要对项目配置进行以下修改。
- 修改启动类
使其继承SpringBootServletInitializer,并重写configure(SpringApplicationBuilder application)方法。代码如下:
高级用法——运行时监控
在Web项目开发中,如果能在运行时对程序的参数或性能进行监控,将能对开发的效率有较大提升。本节介绍Springboot附带的Actuator插件,以及开源数据库连接实现插件druid的基本使用方法。
Actuator插件
Actuator是SpringBoot的一个附加功能,可以帮助应用程序在生产环境运行时的监控和管理。可以使用HTTP的各个请求路径来监管、审计、收集引用的运行情况,特别对于微服务管理十分有意义。以下对Actuator插件的使用流程进行介绍。
- 创建监控项目sba
在pom中配置依赖
. 在application.yml中配置端口和项目基础路径
此处主要是为了和被监控项目端口配置有所区别,防止因为端口占用而使项目启动不了。
创建启动类并执行
访问接口
从控制台输出中也可以发现,程序提供了非常丰富的接口供用户查看,如图所示。
另外,AdminUI内置了Actuator服务,是对监控服务的图形化界面补充。要通过AdminUI使用Actuator功能,需要完成以下几个步骤。
在启动类中增加注解@EnableAdminServer,如右所示。
另外,AdminUI内置了Actuator服务,是对监控服务的图形化界面补充。要通过AdminUI使用Actuator功能,需要完成以下几个步骤。
. 需要在配置文件application.yml中添加如下代码
通过下面的配置启动所有监控端点,默认情况下,这些端点是禁用的。
另外,AdminUI内置了Actuator服务,是对监控服务的图形化界面补充。要通过AdminUI使用Actuator功能,需要完成以下几个步骤。
4. 执行启动类的main方法,然后打开访问对应ip的64000端口
这里要注意,当监控程序在其它及其部署时,可能会存在根据计算机名找不到的情况,那么就会显示虽然已经注册上了,但是实际状态是offline的情况。需要在客户端配置
druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,可以说是目前较好的连接池。要在Spring boot中使用druid插件,需要在配置类中增加以下代码。
如果使用了shiro过滤权限,记得要在fitler中增加
以使访问不被拦截。
配置后,访问http://localhost:888/druid/login.html页面。
输入代码中配置的账号和密码,进行
登录,即可进入Druid Monitor的监控页
面,可以对Web项目及数据库连接的运行
时状态进行监控,如图所示。
自定义starter
Springboot生态有很多的starter依赖,可以使开发者在开发过程中减少配置,更多关注业务功能的实现。如果想要使用freemarker,那么只需要在pom中引入如下依赖即可,其中version参数可以省略。
甚至可以不需要做额外的配置即可直接使用freemarker的功能,Springboot会自动进行类的配置。当然如果开发者需要有一些参数自己配置,也可以根据官方说明在Springboot的application文件中配置来覆盖默认参数。
在使用Spring Boot时,starter的启动流程如下:
- Springboot会首先扫描starter包下的resources/META-INF/spring.factories文件,根据配置文件中配置的jar包去扫描项目依赖的jar包;
- 根据spring.factories配置加载AutoConfigure类;
- 根据@Conditional注解的条件,将配置bean注入spring context中。
另外,也可以使用@ImportAutoConfiguration(MyConf.class)来指定自动配置哪些类。
以下介绍一个完整自定义starter的流程。
- 创建一个springboot项目,添加依赖。
- 其中,spring-boot-configuration-processor的作用是编译时生成
spring-configuration-metadata.json,此文件主要给IDE使用。一般相关属性的配置在application.xml文件中,开发者可以通过ctlr+鼠标左键点击属性名,IDE会跳转到到配置此属性的类中。 - 通常来说,如果使用Spring官方的Starter,一般采用spring-boot-starter-{name}的命名方式,如
spring-boot-starter-web。而对于自定义的Starter,一般建议 artifactId
命名应遵循{name}-spring-boot-starter的格式。
以下介绍一个完整自定义starter的流程。
4.创建spring.factories
内容如下:
指定当前自动配置的入口类是哪个类
5.发布,使用
在项目根目录下,执行以下代码:mvn install 指令会进行打包安装,默认会将jar包安装到本地。
以下介绍一个完整自定义starter的流程。
6. 测试
在application.xml文件中添加配置,进行依赖引入,最后可以进行测试。
自定义Spring boot的流程如图。
实现入口servlet
未实现入口servlet,需要创建一个DispatcherServlet类继承javax.servlet.http.HttpServlet,重写init()和service方法,分别负责容器初始化和接口请求处理。
- 容器初始化
容器初始化阶段需要做的工作有:
- 扫描包
- 类实例化
- 初始化接口映射
- 依赖注入
这些事情只需要在执行具体业务逻辑之前执行一次即可,所以将其放入init方法中。
init方法代码如右图
要实现这些逻辑,需要定义三个成员变量,
如下代码所示。
然后,分步骤实现对应处理,如下代码所示。
在依赖注入的过程中,如果@Autowired没有指定value值,那么将使用类名首字母小写的值作为key,方法如下:
请求处理
创建业务实现层
-
控制器层实例UserController
-
业务逻辑层接口
-
业务逻辑层实现类
4.5.4 配置tomcat
- 引入tomcat的依赖
2.编写tomcat启动方法
- 运行App类中的main方法
然后访问:“http://127.0.0.1:8089/access/user/helloMvc?name=段老师”,即可测试自定义的Spring boot功能,如图所示。
从图中可以看出,已经成功调用了自定义的Spring boot的相应功能。
从图中可以看出,已经成功调用了自定义的Spring boot的相应功能。
总结
本章首先介绍了Spring boot框架的由来,并以一个简单的例子演示了Spring boot框架的使用方法
其次,重点介绍了Spring boot框架的基本用法,包括接口数据校验、文件上传和下载、定时任务、拦截器、缓存技术、模板引擎、异常处理和项目部署等
最后,介绍了Spring boot框架的高级用法,包括运行时监控和自定义starter的相关知识等。另外,还介绍了自定义Spring boot框架的基本流程。
标签:搞定,缓存,自定义,Spring,配置,Boot,使用,boot From: https://blog.csdn.net/qq_43055855/article/details/142740856