文章目录
一、初识SpringBoot
1-1 SpringBoot简介
Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的轻量级代替品。无需开发重量级的 Enterprise JavaBean(EJB),Spring 为企业级Java 开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java 对象(Plain Old Java Object,POJO)实现了 EJB 的功能。
虽然 Spring 的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring 用 XML 配置,而且是很多 XML 配置。Spring 2.5 引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式 XML 配置。Spring 3.0 引入了基于 Java 的配置,这是一种类型安全的可重构配置方式,可以代替 XML。所有这些配置都代表了开发时的损耗。因为在思考 Spring 特性配置和解决业务问题之间需要进行思维切换,所以写配置挤占了写应用程序逻辑的时间。和所有框架一样,Spring 实用,但与此同时它要求的回报也不少。
除此之外,项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这难题实在太棘手。并且,依赖管理也是一种损耗,添加依赖不是写应用程序代码。一旦选错了依赖的版本,随之而来的不兼容问题毫无疑问会是生产力杀手。
Spring Boot 具有如下特性:
(1)为基于 Spring 的开发提供更快的入门体验
(2)开箱即用,没有代码生成,也无需 XML 配置。同时也可以修改默认值来满足特定的需求。
(3)提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。
(4)Spring Boot 并不是不对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式。
1-2 创建SpringBoot项目
通过官网创建项目
https://start.spring.io
在IDEA中导入刚刚下载的项目
使用IDEA创建项目
通过IDEA中的Maven创建
在pom.xml中加入以下内容:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 控制jdk的版本 -->
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 单元测试的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- SpringBoot的打包插件,如果没有此插件打包时不会将依赖导入的 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
手动创建启动器类
二、SpringBoot项目结构
2-1 POM文件
1. 继承
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
spring-boot-starter-parent是一个特殊的启动器,用来提供相关的Maven默认依赖。使用它之后,常用的包依赖可以省去version标签。
2. 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
启动器依赖
3. 插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
将所有应用启动运行所需要的jar包都包含进来,从逻辑上将具备了独立运行的条件。
2-2 启动类
Spring Boot的启动类的作用是启动Spring Boot 项目,是基于Main 方法来运行的。
注意:启动类在启动时会做注解扫描(@Controller、@Service、@Repository…),扫描位置为同包或者子包下的注解,所以启动器应放于包的根下。
启动类的命名通常是:项目名+Application.java
@SpringBootApplication
public class SpringDemoApplication {
public static void main(String[] args) {
SpringApplication.run(QgcApplication.class, args);
}
}
2-3 启动器
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
2-4 配置文件
Spring Boot提供一个名称为application的全局配置文件,(名称必须为application且要放在resource目录下),支持properties格式与YAML格式。
1. Properties 格式
application.properties配置Tomcat监听端口
server.port = 9090
2. YAML
YAML格式配置文件的扩展名可以是yaml或yml
#存储k-v键值对,k后面必须要有一个空格
name: 林秃子
#对象
student:
name: 林秃
age: 30
#对象(行内写法)
student2: {name: 狗德,age: 30}
#数组
pets: [dog,pig]
pets2:
- 狗得
- dog
- pig
3. 加载顺序
注:如果同一个目录下,有application.yml也有application.properties,默认先读取application.properties
加载顺序如下:
当前项目根目录下的一个/config子目录中(最高)
当前项目的根目录中(其次)
项目的resources既classpath根路径下的/config目录中(一般)
项目的resources既classpath根路径中(最后)
4. 占位符
${}
可以获取框架中提供的方法,如${random.int}
${random.value} - 类似uuid的随机数,没有 - 连接
${random.uuid} - 生成一个uuid,有 - 连接
${random.int} - 随机取整型范围内的一个值
${random.int(10)} - 随机生成 10 以内的一个数
${random.int(100,200)} - 随机.取整形 100 - 200 范围内的一个值
${random.long} - 随机取长整型范围内的一个值
${random.long(100,200)} - 随机取长整型 100 - 200 范围内的一个值
同时也可以将配置文件键的值赋值给另一个键作为值
myport: 9090
server:
port: ${myport}
2-5 核心注解
@SpringBootApplication
是SpringBoot的启动类。
此注解等同于@Configuration + @EnableAutoConfiguration + @ComponentScan
@SpringBootConfiguration
此注解是@Configuration注解的派生注解,跟@Configuration注解的功能一致,标注这个类是一个配置类,只不过@SpringBootConfiguration 是 springboot的注解,而@Configuration是Spring的注解
@Configuration
通过对bean对象的操作代替spring中的xml文件
@EnableAutoConfiguration
Spring Boot自动配置:尝试根据你添加的jar依赖自动配置你的Spring应用。是@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)注解的组合
@AutoConfigurationPackage
通俗的讲是定位対哪些组件进行扫描的
自动注入主类下所在包下所有的加了注解的类(@Controller,@Service等),以及配置类(@Configuration)
@Import(AutoConfigurationImportSelector.class)
负责导入AutoConfigurationImportSelector这个类
@ComponentScan
组件扫描,可以自动发现和装配一些Bean
三、编写HelloWord
3-1 创建项目
3-2 修改pom.xml
加入如下内容
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 控制jdk的版本 -->
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 单元测试的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- SpringBoot的打包插件,如果没有此插件打包时不会将依赖导入的 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3-3 创建启动类
创建位置:
@SpringBootApplication
public class SpringBootHelloWordApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootHelloWordApplication.class, args);
}
}
3-4 创建Controller
@RestController
public class HelloController {
@RequestMapping("/test")
public String printHelloWord(){
return "HelloWord";
}
}
四、SpringBoot整合Web层技术
4-1 整合Servlet
方式一(通过注解扫描)
-
编写Servlet
@WebServlet(name = "FirstServlet",urlPatterns = "/first") public class firstServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response){ System.out.println("Hello Word"); } }
-
在启动类上添加注解
@ServletComponentScan
方式二(通过配置类)
-
编写Servlet
public class SecondServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response){ System.out.println("Second Servlet"); } }
-
编写配置类
@Configuration public class ServletConfig { @Bean //此注解表示以下方法在加载时运行 public ServletRegistrationBean getServletRegistrationBean(){ ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet()); bean.addUrlMappings("/second"); return bean; } }
4-2 整合Filter
方式一(通过注解扫描)
-
编写filter(注意导包导的是javax.servlet.*;下的)
//@WebFilter(filterName = "FirstFilter",urlPatterns = {"*.do","*.html"}) @WebFilter(filterName = "FirstFilter",urlPatterns = "*") public class FirstFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("进入FirstFilter.."); filterChain.doFilter(servletRequest,servletResponse); System.out.println("离开FirstFilter.."); } }
-
编写启动类,加入以下注解即可
@ServletComponentScan
方式二(通过配置类)
-
编写filter(注意导包导的是javax.servlet.*;下的)
public class FirstFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("进入FirstFilter.."); filterChain.doFilter(servletRequest,servletResponse); System.out.println("离开FirstFilter.."); } }
-
编写配置类
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean getFilterRegistrationBean(){ FilterRegistrationBean bean = new FilterRegistrationBean(new FirstFilter()); bean.addUrlPatterns("/second"); return bean; } }
4-3 整合Listener
方式一(注解扫描)
-
编写Listener
@WebListener public class FirstListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent sce) { } @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("Listener...Init..."); } }
-
修改启动类(加入以下注解即可)
@ServletComponentScan
方式二(参考上面)
五、访问静态资源
在src/main/resources下面有两个文件夹,static和templates。SpringBoot默认在static目录中存放静态页面,而templates中放动态页面。
5-1 static目录
Spring Boot通过classpath/static目录访问静态资源。注意存放静态资源的目录名称必须是static
访问静态资源的位置
优先级从上到下
classpath:/MATE-INF/resource
classpath:/resources/
classpath:/static/
classpath:/public/
5-2 文件上传
编写controller
@RestController
public class FileUpLoadController {
@PostMapping("/fileupload")
public String fileupload(MultipartFile multipartFile) throws IOException {
System.out.println(multipartFile.getOriginalFilename());
multipartFile.transferTo(new File("c:/" + multipartFile.getOriginalFilename()));
return "OK";
}
}
改变上传文件的大小
spring:
servlet:
multipart:
max-file-size: 10MB
5-3 templates 目录
在Spring Boot中不推荐使用jsp作为视图层技术,而是默认使用Thymeleaf来做动态页面。Templates目录这是存放Thymeleaf的页面。
5-4 SpringBoot整合Freemarker
-
加入Freemarker启动器
<!--FreeMarker启动器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
-
修改配置文件(Freemarker扩展名)
spring: freemarker: suffix: .ftl
-
创建Freemarker文件
<table width="60%" align="center" border="1"> <tr> <th>姓名</th> <th>性别</th> <th>家庭住址</th> </tr> <#list users as user> <tr> <td>${user.username}</td> <td>${user.sex}</td> <td>${user.address}</td> </tr> </#list> </table>
六、Thymeleaf模板
6-1 基本使用
-
在pom.xml中加入Thymeleaf启动器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
-
在src目录下的thymeleaf目录下创建html
<!-- 引入命名空间 --> <html xmlns:th="http://www.thymeleaf.org"> <body> <span th:text="秃子德"></span> <hr> <span th:text="${msg}"></span> </body> </html>
注意上面的 th属性可以加到任何标签上,它的作用就是往标签内添加内容
6-2 基本语法
基本语法
<body>
<!-- 输出字符串 -->
<span th:text="秃子德"></span>
<!-- 输出域中的变量 -->
<span th:text="${msg}"></span>
<!-- 只能在input标签中使用 -->
<input type="text" th:value="abc"/>
</body>
使用内置对象strings
注意:引用内置对象需要使用#
大部分内置对象的名称都已s结尾。如strings、numbers、dates
<!-- 判断字符串是否为空 -->
${#strings.isEmpty(key)}
<!-- 判断字符串是否包含子串 -->
${#strings.contains(msg,'T')}
<!-- 判断字符串是否以子串开头 -->
${#strings.startWith(msg,'a')}
<!-- 判断字符串是否以子串结尾 -->
${#strings.endsWith(msg,'a')}
<!-- 返回字符串的长度 -->
${#strings.length(msg)}
<!-- 查找子串的位置 -->
${#strings.indexOf(msg,'h')}
<!-- 截取子串 -->
${#strings.substring(msg,2)}
<!-- 如下所示 -->
<span th:text="${#strings.isEmpty(msg)}"></span>
使用内置对象dates
<!-- 日期格式转换 -->
${#dates.format(key)}
<!-- 指定转换的类型 -->
${#dates.format(key,'yyyy-MM-dd')}
条件判断
-
th:if
th:if 条件判断
-
th:switch / th:case
th:switch / th:case 与java中的switch等效 th:case = "*" 表示java中switch的default
<span th:if="${sex} == 0">男</span> <span th:if="${sex} == 1">女</span>
迭代遍历
th:each迭代List
<table border="1" width="50%" align="center">
<tr>
<th>用户名</th>
<th>性别</th>
<th>家庭住址</th>
</tr>
<tr th:each="temp : ${users}">
<td th:text="${temp.username}"/>
<td th:text="${temp.sex}"/>
<td th:text="${temp.address}"/>
</tr>
</table>
th:each迭代Map
//java代码
Map<String,User> map = new HashMap();
map.put("user1",new User("秃子德","男","莒县"));
map.put("user2",new User("凹凸曼","男","济宁"));
model.addAttribute("map",map);
//html
<tr th:each="m : ${map}">
<td th:text="${m.value.username}"></td>
<td th:text="${m.value.sex}"></td>
<td th:text="${m.value.address}"></td>
<td th:text="${m.key}"></td>
</tr>
th:each状态变量
index:当前迭代器的索引从0开始
count:当前迭代对象的计数从1开始
size:被迭代对象的长度
odd/even:布尔值,当前循环是否是偶数/奇数 从0开始
first:布尔值,当前循环的是否是第一条,如果是则返回true
last:布尔值,当前循环的是否是最后一条,如果是则返回true
<tr th:each="temp,sign : ${users}">
<td th:text="${sign.index}"/>
<td th:text="${sign.count}"/>
<td th:text="${sign.size}"/>
</tr>
操作域对象
<!-- 获取request域对象 -->
request.setAttribute("req","获取request成功"); //java中存入数据
<span th:text="${#httpServletRequest.getAttribute('req')}">方式一</span>
<span th:text="${#request.getAttribute('req')}">方式二</span>
<!-- 获取session域对象 -->
request.getSession().setAttribute("ses","获取session成功");
<span th:text="session.ses">方式一</span>
<span th:text="${#session.getAttribute('ses')}">方式二</span>
<!-- 获取servletContext域对象 -->
request.getSession().getServletContext().setAttribute("context","获取ServletContext成功");
<span th:text="${#servletContext.getAttribute('context')}">方式一</span>
<span th:text="application.context">方式二</span>
URL表达式
<!-- 绝对路径 -->
<a th:href="@{http://www.baidu.com}">绝对路径</a>
<!-- 相对路径 -->
<a th:href="@{/show}">相对路径</a>
<!-- 相对于服务器 -->
<a th:href="@{~/project2}">相对于服务器</a>
url传递参数
<!-- Restful -->
<a th:href="@{/show/{id}(id=1)}">Restful风格</a>
<!-- 可以在括号内加入前面url中不存在的参数,代表使用普通方式传值 -->
<a th:href="@{/show/{id}(id=1,name=${name}}">Restful风格</a>
6-3 Thymeleaf配置
spring:
thymeleaf:
cache: false #关闭页面缓存
encoding: UTF-8 #设置页面编码
mode: HTML5 #试图解析模板,如果使用的是html5需要加入此项配置
七、SpringBoot整合MyBatis
7-1 启动器及依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Mybatis启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!-- Mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- Druid依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.2</version>
</dependency>
7-2 配置数据源
在application.yaml中配置如下
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
username: root
password: rong98
type: com.alibaba.druid.pool.DruidDataSource
7-3 使用generator插件生成代码
添加generator插件
在pom.xml中加入如下代码
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
<!--指定配置文件的路径-->
<configuration>
<configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
创建配置文件
在resources目录下创建generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="my" targetRuntime="MyBatis3">
<!--1. value="true"去掉注释 ,如果不去掉注释的时候,
第二次生成的时候不会再后面追加内容,但是去掉注释的时候,
在第二次以后需要生成文件的时候先把它删掉,再生成,
否则就会在原来的文件后面追加内容-->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--2.加载连接数据库信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="rong980325." />
<!--3.生成模型的包名和位置 -->
<javaModelGenerator targetPackage="com.qgc.pojo"
targetProject=".\src\main\java">
<!--targetProject= 指定包所在的位置,只需要到src/man/java -->
<property name="enableSubPackages" value="false"/>
<property name="trimStrings" value="true"/>
<!--如果包不存在,创建一个 -->
</javaModelGenerator>
<!--4.生成映射文件包名和位置 -->
<sqlMapGenerator targetPackage="com.qgc.mappers"
targetProject=".\src\main\java"><!-- 指定包的位置 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!--5.生成dao层的包和位置 -->
<javaClientGenerator targetPackage="com.qgc.dao" type="XMLMAPPER"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!--6. 我要生成的表 可以一次性生成多张表 tableName是表名 domainObjectName是实体名 -->
<table tableName="user" domainObjectName="User"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
enableInsert="false"/>
</context>
</generatorConfiguration>
生成代码
7-4 配置资源拷贝插件
<!--配置资源拷贝插件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.yaml</include>
<include>**/*.html</include>
</includes>
</resource>
</resources><!--配置资源拷贝插件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
</includes>
</resource>
</resources>
7-5 启动类添加注解
@MapperScan("com.qgc.mapper") //指定扫描接口与配置映射文件
7-6 MyBatis其它配置项
#当dao接口与其对应的mapper不在同一个包下的时候,使用此项配置。可以指定mapper映射文件的位置
mybatis:
mapper-locations: classpath:/mapper/*.xml
# 给包起别名,这样在mapper映射文件中就不用写类具体在哪个包下了,直接写类名就可以
type-aliases-package: com.qgc.pojo
# 如果报错,删除以上所有的中文注释
八、SpringBoot处理异常
方式一
在template目录下创建error.html,SpringBoot发生异常时自动会重定向到此页面下
方式二
全局的自定义异常处理
@ControllerAdvice
public class GlobalException {
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView nullpointExceptionHandler(Exception e){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("error",e.toString());
modelAndView.setViewName("error1");
return modelAndView;
}
}
方式三
@Configuration
public class GlobalException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
// 判断不同的异常类型,做不同的页面跳转
if (e instanceof NullPointerException){
mv.setViewName("error1");
}
if (e instanceof ArithmeticException){
mv.setViewName("error1");
}
mv.addObject("error1",e.toString());
return mv;
}
}
九、SpringBoot度量指标与健康检查
9-1 服务端
创建SpringBoot服务端
-
**版本一致:**如果SpringBoot的版本为2.2.X,那么Spring Boot Admin的版本也应为2.2.X
本示例中使用的SpringBoot的版本为2.2.7,SpringBoot Admin的版本为2.2.3
-
添加SpringBootAdmin的启动器
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.2.3</version> </dependency>
-
在启动类上添加注解
@EnableAdminServer
-
成功访问
9-2 客户端
-
在SpringBoot要作为客户端的项目中添加如下启动器
注意:启动器的版本尽量和服务端启动器的版本保持一致
<!-- https://mvnrepository.com/artifact/de.codecentric/spring-boot-admin-starter-client --> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
在application.yaml配置文件中配置如下信息
spring: boot: admin: client: url: http://localhost:9091/ #指定服务端的访问地址 management: endpoints: web: base-path: /actuator #配置访问端点的根路径p exposure: include: '*' #指定开启端点访问
-
访问成功
十、日志管理
SpringBoot默认使用Logback组件作为日志管理。Logback是由log4j创始人设计的一个开源日志组件。
在SpringBoot项目中我们不需要额外添加Logback的依赖,因为在spring-boot-starter或者spring-boot-starter-web中已经包含了Logback的依赖。
10-1 LogBack读取配置文件的步骤
- 在classpath下查找文件logback-test.xml
- 如果文件不存在,则查找logback.xml
- 如果两个文件都不存在,Logback用BasicConfiguration自动对自己进行最小化配置
10-2 添加Logback配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${catalina.base}/logs/" />
<!--控制台日志, 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--文件日志, 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
</configuration>
@RestController
public class testController {
/*注意此处的Logger要导入slf4j包下的*/
private final static Logger log = LoggerFactory.getLogger(testController.class);
@RequestMapping("/a")
public String test(){
log.info("测试");
return "OK";
}
}
在配置文件下可以关闭指定包
logging:
level:
com: off