ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot) [打印本页]

作者: 十念    时间: 2024-10-14 15:59
标题: 【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot)

【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot)

1. SpringBoot先容

1.1 SpringBoot简介

SpringBoot 是一个快速开发的框架, 封装了Maven常用依赖、能够快速的整合第三方框架;简化XML设置,全部采用注解形式,内置Tomcat、Jetty、Undertow,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringBoot原理先容:
1.2体系要求

Java1.8及以上
Spring Framework 5.0及以上
本课程采用Java1.8版本、SpringBoot2.1.8版本
1.3 SpringBoot和SpringMVC区别

SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML设置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件默认集成的是SpringMVC框架。
SpringMVC是控制层。
1.4 SpringBoot和SpringCloud区别

SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML设置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
SpringMVC是控制层。
SpringCloud依赖与SpringBoot组件,利用SpringMVC编写Http协议接口,同时SpringCloud是一套完整的微服务办理框架。

2.快速入门

2.1创建一个Maven工程

2.2 pom文件引入依赖
  1. <parent>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-parent</artifactId>
  4.     <version>2.1.8.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7.     <dependency>
  8.         <groupId>org.springframework.boot</groupId>
  9.         <artifactId>spring-boot-starter-web</artifactId>
  10.     </dependency>
  11. </dependencies>
复制代码
spring-boot-starter-parent作用
在pom.xml中引入spring-boot-start-parent,spring官方的解释叫什么stater poms,它可以提供dependency management,也就是说依赖管理,引入以后在申明其它dependency的时候就不必要version了,后面可以看到。
spring-boot-starter-web作用
springweb 核心组件
2.3 @RestController
@RestController 是由 @Controller(控制层注解)+@ResponBody(数据传输格式为 json 格式)组合而成的
Rest 微服务接口开发中 rest 风格的数据传输格式为 json 格式,采用HTTP协议
在上加上RestController 表示修饰该Controller所有的方法返回JSON格式,直接可以编写
Restful接口
注意该注解是(@RestController )SpringMVC提供的哦!
2.4@EnableAutoConfiguration
该注解:作用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动设置
这个注解告诉Spring Boot根据添加的jar依赖推测你想如何设置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,以是auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。
2.5 SpringBoot的3种启动方式
方式一
  1. package com.zhaoli.service;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. @EnableAutoConfiguration
  8. public class HelloworldService {
  9.     @RequestMapping("/hello")
  10.     public String hello() {
  11.         return "Hello World!";
  12.     }
  13.     public static void main(String[] args) {
  14.         SpringApplication.run(HelloworldService.class, args);
  15.     }
  16. }
复制代码
可以请求本类中的 url
启动主程序,打开欣赏器访问http://127.0.0.1:8080/hello,可以看到页面输出Hello World

方式二
  1. package com.zhaoli.service;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  4. import org.springframework.context.annotation.ComponentScan;
  5. @ComponentScan("com.zhaoli.service")//扫包范围
  6. @EnableAutoConfiguration
  7. public class App {
  8.     public static void main(String[] args) {
  9.         SpringApplication.run(App.class, args);
  10.     }
  11. }
复制代码
  1. package com.zhaoli.service;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class HellowordService {
  6.     @RequestMapping("/hello02")
  7.     public String hello02() {
  8.         return "Hello 赵立";
  9.     }
  10. }
复制代码
可以启动扫包范围下的所有类中的 url
方式三(保举利用)
在启动类上直接加上@SpringBootApplication即可
@SpringBootApplication 被 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解所修饰,换言之 Springboot 提供了统一的注解来替代以上三个注解
扫包范围:在启动类上加上@SpringBootApplication注解,当前包下大概子包下所有的类都可以扫到。
  1. package com.zhaoli.service;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.annotation.ComponentScan;
  6. @SpringBootApplication
  7. public class App {
  8.     public static void main(String[] args) {
  9.         SpringApplication.run(App.class, args);
  10.     }
  11. }
复制代码

3. Web开发

3.1 静态资源访问

在我们开发Web应用的时候,必要引用大量的js、css、图片等静态资源。
默认设置
Spring Boot默认提供静态资源目次位置需置于classpath下,目次名需符合如下规则:
  1. /static
  2. /public
  3. /resources       
  4. /META-INF/resources
复制代码
举例:我们可以在src/main/resources/目次下创建static,在该位置放置一个图片文件。启动程序后,实验访问http://localhost:8080/one.png。如能显示图片,设置成功。
微服务项目
前后端分离
前端----vue----前端工程师
后端—springboot–后端工程师
动静分离 部署cdn上
cdn 减少带宽距离传输 减少自己服务器带宽;
3.2 渲染Web页面

com.zhaoli.controller—视图层 渲染我们页面
com.zhaoli.service—业务逻辑层
com.zhaoli.dao—数据库访问层
渲染Web页面
在之前的示例中,我们都是通过@RestController来处置惩罚请求,以是返回的内容为json对象。那么如果必要渲染html页面的时候,要如何实现呢?
模板引擎 能够非常好的帮助seo搜刮到该网页
在动态HTML实现上Spring Boot依然可以完美胜任,而且提供了多种模板引擎的默认设置支持,以是在保举的模板引擎下,我们可以很快的上手开发动态网站。
Spring Boot提供了默认设置的模板引擎重要有以下几种:
3.3 YML与Properties用法

SpringBoot支持两种设置方式,一种是properties文件,一种是yml。(都是在resources目次下)
利用yml可以减少设置文件的重复性。
例如:application.properties设置
  1. test.name=zhaoli
  2. test.age=21
复制代码
例如:application.yml设置
  1. test:
  2.   name: zhaoli
  3.   age: 20
复制代码
在企业中application.yml方式用的是比较多的;
  1. package com.zhaoli.service;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class MayiktPropertiesService {
  7.     @Value("${mayikt.name}")
  8.     private String name;
  9.     @Value("${mayikt.age}")
  10.     private String age;
  11.     @RequestMapping("/getProperties")
  12.     public String getProperties(){
  13.         return name+"---------"+age;
  14.     }
  15. }
复制代码
3.4利用Freemarker模板引擎渲染web视图

1.Maven依赖
  1. <!-- 引入freeMarker的依赖包. -->
  2. <dependency>
  3.     <groupId>org.springframework.boot</groupId>
  4.     <artifactId>spring-boot-starter-freemarker</artifactId>
  5. </dependency>
复制代码
2.后端代码
  1. package com.zhaoli.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import java.util.Map;
  5. @Controller
  6. public class FreemarkerIndexController {
  7.     @RequestMapping("/freemarkerIndex")
  8.     public String freemarkerIndex(Map<String,String> result){
  9.         //转发到页面展示数据
  10.         result.put("name","赵立");
  11.         return "freemarkerIndex";
  12.     }
  13. }
复制代码
3.前端代码
在src/main/resources/创建一个templates文件夹,用来存 *.ftl
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4.     <meta charset="UTF-8"/>
  5.     <title></title>
  6. </head>
  7. <body>
  8. ${name}
  9. </body>
  10. </html>
复制代码
4.Freemarker其他用法
Freemarker设置
新建application.yml文件 (加粗提示对应的设置可以进行修改)
  1. spring:
  2. ##Freemarker配置
  3.   http:
  4.     encoding:
  5.       force: true
  6.       ### 模版引擎编码为UTF-8
  7.       charset: UTF-8
  8.   freemarker:
  9.     allow-request-override: false
  10.     cache: false
  11.     check-template-location: true
  12.     charset: UTF-8
  13.     content-type: text/html; charset=utf-8
  14.     expose-request-attributes: false
  15.     expose-session-attributes: false
  16.     expose-spring-macro-helpers: false
  17.     ## 模版文件结尾.ftl
  18.     suffix: .ftl
  19.     ## 模版文件目录
  20.     template-loader-path: classpath:/templates
复制代码
*.ftl 文件中利用符号替换方法
符号替换为(条件判定)>gt 大概 <#if(x>y)>>=gte 大概 <#if(x>=y)><lt 大概 <#if(x<y)><=lte 大概 <#if(x<=y)> 判定条件用法
com.zhaoli.controller.FreemarkerIndexController
  1. @RequestMapping("/freemarkerIndex02")
  2. public String freemarkerIndex02(Map<String, Object> result) {
  3.     //转发到页面展示数据
  4.     result.put("name", "赵立");
  5.     //0为男 1为女
  6.     result.put("sex", "0");
  7.     result.put("age", 21);
  8.     return "freemarkerIndex02";
  9. }
复制代码
freemarkerIndex02.ftl
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4.     <meta charset="UTF-8"/>
  5.     <title></title>
  6. </head>
  7. <body>
  8. ${name}
  9. <#if sex=='0'>
  10.     男
  11. <#elseif sex='1'>
  12.     女
  13. <#else >
  14.     其他
  15. </#if>
  16. <#if age gt 17>
  17.     已经成年了
  18. <#else >
  19.     没成年
  20. </#if>
  21. </body>
  22. </html>
复制代码

list集合
com.zhaoli.controller.FreemarkerIndexController
  1. @RequestMapping("/freemarkerIndex03")
  2. public String freemarkerIndex03(Map<String, Object> result) {
  3.     //转发到页面展示数据
  4.     List<String> userLists = new ArrayList<>();
  5.     userLists.add("zl");
  6.     userLists.add("fj");
  7.     userLists.add("lfc");
  8.     userLists.add("ywq");
  9.     result.put("userList",userLists);
  10.     return "freemarkerIndex03";
复制代码
freemarkerIndex03.ftl
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4.     <meta charset="UTF-8"/>
  5.     <title></title>
  6. </head>
  7. <body>
  8. <#list userList as user>
  9.     ${user}
  10. </#list>
  11. </body>
  12. </html>
复制代码
3.5 利用thymeleaf渲染Web页面

1 .什么是thymeleaf
thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎,类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。
2.Maven依赖
  1. <!--引入thymeleaf的依赖-->
  2. <dependency>
  3.     <groupId>org.springframework.boot</groupId>
  4.     <artifactId>spring-boot-starter-thymeleaf</artifactId>
  5. </dependency>
复制代码
3.设置文件新增
新建application.yml文件
  1. ###ThymeLeaf配置
  2. spring:
  3.   thymeleaf:
  4.     #prefix:指定模板所在的目录
  5.     prefix: classpath:/templates/
  6.     #check-tempate-location: 检查模板路径是否存在
  7.     check-template-location: true
  8.     #cache: 是否缓存,开发模式下设置为false,避免改了模板还要重启服务器,线上设置为true,可以提高性能。
  9.     cache: true
  10.     suffix:  .html
  11.     encoding: UTF-8
  12.     mode: HTML5
复制代码
4.案例代码
com.zhaoli.entity.UserEntity
  1. package com.zhaoli.entity;
  2. public class UserEntity {
  3.     private String userName;
  4. private Integer age;
  5. }
复制代码
com.zhaoli.controller.ThymeleafController
  1. package com.zhaoli.controller;
  2. import com.zhaoli.entity.UserEntity;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import java.util.Map;
  6. @Controller
  7. public class ThymeleafController {
  8.     @RequestMapping("/thymeleaf")
  9.     public String thymeleaf(Map<String, Object> result) {
  10.         result.put("user", new UserEntity("赵立", 20));
  11.         return "thymeleaf";
  12.     }
  13. }
复制代码
在src/main/resources/创建一个templates文件夹,用来存 *html
  1. <!DOCTYPE html>
  2. <!--需要在HTML文件中加入以下语句: -->
  3. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  4.     <head>
  5.         <meta charset="UTF-8">
  6.         <title>Show User</title>
  7.     </head>
  8.     <body>
  9.         <table>
  10.             姓名:<span th:text="${user.userName}"></span>
  11.             年龄:<span th:text="${user.age}"></span>
  12.         </table>
  13.     </body>
  14. </html>
复制代码
5.高级写法
循环语句:
com.zhaoli.entity.UserEntity 同上
com.zhaoli.controller.ThymeleafController
  1. @RequestMapping("/thymeleaf02")
  2.     public String thymeleaf02(Map<String, Object> result) {
  3.         List<UserEntity> userLists = new ArrayList<>();
  4.         userLists.add(new UserEntity("赵立", 21));
  5.         userLists.add(new UserEntity("fj", 20));
  6.         result.put("userList", userLists);
  7.         return "thymeleaf02";
  8. }
复制代码
thymeleaf02.html
  1. <!DOCTYPE html>
  2. <!--需要在HTML文件中加入以下语句: -->
  3. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <title>Show User</title>
  7. </head>
  8. <body>
  9. <table>
  10.     <ul th:each="user:${userList}">
  11.         <li th:text="${user.userName}"></li>
  12.         <li th:text="${user.age}"></li>
  13.     </ul>
  14. </table>
  15. </body>
  16. </html>
复制代码
If判定:
  1. <span th:if="${user.age>17}">已经成年啦</span>
  2. <span th:if="${user.age<17}">未成年</span>
复制代码
详细可以更多语法可以查看https://www.thymeleaf.org/documentation.html

4.数据库访问

4.1 springboot整合利用JdbcTemplate

1.pom文件引入
  1. <parent>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-parent</artifactId>
  4.     <version>2.1.8.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7.     <dependency>
  8.         <groupId>org.springframework.boot</groupId>
  9.         <artifactId>spring-boot-starter-web</artifactId>
  10.     </dependency>
  11.     <!-- 引入freeMarker的依赖包. -->
  12.     <dependency>
  13.         <groupId>org.springframework.boot</groupId>
  14.         <artifactId>spring-boot-starter-freemarker</artifactId>
  15.     </dependency>
  16.     <!--引入thymeleaf的依赖-->
  17.     <dependency>
  18.         <groupId>org.springframework.boot</groupId>
  19.         <artifactId>spring-boot-starter-thymeleaf</artifactId>
  20.     </dependency>
  21.     <!-- SpringBoot 整合 jdbc 模板框架-->
  22.     <dependency>
  23.         <groupId>org.springframework.boot</groupId>
  24.         <artifactId>spring-boot-starter-jdbc</artifactId>
  25.     </dependency>
  26.     <!-- SpringBoot 整合 mysql 驱动类 -->
  27.     <dependency>
  28.         <groupId>mysql</groupId>
  29.         <artifactId>mysql-connector-java</artifactId>
  30.         <version>5.1.21</version>
  31.     </dependency>
  32. </dependencies>
复制代码
2.application.yml新增设置
  1.   ##springboot整合使用JdbcTemplate
  2.   datasource:
  3.     url: jdbc:mysql://localhost:3306/mayikt_springboot?serverTimezone=UTC&useSSL=false
  4.     username: root
  5.     password: 20020806
  6.     driver-class-name: com.mysql.jdbc.Driver
复制代码
3.数据库表布局
  1. CREATE TABLE `users` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `name` varchar(32) NOT NULL COMMENT '用户名称',
  4.   `age` int(11) DEFAULT NULL,
  5.   PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
复制代码
4.案例代码
com.zhaoli.entity.UserEntity
  1. public class MayiktUserEntity {
  2.     private Integer id;
  3.     private String userName;
  4. private Integer age;
  5. }
复制代码
com.zhaoli.service.UserService
  1. package com.zhaoli.service;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class UserService {
  8.     @Autowired
  9.     private JdbcTemplate jdbcTemplate;
  10.     /**
  11.      * 插入数据到 users 表
  12.      */
  13.     @RequestMapping("/inserUser")
  14.     public String inserUser(String userName, Integer age) {
  15.         int update = jdbcTemplate.update("INSERT INTO users VALUES(null,?,?);", userName, age);
  16.         return update > 0 ? "success" : "fail";
  17.     }
  18. }
复制代码
com.zhaoli.App  App类
  1. package com.zhaoli;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class App {
  6.     public static void main(String[] args) {
  7.         SpringApplication.run(App.class, args);
  8.     }
  9. }
复制代码
4.2 springboot整合利用mybatis

1.pom文件引入
  1. <!-- springboot 整合mybatis -->
  2. <dependency>
  3.     <groupId>org.mybatis.spring.boot</groupId>
  4.     <artifactId>mybatis-spring-boot-starter</artifactId>
  5.     <version>1.1.1</version>
  6. </dependency>
复制代码
2.application.yml 新增设置
  1.   ##springboot整合使用mybatis
  2.   datasource:
  3.     url: jdbc:mysql://localhost:3306/mayikt_springboot?serverTimezone=UTC&useSSL=false
  4.     username: root
  5.     password: 20020806
  6.     driver-class-name: com.mysql.jdbc.Driver
复制代码
3.案例代码
数据库表布局同上
com.zhaoli.entity.UserEntity 同上
com.zhaoli.mapper.UserMapper 接口
  1. package com.zhaoli.mapper;
  2. import com.zhaoli.entity.MayiktUserEntity;
  3. import org.apache.ibatis.annotations.Insert;
  4. import org.apache.ibatis.annotations.Param;
  5. import org.apache.ibatis.annotations.Select;
  6. public interface UserMapper {
  7.     @Insert("INSERT INTO users VALUES(null,#{userName},#{age});")
  8.     int insertUser(@Param("userName") String userName, @Param("age")Integer age);
  9.     @Select("SELECT id,name AS userName,age FROM users WHERE id=#{id};")
  10.     MayiktUserEntity selectByUserId(@Param("id")Integer id);
  11. }
复制代码
com.zhaoli.service.UserService
  1. package com.zhaoli.service;
  2. import com.zhaoli.entity.MayiktUserEntity;
  3. import com.zhaoli.mapper.UserMapper;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. public class UserService {
  9.     @Autowired
  10.     private UserMapper userMapper;
  11.     /**
  12.      * mybatis 查询
  13.      */
  14.     @RequestMapping("/mybatisfinbyId")
  15.     public MayiktUserEntity mybatisfinbyId(Integer id){
  16.         return userMapper.selectByUserId(id);
  17.         }
  18.         /**
  19.          * mybatis 插入
  20.          */
  21.         @RequestMapping("/mybatisInser")
  22.         public String mybatisInser(String userName, Integer age) {
  23.             int inser = userMapper.insertUser(userName, age);
  24.             return inser > 0 ? "success" : "fail";
  25.         }
  26. }
复制代码
com.zhaoli.App App类
  1. package com.zhaoli;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @MapperScan("com.zhaoli.mapper")//将 mapper 包下的类、接口注入到ioc 容器中
  7. public class App {
  8.     public static void main(String[] args) {
  9.         SpringApplication.run(App.class, args);
  10.     }
  11. }
复制代码


4.3 springboot整合多数据源

1.Maven相关依赖
  1. <parent>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-parent</artifactId>
  4.     <version>2.1.8.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7.     <dependency>
  8.         <groupId>org.springframework.boot</groupId>
  9.         <artifactId>spring-boot-starter-web</artifactId>
  10.     </dependency>
  11.     <!-- springboot 整合mybatis -->
  12.     <dependency>
  13.         <groupId>org.mybatis.spring.boot</groupId>
  14.         <artifactId>mybatis-spring-boot-starter</artifactId>
  15.         <version>1.1.1</version>
  16.     </dependency>
  17.     <!-- SpringBoot 整合 mysql 驱动类 -->
  18.     <dependency>
  19.         <groupId>mysql</groupId>
  20.         <artifactId>mysql-connector-java</artifactId>
  21.         <version>8.0.18</version>
  22.     </dependency>
  23. </dependencies>
复制代码
2.数据库表布局
  1. CREATE TABLE `users` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `name` varchar(32) NOT NULL COMMENT '用户名称',
  4.   `age` int(11) DEFAULT NULL,
  5.   PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
  7. CREATE TABLE `order_number` (
  8.   `id` int(11) NOT NULL AUTO_INCREMENT,
  9.   `order_name` varchar(255) DEFAULT NULL,
  10.   PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
复制代码
3.设置文件中新增两个数据源
  1. resources.application.yml
  2. spring:
  3.   datasource:
  4.     ###会员数据库
  5.     member:
  6.       jdbc-url: jdbc:mysql://localhost:3306/user?serverTimezone=UTC&useSSL=false
  7.       username: root
  8.       password: root
  9.       driver-class-name: com.mysql.jdbc.Driver
  10.     ###订单数据库
  11.     order:
  12.       jdbc-url: jdbc:mysql://localhost:3306/order?serverTimezone=UTC&useSSL=false
  13.       username: root
  14.       password: root
  15.       driver-class-name: com.mysql.jdbc.Driver
复制代码
备注:如果是SpringBoot2设置多数据源 ,报如下错误:
jdbcUrl is required with driverClassName.大概Cause: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.] with root cause
办理方案:
spring.datasource.url 和spring.datasource.driverClassName,换成
spring.datasource.jdbc-url和spring.datasource.driver-class-name
4.数据库数据源相关设置
会员数据源
  1. @Configuration
  2. @MapperScan(basePackages = "com.zhaoli.member.mapper", sqlSessionFactoryRef = "memberSqlSessionFactory")
  3. public class MemberDataSourceConfig {
  4.     /**
  5.      * 将会员db注册到容器中
  6.      *
  7.      * @return
  8.      */
  9.     @Bean(name = "memberDataSource")
  10.     @ConfigurationProperties(prefix = "spring.datasource.member")
  11.     public DataSource memberDataSource() {
  12.         return DataSourceBuilder.create().build();
  13.     }
  14.     /**
  15.      * 将会员SqlSessionFactory注册到容器中
  16.      *
  17.      * @param dataSource
  18.      * @return
  19.      * @throws Exception
  20.      */
  21.     @Bean(name = "memberSqlSessionFactory")
  22.     public SqlSessionFactory memberSqlSessionFactory(@Qualifier("memberDataSource") DataSource dataSource) throws Exception {
  23.         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
  24.         sqlSessionFactoryBean.setDataSource(memberDataSource());
  25.         return sqlSessionFactoryBean.getObject();
  26.     }
  27.     /**
  28.      * 创建会员管理器
  29.      *
  30.      * @param dataSource
  31.      * @return
  32.      */
  33.     @Bean(name = "memberTransactionManager")
  34.     public DataSourceTransactionManager memberTransactionManager(@Qualifier("memberDataSource") DataSource dataSource) {
  35.         return new DataSourceTransactionManager(dataSource);
  36.     }
  37.     /**
  38.      * 创建订单sqlSesion模版
  39.      *
  40.      * @param sqlSessionFactory
  41.      * @return
  42.      * @throws Exception
  43.      */
  44.     @Bean(name = "memberSqlSessionTemplate")
  45.     public SqlSessionTemplate menberSqlSessionTemplate(
  46.             @Qualifier("memberSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  47.         return new SqlSessionTemplate(sqlSessionFactory);
  48.     }
  49. }
复制代码
订单数据源
  1. @Configuration
  2. @MapperScan(basePackages = "com.zhaoli.order.mapper", sqlSessionFactoryRef = "orderSqlSessionFactory")
  3. public class OrderDataSourceConfig {
  4.     /**
  5.      * 将订单db注册到容器中
  6.      *
  7.      * @return
  8.      */
  9.     @Bean(name = "orderDataSource")
  10.     @ConfigurationProperties(prefix = "spring.datasource.order")
  11.     public DataSource orderDataSource() {
  12.         return DataSourceBuilder.create().build();
  13.     }
  14.     /**
  15.      * 将订单SqlSessionFactory注册到容器中
  16.      *
  17.      * @param dataSource
  18.      * @return
  19.      * @throws Exception
  20.      */
  21.     @Bean(name = "orderSqlSessionFactory")
  22.     public SqlSessionFactory orderSqlSessionFactory(@Qualifier("orderDataSource") DataSource dataSource) throws Exception {
  23.         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
  24.         sqlSessionFactoryBean.setDataSource(orderDataSource());
  25.         return sqlSessionFactoryBean.getObject();
  26.     }
  27.     /**
  28.      * 创建订单管理器
  29.      *
  30.      * @param dataSource
  31.      * @return
  32.      */
  33.     @Bean(name = "orderTransactionManager")
  34.     public DataSourceTransactionManager orderTransactionManager(@Qualifier("orderDataSource") DataSource dataSource) {
  35.         return new DataSourceTransactionManager(dataSource);
  36.     }
  37.     /**
  38.      * 创建订单sqlSesion模版
  39.      *
  40.      * @param sqlSessionFactory
  41.      * @return
  42.      * @throws Exception
  43.      */
  44.     @Bean(name = "orderSqlSessionTemplate")
  45.     public SqlSessionTemplate menberSqlSessionTemplate(
  46.             @Qualifier("orderSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  47.         return new SqlSessionTemplate(sqlSessionFactory);
  48.     }
  49. }
复制代码
5.创建分包Mapper
会员mapper
  1. public interface MemberMapper {
  2.     @Insert("insert into users values(null,#{name},#{age});")
  3.     public int addUser(@Param("name") String name, @Param("age") Integer age);
  4. }
复制代码
订单mapper
  1. public interface OrderMapper {
  2.     @Insert("insert into order_number values(null,#{number});")
  3.     int inserOrder(@Param("number") String number);
  4. }
复制代码
6.启动项目
  1. @SpringBootApplication
  2. public class App{
  3.     public static void main(String[] args) {
  4.         SpringApplication.run(App.class);
  5.     }
  6. }
复制代码

5.事务管理

5.1 Springboot整合事务管理

springboot默认集成事务,只重要在方法上加上@Transactional即可
5.2 SpringBoot分布式事务管理

利用springboot+jta+atomikos 分布式事物Transactional管理
1.多数据源分布式事务案例
  1. @Service
  2. public class MemberService {
  3.     @Autowired
  4.     private MemberMapper memberMapper;
  5.     @Autowired
  6.     private OrderMapper orderMapper;
  7.     @Transactional(transactionManager = "memberTransactionManager")
  8.     public int addUser(String userName, Integer age) {
  9.         int result = memberMapper.addUser(userName, age);
  10.         orderMapper.inserOrder(userName);
  11.         int j = 1 / age;
  12.         return result;
  13.     }
  14. }
复制代码
2.Maven相关依赖
  1. <dependency>
  2.         <groupId>org.springframework.boot</groupId>
  3.         <artifactId>spring-boot-starter-jta-atomikos</artifactId>
  4. </dependency>
复制代码
3.新增设置文件信息
  1. spring:
  2.   datasource:
  3.     ###会员数据库
  4.     member:
  5.       url: jdbc:mysql://localhost:3306/user?serverTimezone=UTC&useSSL=false
  6.       username: root
  7.       password: root
  8.       borrowConnectionTimeout: 30
  9.       loginTimeout: 30
  10.       maintenanceInterval: 60
  11.       maxIdleTime: 60
  12.       maxLifetime: 20000
  13.       maxPoolSize: 25
  14.       minPoolSize: 3
  15.       uniqueResourceName: orderDatasource
  16.     ###订单数据库
  17.     order:
  18.       url: jdbc:mysql://localhost:3306/order?serverTimezone=UTC&useSSL=false
  19.       username: root
  20.       password: root
  21.       borrowConnectionTimeout: 30
  22.       loginTimeout: 30
  23.       maintenanceInterval: 60
  24.       maxIdleTime: 60
  25.       maxLifetime: 20000
  26.       maxPoolSize: 25
  27.       minPoolSize: 3
  28.       uniqueResourceName: memberDatasource
复制代码
4.读取设置文件信息
  1. @ConfigurationProperties(prefix = "spring.datasource.member")
  2. @Data
  3. public class MemberConfig {
  4.     private String url;
  5.     private String userName;
  6.     private String passWord;
  7.     private int minPoolSize;
  8.     private int maxPoolSize;
  9.     private int maxLifetime;
  10.     private int borrowConnectionTimeout;
  11.     private int loginTimeout;
  12.     private int maintenanceInterval;
  13.     private int maxIdleTime;
  14.     private String testQuery;
  15.     private String uniqueResourceName;
  16. }
复制代码
  1. @ConfigurationProperties(prefix = "spring.datasource.order")
  2. @Data
  3. public class OrderConfig {
  4.     private String url;
  5.     private String userName;
  6.     private String passWord;
  7.     private int minPoolSize;
  8.     private int maxPoolSize;
  9.     private int maxLifetime;
  10.     private int borrowConnectionTimeout;
  11.     private int loginTimeout;
  12.     private int maintenanceInterval;
  13.     private int maxIdleTime;
  14.     private String testQuery;
  15.     private String uniqueResourceName;
  16. }
复制代码
5.创建多数据源
  1. @Configuration
  2. @MapperScan(basePackages = "com.zhaoli.member.mapper", sqlSessionTemplateRef = "memberSqlSessionTemplate")
  3. public class MemberDataSourceConfig {
  4.     //@Configuration xml  MemberDataSourceConfig.xml
  5.     /**
  6.      * 创建我们的DataSource
  7.      */
  8.     @Bean("memberDataSource")
  9.     public DataSource memberDataSource(MemberConfig memberConfig) throws SQLException {
  10.         // 1.创建MysqlXADataSource
  11.         MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
  12.         mysqlXaDataSource.setUrl(memberConfig.getUrl());
  13.         mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  14.         mysqlXaDataSource.setPassword(memberConfig.getPassWord());
  15.         mysqlXaDataSource.setUser(memberConfig.getUserName());
  16.         mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  17.         // 2.将本地事务注册到创 Atomikos全局事务
  18.         AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
  19.         xaDataSource.setXaDataSource(mysqlXaDataSource);
  20.         xaDataSource.setUniqueResourceName(memberConfig.getUniqueResourceName());
  21.         xaDataSource.setMinPoolSize(memberConfig.getMinPoolSize());
  22.         xaDataSource.setMaxPoolSize(memberConfig.getMaxPoolSize());
  23.         xaDataSource.setMaxLifetime(memberConfig.getMaxLifetime());
  24.         xaDataSource.setBorrowConnectionTimeout(memberConfig.getBorrowConnectionTimeout());
  25.         xaDataSource.setLoginTimeout(memberConfig.getLoginTimeout());
  26.         xaDataSource.setMaintenanceInterval(memberConfig.getMaintenanceInterval());
  27.         xaDataSource.setMaxIdleTime(memberConfig.getMaxIdleTime());
  28.         xaDataSource.setTestQuery(memberConfig.getTestQuery());
  29.         return xaDataSource;
  30.     }
  31.     /**
  32.      * 创建我们的SqlSessionFactory
  33.      */
  34.     @Bean(name = "memberSqlSessionFactory")
  35.     public SqlSessionFactory memberSqlSessionFactory(@Qualifier("memberDataSource") DataSource dataSource) throws Exception {
  36.         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
  37.         sqlSessionFactoryBean.setDataSource(dataSource);
  38.         return sqlSessionFactoryBean.getObject();
  39.     }
  40.     /**
  41.      * 创建订单sqlSesion模版
  42.      */
  43.     @Bean(name = "memberSqlSessionTemplate")
  44.     public SqlSessionTemplate memberSqlSessionTemplate(
  45.             @Qualifier("memberSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  46.         return new SqlSessionTemplate(sqlSessionFactory);
  47.     }
  48. }
复制代码
  1. @Configuration
  2. @MapperScan(basePackages = "com.zhaoli.order.mapper", sqlSessionTemplateRef = "orderSqlSessionTemplate")
  3. public class OrderDataSourceConfig {
  4.     //@Configuration xml  orderDataSourceConfig.xml
  5.     /**
  6.      * 创建我们的DataSource
  7.      */
  8.     @Bean("orderDataSource")
  9.     public DataSource orderDataSource(OrderConfig orderConfig) throws SQLException {
  10.         // 1.创建MysqlXADataSource
  11.         MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
  12.         mysqlXaDataSource.setUrl(orderConfig.getUrl());
  13.         mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  14.         mysqlXaDataSource.setPassword(orderConfig.getPassWord());
  15.         mysqlXaDataSource.setUser(orderConfig.getUserName());
  16.         mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  17.         // 2.将本地事务注册到创 Atomikos全局事务
  18.         AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
  19.         xaDataSource.setXaDataSource(mysqlXaDataSource);
  20.         xaDataSource.setUniqueResourceName(orderConfig.getUniqueResourceName());
  21.         xaDataSource.setMinPoolSize(orderConfig.getMinPoolSize());
  22.         xaDataSource.setMaxPoolSize(orderConfig.getMaxPoolSize());
  23.         xaDataSource.setMaxLifetime(orderConfig.getMaxLifetime());
  24.         xaDataSource.setBorrowConnectionTimeout(orderConfig.getBorrowConnectionTimeout());
  25.         xaDataSource.setLoginTimeout(orderConfig.getLoginTimeout());
  26.         xaDataSource.setMaintenanceInterval(orderConfig.getMaintenanceInterval());
  27.         xaDataSource.setMaxIdleTime(orderConfig.getMaxIdleTime());
  28.         xaDataSource.setTestQuery(orderConfig.getTestQuery());
  29.         return xaDataSource;
  30.     }
  31.     /**
  32.      * 创建我们的SqlSessionFactory
  33.      */
  34.     @Bean(name = "orderSqlSessionFactory")
  35.     public SqlSessionFactory orderSqlSessionFactory(@Qualifier("orderDataSource") DataSource dataSource) throws Exception {
  36.         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
  37.         sqlSessionFactoryBean.setDataSource(dataSource);
  38.         return sqlSessionFactoryBean.getObject();
  39.     }
  40. //
  41. //    /**
  42. //     * 创建会员管理器
  43. //     */
  44. //    @Bean(name = "orderTransactionManager")
  45. //    public DataSourceTransactionManager orderTransactionManager(@Qualifier("orderDataSource") DataSource dataSource) {
  46. //        return new DataSourceTransactionManager(dataSource);
  47. //    }
  48.     /**
  49.      * 创建订单sqlSesion模版
  50.      */
  51.     @Bean(name = "orderSqlSessionTemplate")
  52.     public SqlSessionTemplate orderSqlSessionTemplate(
  53.             @Qualifier("orderSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  54.         return new SqlSessionTemplate(sqlSessionFactory);
  55.     }
  56. }
复制代码
如果多数据源利用事务报错的话
cted single matching bean but found 2: memberTransactionManager,orderTransactionManager
@Transactional(transactionManager = "memberTransactionManager")
明确指定利用那个事务管理器即可
6.启动加载设置
@EnableConfigurationProperties({OrderConfig.class, MemberConfig.class})

6.整合热部署

6.1 Spring Boot集成lombok让代码更简便

1.必要安装Idea整合 整合Lombok插件

2.搜刮Lombok插件即可

3.点击install然后,安装成功之后,点击 重启idea 即可。
整合lombok注意事项
原理:
现实上在开发写代码的时候 是不必要写get和set方法,但是在编译class文件中,帮你自动生成好这样get和set方法 放入到class文件中。
4.添加lombok依赖
  1. <dependency>
  2.         <groupId>org.projectlombok</groupId>
  3.         <artifactId>lombok</artifactId>
  4. </dependency>
复制代码
5.打印日记
//App 是类的名称,在那个类中用就写那个类
private static Logger log = Logger.getLogger(App.class);
直接在类上加上@Slf4j  就不用写上面这行代码
6.其他特性
注解形貌@Data自动生成getter/setter方法,toString()方法,equals()方法,hashCode()方法,不带参数的构造方法。@NonNull制止NullPointerException,确保非空对象引用。@CleanUp自动管理必要关闭的资源,无需手动在finally块中调用close()方法。@Setter自动生成setter方法。@Getter自动生成getter方法。@ToString自动生成toString()方法。@EqualsAndHashCode从对象的字段生成hashCode()和equals()方法的实现。@NoArgsConstructor自动生成无参构造方法。@RequiredArgsConstructor根据final或@NotNull修饰的属性自动生成构造方法。@AllArgsConstructor自动生成包含所有属性的构造方法。@Value用于注解不可变的final类。@Builder自动生成复杂对象的构造器API。@SneakyThrows捕获并隐藏检查型非常,需谨慎利用。@Synchronized将方法或代码块标记为同步的,保证线程安全。@Getter(lazy=true)耽误加载属性值,仅实用于Java 8及以上版本。@Log支持不同的日记框架,例如利用@Log4j注解引入Log4j日记对象。 6.2 Spring Boot整合热部署框架

1.什么是热部署
修改java类或页面大概静态文件,不必要手动重启
原理:类加载器
恰当于本地开发情况
2. Maven依赖
  1. <!--SpringBoot热部署配置 -->
  2. <dependency>
  3.     <groupId>org.springframework.boot</groupId>
  4.     <artifactId>spring-boot-devtools</artifactId>
  5.     <scope>runtime</scope>
  6.     <optional>true</optional>
  7. </dependency>
复制代码
3. Idea工具设置
新版本的IDEA在这里设置

4.结果演示
按住保存键,自动帮我实现重启项目

7.整合设置文件

1. 在springboot整合设置文件,分成两大类
application.properties
application.yml
大概是
Bootstrap.properties
Bootstrap.yml
相对于来说yml文件格式写法更加精简,减少设置文件的冗余性。
2. 加载次序:
bootstrap.yml 先加载 application.yml后加载
bootstrap.yml 用于应用程序上下文的引导阶段。
bootstrap.yml 由父Spring ApplicationContext加载。
3.区别:
bootstrap.yml 和 application.yml 都可以用来设置参数。
bootstrap.yml 用来程序引导时执行,应用于更加早期设置信息读取。可以理解成体系级别的一些参数设置,这些参数一般是不会变动的。一旦bootStrap.yml 被加载,则内容不会被覆盖。
application.yml 可以用来定义应用级别的, 应用程序特有设置信息,可以用来设置后续各个模块中需利用的公共参数等。
分布式设置中心:
Properties在线转换yml格式网址:https://www.toyaml.com/index.html
7.1利用@value注解和@ConfigurationProperties注解

@value注解
  1. @Value("${test.name}")//可以获取到配置文件中对应的值
  2. private String name;
复制代码
@ConfigurationProperties注解
Maven依赖
  1. <!--导入配置文件处理器,配置文件进行绑定就会有提示-->
  2. <dependency>
  3.     <groupId>org.springframework.boot</groupId>
  4.     <artifactId>spring-boot-configuration-processor</artifactId>
  5.     <optional>true</optional>
  6. </dependency>
复制代码
com.zhaoli.entity
  1. import org.springframework.boot.context.properties.ConfigurationProperties;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. @ConfigurationProperties(prefix = "test")
  5. public class TestUserEntity {
  6.     private String addres;
  7.     private String age;
  8.     private String name;
  9.     //省略了get set toString
  10. }
复制代码
设置文件
  1. test:
  2.   addres: www.zhaoli.com
  3.   age: 22
  4.   name: test
复制代码
com.zhaoli.service
  1. @Autowired
  2. private TestUserEntity userEntity;
  3. @RequestMapping("/getNameAndAgeAddres")
  4. public String getNameAndAgeAddres() {
  5.     return userEntity.toString();
  6. }
复制代码
7.2设置文件占位符

在SpringBoot的设置文件中,我们可以利用SpringBoot提供的的一些随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}表示获取10以内的随机数、${random.int[1024,65536]}
-${app.name:默认值} 来制定找不到属性时的默认值
7.3多情况设置和核心设置

resources.templates.application.yml 里面指定读取文件的名称
  1. spring:
  2.   profiles:
  3.     active: (dev或者test或者prd)
复制代码
application-dev.yml:开发情况
application-test.yml:测试情况
application-prd.yml:生产情况
核心设置
  1. server:
  2. ## 设定端口号
  3.   port: 8081
  4.   servlet:
  5. ## 设置 springboot 项目访问路径
  6.     context-path: /mayikt
  7. Springboot 默认的情况下整合tomcat容器
复制代码

8.日记管理

8.1利用logback记载日记

Springboot 已经默认帮你整合好了logback
日记输出文件在当前项目路径log文件夹下
1.Maven依赖
  1. <!-- 添加lombok依赖 -->
  2. <dependency>
  3.     <groupId>org.projectlombok</groupId>
  4.     <artifactId>lombok</artifactId>
  5. </dependency>
复制代码
2.在resources包下新建一个log包,在包下建 logback.xml 在里面进行设置(拷贝到里面即可)
  1. <configuration>
  2.     <!--本文主要输出日志为控制台日志,系统日志,sql日志,异常日志-->
  3.     <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, -->
  4.     <!--控制台-->
  5.     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  6.         <encoder>
  7.             <pattern>%d %p (%file:%line\)- %m%n</pattern>
  8.             <charset>UTF-8</charset>
  9.         </encoder>
  10.     </appender>
  11.     <!--系统info级别日志-->
  12.     <!--<File> 日志目录,没有会自动创建-->
  13.     <!--<rollingPolicy>日志策略,每天简历一个日志文件,或者当天日志文件超过64MB时-->
  14.     <!--encoder 日志编码及输出格式-->
  15.     <appender name="fileLog"
  16.               class="ch.qos.logback.core.rolling.RollingFileAppender">
  17.         <File>log/file/fileLog.log</File>
  18.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  19.             <fileNamePattern>log/file/fileLog.log.%d.%i</fileNamePattern>
  20.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  21.                 <!-- or whenever the file size reaches 64 MB -->
  22.                 <maxFileSize>64 MB</maxFileSize>
  23.             </timeBasedFileNamingAndTriggeringPolicy>
  24.         </rollingPolicy>
  25.         <encoder>
  26.             <pattern>
  27.                 %d %p (%file:%line\)- %m%n
  28.             </pattern>
  29.             <charset>UTF-8</charset>
  30.             <!-- 此处设置字符集 -->
  31.         </encoder>
  32.     </appender>
  33.     <!--sql日志-->
  34.     <appender name="sqlFile"
  35.               class="ch.qos.logback.core.rolling.RollingFileAppender">
  36.         <File>log/sql/sqlFile.log</File>
  37.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  38.             <fileNamePattern>log/sql/sqlFile.log.%d.%i</fileNamePattern>
  39.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  40.                 <!-- or whenever the file size reaches 64 MB -->
  41.                 <maxFileSize>64 MB</maxFileSize>
  42.             </timeBasedFileNamingAndTriggeringPolicy>
  43.         </rollingPolicy>
  44.         <!--对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。-->
  45.         <encoder>
  46.             <!--用来设置日志的输入格式-->
  47.             <pattern>
  48.                 %d %p (%file:%line\)- %m%n
  49.             </pattern>
  50.             <charset>UTF-8</charset>
  51.             <!-- 此处设置字符集 -->
  52.         </encoder>
  53.     </appender>
  54.     <!--异常日志-->
  55.     <appender name="errorFile"
  56.               class="ch.qos.logback.core.rolling.RollingFileAppender">
  57.         <File>log/error/errorFile.log</File>
  58.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  59.             <fileNamePattern>log/error/errorFile.%d.log.%i</fileNamePattern>
  60.             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  61.                 <!-- or whenever the file size reaches 64 MB -->
  62.                 <maxFileSize>64 MB</maxFileSize>
  63.             </timeBasedFileNamingAndTriggeringPolicy>
  64.         </rollingPolicy>
  65.         <!--对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。-->
  66.         <encoder>
  67.             <!--用来设置日志的输入格式-->
  68.             <pattern>
  69.                 %d %p (%file:%line\)- %m%n
  70.             </pattern>
  71.             <charset>UTF-8</charset>
  72.             <!-- 此处设置字符集 -->
  73.         </encoder>
  74.         <!--
  75.             日志都在这里 过滤出 error
  76.             使用 try {}catch (Exception e){} 的话异常无法写入日志,可以在catch里用logger.error()方法手动写入日志
  77.             -->
  78.         <filter class="ch.qos.logback.classic.filter.LevelFilter">
  79.             <level>ERROR</level>
  80.             <onMatch>ACCEPT</onMatch>
  81.             <onMismatch>DENY</onMismatch>
  82.         </filter>
  83.     </appender>
  84.     <!--  日志输出级别 -->
  85.     <!--All\DEBUG\INFO\WARN\ERROR\FATAL\OFF-->
  86.     <!--打印info级别日志,分别在控制台,fileLog,errorFile输出
  87.         异常日志在上面由过滤器过滤出ERROR日志打印
  88.     -->
  89.     <root level="INFO">
  90.         <appender-ref ref="fileLog" />
  91.         <appender-ref ref="console" />
  92.         <appender-ref ref="errorFile" />
  93.     </root>
  94.     <!--打印sql至sqlFile文件日志-->
  95.     <logger name="com.dolphin.mapper" level="DEBUG" additivity="false">
  96.         <appender-ref ref="console" />
  97.         <appender-ref ref="sqlFile" />
  98.     </logger>
  99. </configuration>
复制代码
3.在 resources 目次下的 application.yml 文件内新增 application 设置
  1. ###指定读取logback配置文件
  2. logging:
  3.   config: classpath:log/logback.xml
复制代码
4.测试案例
  1. @RestController
  2. @Slf4j
  3. public class MyIndexService {
  4.     /**
  5.      * 演示打印日志
  6.      */
  7.     @RequestMapping("/getNameAndAge")
  8.     public String getNameAndAge(String name,Integer age){
  9.         log.info("name:{},age:{}",name,age);
  10.         return name+","+age;
  11.         }
  12. }
复制代码

5.日记级别
ALL 最低品级的,用于打开所有日记记载。
TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日记级别,一般不会利用。
DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,重要用于开发过程中打印一些运行信息。
INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感爱好的大概重要的信息,这个可以用于生产情况中输出程序运行的一些重要信息,但是不能滥用,制止打印过多的日记。
WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示
ERROR 指出固然发生错误事件,但仍然不影响体系的继承运行。打印错误和非常信息,如果不想输出太多的日记,可以利用这个级别。
FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
OFF 最高品级的,用于关闭所有日记记载。
6.日记目次

8.2利用log4j记载日记

日记级别形貌输出源格式TRACE追踪,程序每推进一步可以写入一个TRACE级别的日记,通常用于非常详细的执行流程跟踪。CONSOLESimpleLayoutDEBUG调试,用于记载调试信息,通常是最低级别,帮助开发者理解程序运行情况。FILEHTMLLayoutINFO重要信息,用于记载应用程序运行的关键信息,是利用较为频繁的日记级别。PatternLayoutWARN告诫,记载可能必要注意的信息,这些信息固然不是错误,但可能会导致题目或必要注意的情况。ERROR错误,记载应用程序中的错误信息,这类信息表明应用程序中出现了题目。CONSOLEFATAL致命错误,记载非常严重的错误信息,通常指应用程序无法继承运行下去的情况。FILE机制:如果一条日记信息的级别大于即是设置文件的级别,则记载这条日记信息。输出源:日记可以输出到控制台(CONSOLE)或文件(FILE)。格式:日记输出的格式可以是简单的(SimpleLayout),HTML表格形式(HTMLLayout),大概自定义格式(PatternLayout)。 1.Maven依赖
  1. <!-- spring boot start -->
  2. <dependency>
  3.     <groupId>org.springframework.boot</groupId>
  4.     <artifactId>spring-boot-starter</artifactId>
  5.     <exclusions>
  6.         <!-- 排除自带的logback依赖 -->
  7.         <exclusion>
  8.             <groupId>org.springframework.boot</groupId>
  9.             <artifactId>spring-boot-starter-logging</artifactId>
  10.         </exclusion>
  11.     </exclusions>
  12. </dependency>
  13. <!-- springboot-log4j -->
  14. <dependency>
  15.     <groupId>org.springframework.boot</groupId>
  16.     <artifactId>spring-boot-starter-log4j</artifactId>
  17.     <version>1.3.8.RELEASE</version>
  18. </dependency>
复制代码
<!-- spring boot start -->
这段代码是利用Maven构建项目时,添加spring-boot-starter依赖的一种方式,而且通过exclusions排除了其中的logback依赖。
当你利用类似的设置时,spring-boot-starter依赖会被添加到项目中,而且排除了 spring-boot-starter-logging。这样,你可以根据自己的需求选择恰当的日记框架进行利用
这个排除logback依赖的操作可以用来替换其他的日记框架,大概利用自定义的日记框架进行日记的输出
2.新建log4j设置文件
在 resources 目次下新建文件log4j.properties
记得根据自己的项目修改里面的日记输出路径
  1. #log4j.rootLogger=CONSOLE,info,error,DEBUG
  2. log4j.rootLogger=DEBUG,error,CONSOLE,info
  3. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender     
  4. log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout     
  5. log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n   
  6.    
  7. log4j.logger.info=info
  8. log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
  9. log4j.appender.info.layout=org.apache.log4j.PatternLayout     
  10. log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
  11. log4j.appender.info.datePattern='.'yyyy-MM-dd
  12. log4j.appender.info.Threshold = info   
  13. log4j.appender.info.append=true
  14. log4j.appender.info.File=E:/code/log/info.log
  15. log4j.logger.error=error  
  16. log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
  17. log4j.appender.error.layout=org.apache.log4j.PatternLayout     
  18. log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
  19. log4j.appender.error.datePattern='.'yyyy-MM-dd
  20. log4j.appender.error.Threshold = error   
  21. log4j.appender.error.append=true
  22. log4j.appender.error.File=E:/code/log/error.log
  23. log4j.logger.DEBUG=DEBUG
  24. log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
  25. log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout     
  26. log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
  27. log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
  28. log4j.appender.DEBUG.Threshold = DEBUG   
  29. log4j.appender.DEBUG.append=true
  30. log4j.appender.DEBUG.File=E:/code/log/dubug.log
复制代码
log4j代码
private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
3.application
  1. # 指定log4j.properties配置文件路径
  2. logging:
  3.   config: classpath:log4j.properties
复制代码


8.3利用AOP统一处置惩罚Web请求日记

一般项目都是基于AOP实现 大概elk实现的
它可以在我们的方法的前后实现拦截 减少打印日记代码的冗余性的题目
1.Maven依赖
  1. <!-- springboot-aop -->       
  2. <dependency>
  3.                 <groupId>org.springframework.boot</groupId>
  4.                 <artifactId>spring-boot-starter-aop</artifactId>
  5. </dependency>
复制代码
2.AOP切面相关设置(直接拷贝即可)
  1. package com.zhaoli.aop;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.aspectj.lang.JoinPoint;
  4. import org.aspectj.lang.annotation.AfterReturning;
  5. import org.aspectj.lang.annotation.Aspect;
  6. import org.aspectj.lang.annotation.Before;
  7. import org.aspectj.lang.annotation.Pointcut;
  8. import org.springframework.stereotype.Component;
  9. import org.springframework.web.context.request.RequestContextHolder;
  10. import org.springframework.web.context.request.ServletRequestAttributes;
  11. import javax.servlet.http.HttpServletRequest;
  12. import java.util.Enumeration;
  13. @Aspect
  14. @Component
  15. @Slf4j
  16. public class WebLogAspect {
  17. //    private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
  18.     /**
  19.      * 切入点
  20.      * com.zhaoli.controller.* 拦截该包下的所有类
  21.      * com.zhaoli.controller.*.* 拦截该包下的所有类中的所有方法
  22.      * (..)所有的方法参数
  23.      */
  24.     @Pointcut("execution(public * com.zhaoli.controller.*.*(..))")
  25.     public void webLog() {
  26.     }
  27.     /**
  28.      * 前置通知 请求方法之前做拦截
  29.      */
  30.     @Before("webLog()")
  31.     public void doBefore(JoinPoint joinPoint) throws Throwable {
  32.         // 接收到请求,记录请求内容
  33.         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  34.         HttpServletRequest request = attributes.getRequest();
  35.         // 记录下请求内容
  36.         log.info("URL : " + request.getRequestURL().toString());
  37.         log.info("HTTP_METHOD : " + request.getMethod());
  38.         log.info("IP : " + request.getRemoteAddr());
  39.         Enumeration<String> enu = request.getParameterNames();
  40.         while (enu.hasMoreElements()) {
  41.             String name = (String) enu.nextElement();
  42.             log.info("name:{},value:{}", name, request.getParameter(name));
  43.         }
  44.     }
  45.     /**
  46.      * 目标方法请求之后 打印(响应)信息
  47.      */
  48.     @AfterReturning(returning = "ret", pointcut = "webLog()")
  49.     public void doAfterReturning(Object ret) throws Throwable {
  50.         // 处理完请求,返回内容
  51.         log.info("RESPONSE : " + ret);
  52.     }
  53. }
复制代码

9.其他内容

9.1利用@Scheduled创建定时任务

在Spring Boot的主类(App类即启动类)中加入@EnableScheduling注解,启用定时任务的设置
package com.zhaoli.task;
  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.scheduling.annotation.Scheduled;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. @Slf4j
  6. public class ScheduledTasks {
  7.     /**
  8.      * 每隔三秒执行到 taskService()
  9.      */
  10.     @Scheduled(fixedRate = 3000)
  11.     public void taskService(){
  12.         log.info("<<定时任务执行>>"+System.currentTimeMillis());
  13.     }
  14. }
复制代码

加粗部分一般利用@Scheduled(cron = "0/2 * * * * *") 写法:
https://www.bejson.com/othertools/cron/
可以在此网站中查找双引号中的利用规范

9.2利用@Async实现异步调用

在 Spring Boot 应用的主类(App类即启动类)上添加 @EnableAsync 注解,用于启用 Spring 的异步执行功能。
必要执行异步方法上加入 @Async
具体来说,@Async 注解用于告诉 Spring 框架将被注解的方法放入一个任务执行器(Task Executor)中执行,而不是利用调用线程进行同步执行。任务执行器负责管理执行异步任务的线程池大概其他执行策略。
异步应用场景
@Async现实就是多线程封装的
异步线程执行方法有可能会非常消耗cpu的资源,以是大的项目发起利用
Mq异步实现。
整合线程池
异步注解设置类
com.zhaoli.config.ThreadPoolConfig  (设置线程池,可直接拷贝)
  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.core.task.TaskExecutor;
  4. import org.springframework.scheduling.annotation.EnableAsync;
  5. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  6. import java.util.concurrent.ThreadPoolExecutor;
  7. @Configuration
  8. @EnableAsync
  9. public class ThreadPoolConfig {
  10.     /**
  11.      * 每秒需要多少个线程处理?
  12.      * tasks/(1/taskcost)
  13.      */
  14.     private int corePoolSize = 3;
  15.     /**
  16.      * 线程池维护线程的最大数量
  17.      * (max(tasks)- queueCapacity)/(1/taskcost)
  18.      */
  19.     private int maxPoolSize = 3;
  20.     /**
  21.      * 缓存队列
  22.      * (coreSizePool/taskcost)*responsetime
  23.      */
  24.     private int queueCapacity = 10;
  25.     /**
  26.      * 允许的空闲时间
  27.      * 默认为60
  28.      */
  29.     private int keepAlive = 100;
  30.     @Bean
  31.     public TaskExecutor taskExecutor() {
  32.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  33.         // 设置核心线程数
  34.         executor.setCorePoolSize(corePoolSize);
  35.         // 设置最大线程数
  36.         executor.setMaxPoolSize(maxPoolSize);
  37.         // 设置队列容量
  38.         executor.setQueueCapacity(queueCapacity);
  39.         // 设置允许的空闲时间(秒)
  40.         //executor.setKeepAliveSeconds(keepAlive);
  41.         // 设置默认线程名称
  42.         executor.setThreadNamePrefix("thread-");
  43.         // 设置拒绝策略rejection-policy:当pool已经达到max size的时候,如何处理新任务
  44.         // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
  45.         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
  46.         // 等待所有任务结束后再关闭线程池
  47.         executor.setWaitForTasksToCompleteOnShutdown(true);
  48.         return executor;
  49.     }
  50. }
复制代码
代码案例
@Async("taskExecutor") 是一个Spring框架中的注解,用于将方法标记为异步执行的方法。
  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.scheduling.annotation.Async;
  3. import org.springframework.stereotype.Component;
  4. @Slf4j
  5. @Component
  6. public class MemberServiceAsync {
  7.     @Async("taskExecutor") //指定线程池名称
  8.     public String smsAsync() {
  9.         log.info(">02<");
  10.         try {
  11.             log.info(">正在发送短信..<");
  12.             Thread.sleep(3000);
  13.         } catch (Exception e) {
  14.         }
  15.         log.info(">03<");
  16.         return "短信发送完成!";
  17.     }
  18. }
复制代码
注意失效题目
注意:如果异步注解写当前自己类,有可能aop会失效,无法拦截注解,最终导致异步注解失效,必要经过代理类调用接口;
以是必要将异步的代码单独抽取成一个类调用接口。
9.3全局捕获非常

@ExceptionHandler 表示拦截非常
@ControllerAdvice 是 controller 的一个辅助类,最常用的就是作为全局非常处置惩罚的切面类
@ControllerAdvice 可以指定扫描范围
@ControllerAdvice 约定了几种可行的返回值,如果是直接返回 model 类的话,必要利用 @ResponseBody 进行 json 转换

全局捕获非常设置类
  1. import org.springframework.web.bind.annotation.ControllerAdvice;
  2. import org.springframework.web.bind.annotation.ExceptionHandler;
  3. import org.springframework.web.bind.annotation.ResponseBody;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. @ControllerAdvice
  7. public class MayiktExceptionHandler {
  8.     /**
  9.      * 拦截运行异常出现的错误~~~
  10.      */
  11.     @ExceptionHandler(RuntimeException.class)
  12.     @ResponseBody
  13.     public Map<Object, Object> exceptionHandler() {
  14.         Map<Object, Object> map = new HashMap<>();
  15.         map.put("error", "500");
  16.         map.put("msg", "系统出现错误~");
  17.         return map;
  18.     }
  19. }
复制代码
没利用之前

给用户显示这个页面很不友爱
利用全局捕获非常设置类之后的页面

9.4发布打包

利用mvn package 打包
进入到项目地点目次 输入 mvn clean package 进行打包等待打包完成

显示这个即打包完成

在项目的目次中的 target 包下生成一个java-jar包

利用java –jar 包的全路径地址

如果报错没有主清单,在pom文件中新增
  1. <!-- 设置打包主清单属性 -->
  2. <build>
  3.     <plugins>
  4.         <plugin>
  5.             <groupId>org.springframework.boot</groupId>
  6.             <artifactId>spring-boot-maven-plugin</artifactId>
  7.             <executions>
  8.                 <execution>
  9.                     <goals>
  10.                         <goal>repackage</goal>
  11.                     </goals>
  12.                 </execution>
  13.             </executions>
  14.             <configuration>
  15.                 <!-- 启动类 -->
  16.                 <mainClass>com.zhaoli.App</mainClass>
  17.                 <excludes>
  18.                     <exclude>
  19.                         <groupId>junit</groupId>
  20.                         <artifactId>junit</artifactId>
  21.                     </exclude>
  22.                     <exclude>
  23.                         <groupId>org.springframework.boot</groupId>
  24.                         <artifactId>spring-boot-starter-test</artifactId>
  25.                     </exclude>
  26.                 </excludes>
  27.             </configuration>
  28.         </plugin>
  29.     </plugins>
  30. </build>
复制代码
重新打包再运行

启动


成功运行


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4