目录
paramType 属性表示参数放在哪里,主要有以下几个属性:
回顾spring
优点
开源,轻量级,非侵入式的一站式框架,简化企业级应用开发
控制反转(IOC),依赖注入(DI)降低了组件之间的耦合性,实现了软件各层之间的解耦
面向切面(AOP),利用它可以很容易实现一些拦截,如事务控制等
spring对于主流的应用框架提供了很好的支持,例如mybatis
spring提供有自己的mvc实现
缺点
虽然spring的组件代码是轻量级的,但它的配置却是重量级的。虽然spring引入了注解功能,但是仍然需要编写大量的模板化配置文件
项目的依赖管理也是一件耗时耗力的事情,在环境搭建时,需要分析要导入大量库的坐标,而且还需要分析导入与之有依赖关,一旦选错依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度
SpringBoot对上述spring的缺点进行的改善和优化,基于约定优于配置的思想.可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期
SpringBoot概述
Spring Boot是由Pivotal团队提供的在spring框架基础之上开发的框架,其设计目的是用来简化应用的初始搭建以及开发过程
Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、迅捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是Spring框架紧密结合用于提升Spring开发者体验的工具
Spring Boot以约定大于配置的核心思想,从而使开发人员不再需要定义样板化操作。它集成了大量的第三方库配置(例如Redis,Jpa RabbitMQ,Quartz等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用,通过这种方式,Spring Boot 治理于在蓬勃发展的快速应用开发领域,成为领导者
Spring Boot你只需要“run”就可以非常轻易的构建独立的、生产级别的spring应用
我们为spring平台和第三方依赖库提供了一种固定化的使用方式,使你能非常轻松的开始开发你的应用程序。大部分SpringBoot应用只需要很少的配置
SpringBoot特点
创建独立的spring应用程序
直接内嵌Tomcat、jetty和undertow
提供了固定化的“starter”配置,以简化构建配置
尽可能的自动配置Spring和第三方库
提供产品级的功能,如:安全指标、运行状况监测和外部化配置等
绝不会生成代码,并且不需要XML配置
SpringBoot的核心功能
起步依赖
起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能
自动配置
SpringBoot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的
SpringBoot开发环境构建
官网配置生成
选择配选项,在线生成并下载
解压后修改pom.xml版本为2.6.6,删除.mvn文件夹,mvnw.cmd文件
导入到idea中
Springboot集成web组件后,内置了tomcat服务器,一个springboot应用相当于一个独立的服务,可以使用启动类中的main方法启动springboot程序
在线生成启动logo:Spring Boot banner在线生成工具,制作下载banner.txt,修改替换banner.txt文字实现自定义,个性化启动banner-bootschool.net
下载存放在resources目录下即可
SpringBoot配置文件
Spring Boot使用一个全局的配置文件(配置文件名是固定的)
application.properties 或者 application.yml。前者是属性文件格式,内容为键值对;yml是YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心。
application.properties案例
server.port=8080
application.yml案例
server:
port: 8080
yaml基本语法: 语法结构:key:空格value
以此来表示一对键值对(空格不能省略);以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
值的写法
字面量:普通的值[数字,布尔值,字符串]
K: V
字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;
案例:
friends:
lastName: zhangsan
age: 20
使用@ConfigurationProperties注解标签将配置文件中的内容映射到类中的属性
@ConfigurationProperties(prefix="user")
SpringBoot集成JDBC
数据源配置
在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
在application.yml中配置数据源信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/zz?serverTimezone=Asia/Shanghai
username: root
password: 101917
使用JdbcTemplate操作数据库
Spring的JdbcTemplate是自动配置的,你可以直接使用@Autowired来注入到你自己的bean中来使用。
SpringBoot整合阿里数据源
导入阿里数据源jar
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
在yml文件中注册阿里数据库连接池
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/zz?serverTimezone=Asia/Shanghai
username: root
password: 101917
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 20
SpringBoot集成mybatis
导入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
在application.yml中配置数据源信息
mybatis:
type-aliases-package: com.ffyc.bookms.model
mapper-locations: classpath:mappers/*Mapper.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
cache-enabled: true
map-underscore-to-camel-case: true
SpringBoot 集成日志功能
日志是软件应用必备的组件,是程序 debug,或是数据收集管理的重要依据,方便我们监测生产环境的变量值变化以及代码运行轨迹。
主要是为了方便我们监测生产环境的变量值变化以及代码运行轨迹等。这些记录会被输出到我们指定的位置形成文件,帮助我们分析错误以及用户请求轨迹。
日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源,尤其是在生产环境中运行的程序更加重要。
常用日志组件
slf4j(Simple Logging Facade for Java)
commons-logging
Log4J
Log4J2
Logback
JUL( Java Utils Logging)
springboot 中对这些组件都提供了支持,slf4j 和 commons-logging 是日志的门面接口,它们都不是具体的日志框架,你可以指定其他主流的日志实现框架。一般首选强烈推荐使用 slf4j + logback
日志的级别划分:从低到高: debug < info < warn < error
配置日志级别和日志文件位置
在application.yml文件中
logging:
level:
com.ffyc.bookms: debug
file:
name: E:/log/log.log
其余信息在 logback 配置文件中
在类中使用
public class LoginController {
static Logger logger = LoggerFactory.getLogger(LoginController.class);
@Autowired
LoginService loginService;
@ApiOperation(value = "登录", notes = "登录访问接口")
@PostMapping(path = "/login")
public CommonResult login(@RequestBody Admin admin) {
logger.debug("debug用户信息"+admin);
logger.info("info用户信息"+admin);
logger.warn("warn用户信息"+admin);
logger.error("error用户信息"+admin);
CommonResult commonResult = null;
try {
Admin a = loginService.login(admin);
if (a!=null){
commonResult = new CommonResult(200, a, "查询成功");
}else {
commonResult = new CommonResult(210, null, "账号或密码错误");
}
} catch (Exception e) {
e.printStackTrace();
logger.error("系统故障"+e.getMessage());
commonResult = new CommonResult(500, null, "查询失败");
}
logger.info("info用户信息"+commonResult);
return commonResult;
}
}
SpringBoot 使用 AOP 统一打印日志
导入依赖 jar
<dependency>
<groupId >org.springframework.boot</groupId >
<artifactId >spring-boot-starter-aop</artifactId >
</dependency>
定义切面通知类
@Component
@Aspect
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(getClass());
//通配符,定义规则,哪些方法可以被我的切面切到,这里的意思是不限返回值和方法和参数
@Pointcut("execution(public * com.ffyc.news.controller..*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("URL : {}", request.getRequestURL().toString());
logger.info(" HTTP_METHOD :{} ", request.getMethod());
logger.info("IP : {}", request.getRemoteAddr());
//获取所有请求参数
Enumeration < String > enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
logger.info("name:{},value:{}", name, request.getParameter(name));
}
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfter(Object ret) throws Throwable {
// 处理完请求,返回内容
logger.info(" RESPONSE : " + ret);
}
/*环绕通知实现前置 最终通知
@Around("webLog()")
public Object printLog(ProceedingJoinPoint joinPoint) throws Throwable {
Object proceed = null;
try {
doBefore(joinPoint);
proceed = joinPoint.proceed();
doAfter(proceed);
} finally {
//System.lineSeparator():系统换行符
logger.info(" = = = = = = = = = END= = = = = = = = = " + System.lineSeparator());
}
return proceed;
}*/
SpringBoot 统一异常处理
日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用 try , catch 的方式处理异常或者 throw, throws 的方式抛出异常不管。这种方法对于程序员来说处理也比较麻烦,所以我们希望既能方便程序员编写代码,不用过多的自己去处理各种异常编写重复的代码又能提升用户的体验,这时候全局异常处理就显得很重要也很便捷了,是一种不错的选择
全局异常捕获与处理
Springboot 对 于 异 常 的 处 理 也 做 了 不 错 的 支 持 , 它 提 供 了 一个@RestControllerAdvice 注解以及 @ExceptionHandler 注解,前者是用来开启全局的异常捕获,后者则是说明捕获哪些异常,对那些异常进行处理
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 针对其他异常处理
*/
@ExceptionHandler(Exception.class)
public CommonResult globalException(Exception e) {
CommonResult commonResult = new CommonResult(500,e.getMessage());
return commonResult;
}
}
请求 404 application.yml 配置
mvc:
throw-exception-if-no-handler-found: true
web:
resources:
add-mappings: false
SpringBoot 集成 Swagger
支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术
提供 Web 页面在线测试 API:光有文档还不够, Swagger 生成的文档还支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口
搭建
导入 jar
<dependency>
<groupId> io.springfox </groupId>
<artifactId>springfox-swagger2 </artifactId>
<version>2.9.2 </version>
</dependency>
<dependency>
<groupId> io.springfox </groupId>
<artifactId> springfox-swagger-ui </artifactId>
<version> 2.9.2 </version>
</dependency>
在 application.yml 中配置
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
添加 swagger 配置类
配置 swagger 扫描方式
及放行静态资源请求不被 spring 拦截
Swagger 使用的注解及其说明
@Api:用在类上,说明该类的作用,tags 类的功能进行描述
@Api(tags= "用户登录控制器")
@ApiOperation:用在方法上,用于对方法功能说明
@ApiOperation(value= "方法概述", notes= "功能详细描述")
@ApiImplicitParam:用来注解来给方法入参增加说明
paramType 属性表示参数放在哪里,主要有以下几个属性:
header–>放在请求头。请求参数的获取:@RequestHeader(代码中接收注解) query–>用于 get 请求的参数拼接。请求参数的获取 path(用于 restful 接口)–>请求参数的获取:@PathVariable(代码中接收注解) body–>放在请求体。请求参数的获取:@RequestBody(代码中接收注解) form(不常用)
参数为实体类
在实体类上添加注解
@ApiModel:描述一个 Model 的信息(参数为实体类时使用)
@ApiModelProperty:描述一个 model 的属性
@ApiResponses:用于表示一组响应 @ApiResponse:用在@ApiResponses 中,一般用于表达一个错误的响应信 息 code:数字,例如 400 message:信息,例如"请求参数没填好" 也可以不需要添加
Swagger UI 的使用
访问 swagger-ui.html 后可以在页面中看到所有需要生成接口文档的控制器名称
http://localhost:端口/swagger-ui.html