随着动态语言的流行(Ruby、Groovy、Scala、Node、Js), Java的开发显得格外的笨重:配置繁杂,开发效率低,在广泛复杂的部署过程中,与第三方技术集成困难。
在这种情况下,SpringBoot应运而生。它使用了“习惯重于配置”(在项目中有大量的配置,除了内置的习惯性配置之外,让您不需要手动配置)的理念,使您的项目快速启动和运行。使用SpringBoot很容易创建一个独立的运行(运行jar,嵌入式Servlet容器),准生产级别的基于Spring框架的项目,使用SpringBoot您可以不需要或只需要很少的Spring配置。
Spring Boot 简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是启动器),这样我们就可以简单的开始。多数Spring Boot应用只需要很少的Spring配置。
我们可以使用SpringBoot创建java应用,并使用java –jar 启动它,就能得到一个生产级别的web工程。
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法。
@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解:
这里重点的注解有3个:
我们继续点击查看源码:
通过这段我们可以看出,在这个注解上面,又有一个@Configuration
注解。通过上面的注释阅读我们知道:这个注解的作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了@Configuration
的类,并且读取其中的配置信息。而@SpringBootConfiguration
是来声明当前类是SpringBoot应用的配置类,项目中只能有一个。所以一般我们无需自己添加。
SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。
所以,我们使用SpringBoot构建一个项目,只需要引入所需框架的依赖,配置就可以交给SpringBoot处理了。除非你不希望使用SpringBoot的默认配置,它也提供了自定义配置的入口。
通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包
而我们的@SpringBootApplication注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。因此,一般启动类会放在一个比较前的包目录中。
通过上述,我们得知,Spring Boot会根据项目中的jar包依赖,自动做出配置,Spring Boot支持的自动配置如下(非常多):
如果我们不需要Spring Boot自动配置,想关闭某一项的自动配置,该如何设置呢?
比如:我们不想自动配置Redis,想手动配置。
启动Spring Boot项目后会看到这样的图案:
这个图片其实是可以自定义的:
1:创建文本文件,并且将该文件命名为banner.txt
2.将banner.txt拷贝到项目的resources目录中:
3.重新启动程序,查看效果:
推荐Banner的两个网址:
https://www.bootschool.net/ascii-art;bsid=40D9C21959E6D5EA4B04CCC0369A1629
https://www.bootschool.net/ascii
如果不想看到任何的banner,也是可以将其关闭的:
Spring Boot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到resources下。
1.修改tomcat的端口为8088
2.设置应用程序上下文
现在,我们的项目是一个jar工程,那么就没有webapp,我们的静态资源该放哪里呢?
回顾我们上面看的源码,有一个叫做ResourceProperties的类,里面就定义了静态资源的默认查找路径:
默认的静态资源路径为:
classpath:/static/
目录下。其实,在刚才引入jdbc启动器的时候,SpringBoot已经自动帮我们引入了一个连接池:
因此,我们只需要指定连接池参数即可:
# 连接四大参数
spring.datasource.url=jdbc:mysql://localhost:3306/dms
spring.datasource.username=root
spring.datasource.password=root
# 可省略,SpringBoot自动推断
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10
当然,如果你更喜欢Druid连接池,也可以使用Druid官方提供的启动器:
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.6version>
dependency>
而连接信息的配置与上面是类似的,只不过在连接池特有属性上,方式略有不同:
#初始化连接数
spring.datasource.druid.initial-size=1
#最小空闲连接
spring.datasource.druid.min-idle=1
#最大活动连接
spring.datasource.druid.max-active=20
#获取连接时测试是否可用
spring.datasource.druid.test-on-borrow=true
#监控页面启动
spring.datasource.druid.stat-view-servlet.allow=true
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>1.3.2version>
dependency>
配置,基本没有需要配置的:
# mybatis 别名扫描
mybatis.type-aliases-package=com.lxw.pojo
# mapper.xml文件位置,如果没有映射文件,请注释掉
mybatis.mapper-locations=classpath:mappers/*.xml
需要注意,这里没有配置mapper接口扫描包,因此我们需要给每一个Mapper接口添加@Mapper
注解,才能被识别。
@Mapper
public interface UserMapper {
}
SpringBoot并不推荐使用jsp,但是支持一些模板引擎技术:
编写一个controller方法,返回一些用户数据,放入模型中,将来在页面渲染
@GetMapping("/all")
public String all(ModelMap model) {
// 查询用户
List<User> users = this.userService.queryAll();
// 放入模型
model.addAttribute("users", users);
// 返回模板名称(就是classpath:/templates/目录下的html文件名)
return "users";
}
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
根据上面的文档介绍,模板默认放在classpath下的templates文件夹,我们新建一个html文件放入其中:
编写html模板,渲染模型中的数据:
注意,把html 的名称空间,改成:xmlns:th=“http://www.thymeleaf.org” 会有语法提示
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页title>
<style type="text/css">
table {border-collapse: collapse; font-size: 14px; width: 80%; margin: auto}
table, th, td {border: 1px solid darkslategray;padding: 10px}
style>
head>
<body>
<div style="text-align: center">
<span style="color: darkslategray; font-size: 30px">欢迎光临!span>
<hr/>
<table class="list">
<tr>
<th>idth>
<th>姓名th>
<th>用户名th>
<th>年龄th>
<th>性别th>
<th>生日th>
tr>
<tr th:each="user : ${users}">
<td th:text="${user.id}">1td>
<td th:text="${user.name}">张三td>
<td th:text="${user.userName}">zhangsantd>
<td th:text="${user.age}">20td>
<td th:text="${user.sex}">男td>
<td th:text="${user.birthday}">1980-02-30td>
tr>
table>
div>
body>
html>
Swagger 是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>2.6.0version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>2.6.0version>
dependency>
package com.example.demo.tools;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author yxm
* @date 2021/3/1
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo()) // 配置说明
.select()//选择那些路径和 api 会生成 document
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller")) // 拦截的包路径
.paths(PathSelectors.any())// 拦截的接口路径
.build(); // 创建
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("springboot利用swagger构建api文档"))// 标题
.description("SpringBoot整合Swagger,详细信息......")// 描述
.version("1.0")// 版本
.contact(new Contact("倍速提供","www.baidu.com","[email protected]"))// 联系
.termsOfServiceUrl("http://baidu.com")
.build();
}
}
http://localhost:8080/swagger-ui.html
@ApiIgnore忽略暴露的 api
@ApiOperation(value = "查找", notes = "根据用户 ID 查找用户") 添加说明
其他注解:
@Api:用在类上,说明该类的作用
@ApiImplicitParams:用在方法上包含一组参数说明
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses 中,一般用于表达一个错误的响应信息code:数字,例如 400message:信息,例如"请求参数没填好"response:抛出异常的类
@ApiModel:描述一个 Model 的信息(这种一般用在 post 创建的时候,使用@RequestBody 这样的场
景,请求参数无法使用@ApiImplicitParam 注解进行描述的时候)
@ApiModelProperty:描述一个 model 的属性
支持日志框架:Java Util Logging, Log4J2 and Logback,默认是使用logback
配置方式:默认配置文件配置和引用外部配置文件配置
默认配置文件配置(不建议使用:不够灵活,对log4j2等不够友好)
日志文件名,比如:roncoo.log,或者是 /var/log/roncoo.log
logging.file=roncoo.log
日志级别配置,比如: logging.level.org.springframework=DEBUG
logging.level.*=info
logging.level.org.springframework=DEBUG
日志级别:ERROR、WARN、INFO、DEBUG、TRACE
默认情况下,只有INFO级别以上的信息才会打印到控制台,可以自己设定日志输出级别,application.properties中加入以下代码:
logging.level.root=info
#org包下的日志级别
logging.level.org=warn
logging.level.cn.yunhe=debug
spring boot默认会加载classpath:logback-spring.xml或者classpath:logback-spring.groovy
使用自定义配置文件,配置方式为:
logging.config=classpath:logback-roncoo.xml
注意:不要使用logback这个来命名,否则spring boot将不能完全实例化
使用基于spring boot的配置
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="org.springframework.web" level="DEBUG"/>
configuration>
2.2.1去除logback的依赖包,添加log4j2的依赖包
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
exclusion>
exclusions>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-log4j2artifactId>
dependency>
2.2.2 在classpath添加log4j2.xml或者log4j2-spring.xml(spring boot 默认加载)
2.3 自定义配置文件
Spring Boot默认以jar包方式运行,可以在Maven配置如下插件,将SpringBoot导出成可执行的jar文件
<build>
<plugins>
...
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginargifactId>
<configuration>
<executable>trueexecutable>
configuration>
plugin>
<plugins>
<bulid>
在工程目录下运行命令 mvn package,会将Mavne工程打包成一个可执行的jar文件存放到target目录下。
为了验证打包成功,可以以jar方式运行打包好的xxx.jar:
> java -jar xxx.jar
也可以部署到服务器上,以jar方式运行。通常情况下还需要指定服务器端口、数据库连接地址等信息:
>java -jar -Dserver.port=9000 -Dspring.datasource.password=123456 xxx.jar
或
>javar -jar xxx.jar --server.port=9000 --spring.datasource.password=123456
a)修改打包方式为war
war
b)将嵌入式的Tomcat依赖改成provided:
org.springframework.boot
spring-boot-starter-tomcat
provided
c)将工程的启动类进行修改,使其继承SpringBootServletInitializer类,并重载configure方法