spring boot入门

Posted ac_dao_di

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot入门相关的知识,希望对你有一定的参考价值。

一、相对于spring的优点

  • 便捷部署:支持嵌入式tomcat,无需依赖外部tomcat,可以本地启动,可以打成fat jar运行。
  • 端点监控:能够查看spring boot内部的运行时状态,包括bean的生效情况、应用健康情况等。
  • 外部化配置:支持从fat jar外application.yaml读取配置,无需修改内部代码和配置。支持对象配置注入和宽松绑定。
  • 注解驱动编程:无任何xml,基于spring 4.0条件注解实现bean注册,基于servlet 3.0实现动态servlet等。
  • 自动化配置:快速构建,避开依赖地狱,引进starter jar,配置yaml,即可开箱使用相关功能。

二、IDEA构建和本地运行

    
详细见:github本博客源码

2.1 新建spring boot demo

(1) 点击File->New->Project…

(2) pom添加starter web依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

自动引进相关jar:

传统spring需要引进多个jar:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.3.12</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.12</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.12.5</version>
  <scope>compile</scope>
</dependency>

(3) 编写HelloController

package com.jessin.springboot.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: jessinguo
 * @Date: 2021/10/24 1:16 PM
 */
@RestController
public class HelloController 
    @RequestMapping("/hello")
    public String hello() 
        return "hello world spring boot";
    

(4) 本地运行DemoApplication.main
到这一步,花的时间很少,不需要配置web.xml,不需要配置spring相关xml

(5) 命令行启动:

mvn spring-boot:run

(6) 打成jar

mvn -DskipTests package

可执行jar的结构为spring boot特有,且该jar不可被作为依赖引入。如果需要在外部tomcat运行,则需要打成war。 该jar结构与传统可执行jar有何不同?见jar

运行命令,通过-D指定catalina.base属性

java -jar -Dcatalina.base=target target/demo-0.0.1-SNAPSHOT.jar
jessin@JESSINGUO-MB0 META-INF % cat MANIFEST.MF 
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.jessin.springboot.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.6
Created-By: Maven Jar Plugin 3.2.0
#启动类是JarLauncher
Main-Class: org.springframework.boot.loader.JarLauncher

三、常见自定义配置

3.1 web mvc配置

先将application.properties改为application.yaml

(1)注意yaml的一些特性。默认不配置路径的话,servlet为懒加载,端口号为8080,路径为/。在application.yaml中添加以下参数,修改servlet为启动时加 载,且路径为/practice

spring: 
  mvc:
    servlet:
      path: /practice
      load-on-startup: 1

访问路径变为:
http://localhost:8080/practice/hello
(2) 自定义内嵌tomcat的端口,注意是内嵌tomcat

server:
  port: 9999

访问路径变为:
http://localhost:9999/practice/hello

3.2 logback配置

默认情况下,spring boot使用的是logback来记录日志
(1) 方式一:配置yaml

logging:
#filepathfile
  path: "/home/jessin/logs"
#10bps.log.2019-08-03.69.gz
  file.max-history: 10
  file.max-size: 1GB
  #file: "$catalina.base/logs/bps.log"
  pattern:
  #
    file: "%dISO8601 [%-5level] [%thread] |%L|%-40.40logger0|QTraceID[%Xqtraceid]|---%msg%n"
    console: "%dISO8601 [%-5level] [%thread] |%L|%-40.40logger0|QTraceID[%Xqtraceid]|---%msg%n"
  level:
    #logger
    root : info
    com.jessin.practice.spring.boot.controller.HelloController: debug

(2) 方式二:配置logback-spring.xml
上面只提供了一个file appender和一个console appender,如果需要多个appender,则需要自定义配置文件logback-spring.xml

注意不是logback.xml,如果配置logback.xml,spring boot启动会根据logback.xml重新初始化

<?xml version="1.0" encoding="UTF-8"?>
<!-- slf4j -->
<configuration debug="true" scan="true" scanPeriod="30 seconds">
   <!--  -->
   <property name="log.dir" value="$catalina.base/logs" />
   <property name="encoding" value="UTF-8" />
   <!--<property name="normal-pattern" value="%dMM-dd HH:mm:ss %-5level [%thread]
      %logger10.%M:%L %msg%n" /> -->
   <property name="normal-pattern"
      value="%dISO8601 [%-5level] [%thread] |%L|%-40.40logger0|QTraceID[%Xqtraceid]|---%msg%n" />
   <property name="console-pattern"
      value="%dyyyy-MM-dd HH:mm:ss|%.-5level|%-40.40logger0|%msg%n" />
   <property name="plain-pattern" value="%dMM-dd HH:mm:ss %msg%n" />
   <!-- log file default -->
   <appender name="default"
      class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>$log.dir/demo.log</File>
      <prudent>false</prudent>
      <Append>true</Append>
      <encoder>
         <pattern>$normal-pattern</pattern>
         <charset>$encoding</charset>
      </encoder>
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
         <fileNamePattern>$log.dir/demo.%dyyyy-MM-dd-HH.log
         </fileNamePattern>
      </rollingPolicy>
</appender>
   <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
         <pattern>$normal-pattern</pattern>
         <charset>$encoding</charset>
      </encoder>
</appender>
   <root level="INFO">
      <appender-ref ref="default" />
      <appender-ref ref="console" />
   </root>
</configuration>

3.3 mybatis配置

(1) 引进starter

        <!--
            1.0.0版本无法扫描classpath:*Mapper.xml
            1.3.0可以,注入的是String[],
            但是需要使用@MapperScan或者对单独的接口标注@Mapper
         -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

(2) yaml配置数据源

#变量自己替换掉
spring:
# 如果不配置的话,默认数据源为:com.zaxxer.hikari.HikariDataSource
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://$dbIp:3306/spring?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: $dbUser
    password: $dbUserPassword

(3) yaml配置mapper文件路径

mybatis:
  mapper-locations: "classpath:mappers/*Mapper.xml"

(4) 增加User model和UserMapper接口,设置Mapper xml

controller访问mapper

四、端点监控查看spring boot内部运行状态

4.1 引进starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

4.2 配置yaml

management:
  endpoints:
    web:
      #      base-path: /hello
      exposure:
        #15endpointendpointhealthinfo
        #http://localhost:9999/practice/actuator
        include: "*"
#  server:
#    port: 8888

4.3 相关http接口

查看自动化配置类的生效情况: http://localhost:9999/practice/actuator/conditions

查看注入的bean: http://localhost:9999/practice/actuator/beans

查看mapping: http://localhost:9999/practice/actuator/mappings

五、自动化配置原理

    spring boot启动时从类路径找到所有META-INF/spring.factories配置文件,加载key=org.springframework.boot.autoconfigure. EnableAutoConfiguration对应的自动化配置类,之后自动化配置类根据条件注解自动注入相应的bean,如果自定义配置了bean,则使用自定义的,否则使用默认的。
    添加注解有@ConditionalOnClass/@ConditionalOnBean/@ConditionalOnProperty,都是基于@conditional。
    其中spring boot已经在autoconfigure包中自定义好了spring支持的自定义配置类:如DispatcherServletAutoConfiguration自动配置DispatcherServlet。

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.5.6</version>
        </dependency>
        
        org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\\

六、传统spring项目改造为spring boot

  1. 将依赖替换为starter(web-starter/mybatis-starter),并解决依赖冲突,去除重复引入的jar,编译通过。

  2. 引进入口类和application.yaml,并替换掉xml。定义相关的异常日志报告。

  3. 去掉web.xml配置,qa环境去除内嵌tomcat,改用sci。

更多精彩样例,请关注公众号:

以上是关于spring boot入门的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot入门

spring boot + vue + element-ui全栈开发入门——开篇

Spring boot 基础web入门搭建

Spring Boot 如何极简入门?

spring boot 1.5.4 从入门到实践

spring boot入门之——2.0新特性以及模块化构建