Spring Boot 对上述 spring 的缺点进行的改善和优化,基于约定优于配置的思想.可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
起步依赖
自动配置
Springboot 实现自动装配的核心仍然是使用注解标签,
@SpringBootApplication 是 springboot 核心注解,其中包含
@SpringBootConfiguration,@EnableAutoConfiguration,
@ComponentScan.
@ComponentScan 它默认扫描的是与该类同级的类或者同级包下的所有类. @SpringBootConfiguration,通过源码得知它是一个@Configuration,相当于之前的配置文件功能. @EnableAutoConfiguration 是这里最重要的注解,它实现了对 Spring Boot应用自动装配的功能。@EnableAutoConfiguration 是利用SpringFactoriesLoader 机制加载自动装配配置的,它的配置数据在
META-INF/spring.factories 中,我们打开 spring-boot-autoconfigure jar 中的该文件,发现对应着许多个 XXXAutoConfiguration 配置类.
@Configuration加入@Configuration 注解,表明这就是一个配置类。有一个 myBean()的方法
并用@Bean 进行注释,返回一个 MyBean()的实例,表明这个方法是需要被Spring 进行管理的 bean。@Bean 如果不指定名称的话,默认使用 myBean名称,也就是小写的名称。
@Bean
相当于 XML 中的,放在方法的上面,而不是类,意思是产生一个 bean,并交给 spring 管理
官网配置生成
https://start.spring.io/ >>> 点击进入
选择配选项,在线生成并下载
解压后修改 pom.xml 版本为 2.6.6,删除.mvn 文件夹,mvnw.cmd 文件
导入到 idea 中
在线生成启动 logo:https://www.bootschool.net/ascii >>>点击进入
下载存放在 resources 目录下即可
Spring Boot 使用一个全局的配置文件(配置文件名是固定的)
application.properties 属性文件格式,内容为键值对
server.port=8080
application.yml
yml 是 YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心.
yml 配置示例
server:
port: 8080
yaml 基本语法:
语法结构:key:空格 value
以此来表示一对键值对(空格不能省略);以空格的缩进来控制层级关系,
只要是左边对齐的一列数据都是同一个层级的。
值的写法
字面量:普通的值[数字,布尔值,字符串]
K: V
字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;
案例:
user:
name: zhangsan
age: 20
@ConfigurationProperties(prefix = “user” )
数据源配置
在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同
的数据库配置方式。
首先,为了连接数据库需要引入 jdbc 支持,在 pom.xml 中引入如下配置:
org.springframework.boot
spring-boot-starter-jdbc
在 application.yml 中配置数据源信息
spring:
datasource:
url:
jdbc:mysql://127.0.0.1:3306/mybatis_db?serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
使用 JdbcTemplate 操作数据库
Spring 的 JdbcTemplate 是自动配置的,你可以直接使用@Autowired 来注入
到你自己的 bean 中来使用
导入阿里数据源 jar
在 yml 文件中注册阿里数据库连接池
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5 初始化时建立物理连接的个数
minIdle: 1 最小连接池数量
maxActive: 20 最大连接池数量
添加 DruidDataSource 配置工具类
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
在 application.yml 中配置数据源信息
mybatis:
type-aliases-package: com.ff.cms.bean
mapper-locations: classpath:mapper/*Mapper.xml
configuration:
map-underscore-to-camel-case: true
cache-enabled: true
启动类上添加@MapperScan(“接口所在的包地址”)@MapperScan(“接口所在的包地址”)
或者在接口上添加@Mapper
常用日志组件
slf4j(Simple Logging Facade for Java)
commons-logging
Log4J
Log4J2
Logback
JUL(Java Utils Logging)
springboot 中对这些组件都提供了支持,slf4j 和 commons-logging 是日志的
门面接口,它们都不是具体的日志框架,你可以指定其他主流的日志实现框架。一
般首选强烈推荐使用 slf4j + logback.
日志的级别划分:从低到高:debug
logging:
level:
com.ffyc.news: debug
file:
name: E:/log/log.log
其余信息在 logback 配置文件中
在类中使用
创建 Logger 对象
private static Logger logger = LoggerFactory.getLogger(当前类名.class);
在需要的位置调用具体的日志级别方法输出
logger.debug("user account:{},user password:{}", user.getAccount(),user.getPassword());
logger.info("user account:{},user password:{}", user.getAccount(),user.getPassword());
logger.warn("user account:{},user password:{}", user.getAccount(),user.getPassword());
logger.error("user account:{},user password:{}", user.getAccount(),user.getPassword());
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;
}*/
日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一
般都是利用 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;
}
}
mvc:
throw-exception-if-no-handler-found: true
web:
resources:
add-mappings: false
支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。
提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口。
1.导入 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>
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
@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.html 后可以在页面中看到所有需要生成接口文档的控制器名称。
http://localhost:端口/swagger-ui.html