SpringBoot入门

一、初识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

1587368851345

在IDEA中导入刚刚下载的项目

1587369241546

使用IDEA创建项目

1587369414752

1590024001425

通过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 创建项目

1590038082746

1590038154566

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 创建启动类

创建位置:

1590038885747

@SpringBootApplication
public class SpringBootHelloWordApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootHelloWordApplication.class, args);
    }
}

3-4 创建Controller

1590039067949

@RestController
public class HelloController {
    @RequestMapping("/test")
    public String printHelloWord(){
        return "HelloWord";
    }
}

1590039214917

四、SpringBoot整合Web层技术

4-1 整合Servlet

方式一(通过注解扫描)

  1. 编写Servlet

    @WebServlet(name = "FirstServlet",urlPatterns = "/first")
    public class firstServlet extends HttpServlet {
        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response){
            System.out.println("Hello Word");
        }
    }
    
  2. 在启动类上添加注解

    @ServletComponentScan
    

方式二(通过配置类)

  1. 编写Servlet

    public class SecondServlet extends HttpServlet {
        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response){
            System.out.println("Second Servlet");
        }
    }
    
  2. 编写配置类

    @Configuration
    public class ServletConfig {
        @Bean //此注解表示以下方法在加载时运行
        public ServletRegistrationBean getServletRegistrationBean(){
            ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());
            bean.addUrlMappings("/second");
            return bean;
        }
    }
    

4-2 整合Filter

方式一(通过注解扫描)

  1. 编写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..");
        }
    }
    
  2. 编写启动类,加入以下注解即可

    @ServletComponentScan
    

方式二(通过配置类)

  1. 编写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..");
        }
    }
    
  2. 编写配置类

    @Configuration
    public class FilterConfig  {
        @Bean
        public FilterRegistrationBean getFilterRegistrationBean(){
            FilterRegistrationBean bean = new FilterRegistrationBean(new FirstFilter());
            bean.addUrlPatterns("/second");
            return bean;
        }
    }
    

4-3 整合Listener

方式一(注解扫描)

  1. 编写Listener

    @WebListener
    public class FirstListener implements ServletContextListener {
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
    
        }
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("Listener...Init...");
        }
    }
    
    
  2. 修改启动类(加入以下注解即可)

    @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文件

    1590547404650

        <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>

生成代码

1590588233147

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
    
  • 成功访问

    1590719600648

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: '*'          #指定开启端点访问
    
  • 访问成功

    1590720985450

十、日志管理

SpringBoot默认使用Logback组件作为日志管理。Logback是由log4j创始人设计的一个开源日志组件。

​ 在SpringBoot项目中我们不需要额外添加Logback的依赖,因为在spring-boot-starter或者spring-boot-starter-web中已经包含了Logback的依赖。

10-1 LogBack读取配置文件的步骤

  1. 在classpath下查找文件logback-test.xml
  2. 如果文件不存在,则查找logback.xml
  3. 如果两个文件都不存在,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超人不会飞aa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值