SpringBoot2.x笔记——基础入门

概述

介绍

随着动态语言的流行(Ruby、Groovy、Scala、Node.js),Java 的开发运行格外的笨重:繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。
在上述环境下,SpringBoot应运而生。它使用"习惯优于配置"(项目中存在大量的配置, 此外还内置一个习惯性的配置,让你无须手动进行配置)的理念让你的项目快速运行起来。使用SpringBoot很容易创建一个独立运行(运行jar,内联Servlet容器)、准生产级别的基于Spring框架的项目,使用 SpringBoot你可以不用或者只需要很少的 Spring配置。

核心功能

  1. 独立运行的Spring项目
    SpringBoot可以以jar包的形式独立运行,运行一个SpringBoot项目只需通过java -jar xx.jar来运行。
  2. 内嵌Servlet容器
    SpringBoot可选择内嵌Tomcat、Jetty或者Undertow,这样我们无须以war包形式部署项目。
  3. 提供starter简化Maven配置
    Spring提供了一系列的starter pom来简化Maven的依赖加载。
  4. 自动配置Spring
    SpringBoot会根据在类路径中的jar包、类,为jar包里的类自动配置Bean,这样会极大地减少我们要使用的配置,当然,SpringBoot只是考虑了大多数的开发场景,并不是所有的场景,若在实际开发中我们需要自动配置Bean,而SpringBoot 没有提供支持,则可以自定义自动配置。
  5. 准生产的应用监控
    SpringBoot提供基于http、ssh、telnet对运行时的项目进行监控。
  6. 无代码生成和xml 配罝
    SpringBoot的神奇不是借助于代码生成来实现的。而是通过条件注解来实现的。

快速搭建

单模块搭建

  1. 点击file->new->project,选择Spring Initializr然后点击下一步,如果失败,则选择Custom,填入阿里初始化地址 https://start.aliyun.com/。
    SpringBoot2.x笔记——基础入门_第1张图片

  2. 填写项目信息,GroupId一般分为多个段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。ArtifactId表示你这个项目的名称,然后点击next。
    SpringBoot2.x笔记——基础入门_第2张图片

  3. 选择项目的依赖,也可以后续在pom文件中添加(这里我选择了spring web 和 mybatis的依赖),点击下一步,选择项目位置,点击完成,我们的项目就搭建好了。
    SpringBoot2.x笔记——基础入门_第3张图片

多模块搭建

  1. 父模块搭建和上面步骤一样,不过在选择项目类型为Maven Pom
    SpringBoot2.x笔记——基础入门_第4张图片

  2. 点击父模块右击Module,创建子模块
    SpringBoot2.x笔记——基础入门_第5张图片

  3. 模块配置
    –父模块:
    SpringBoot2.x笔记——基础入门_第6张图片

–子模块:
SpringBoot2.x笔记——基础入门_第7张图片

基础使用

入口类

SpringBoot通常有一个名为xxApplication的入口类,入口类里有一个main方法,这个main 方法其实就是一个标准的Java 应用的入口方法。在main方法中使用 SpringApplication.run(BasisApplication.class, args),启动SpringBoot应用项目。
@SpringBootApplication是SpringBoot的核心注解,它是一个组合注解,源码如下:
SpringBoot2.x笔记——基础入门_第8张图片
如果不使用@SpringBootApplication,则可以在入口类上面直接使用@EnableAutoConfiguration、@Configuration、@ComponentScan

  • @EnableAutoConfiguration:让 SpringBoot根据类路径中的jar包依赖为当前项目进 行自动配置。
  • @Configuration:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。
  • @ComponentScan:根据定义的扫描路径,把符合扫描规则的类装配到spring容器中。

关闭特定的自动配置

根据@SpringBootApplication源码我们可知,关闭特定的自动配置可以使用@SpringBootApplication的exclude参数。

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

定制Banner

  1. 修改Banner
    在src/main/resource下新建一个banner.txt,通过网站生成字符并复制到文件中。
    SpringBoot2.x笔记——基础入门_第9张图片
  2. 关闭banner
  • 方法1:修改main入口类
public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(BasisApplication.class);
        springApplication.setBannerMode(Banner.Mode.OFF);
        springApplication.run(args);
    }
  • 方法2:Edit Configurations,修改配置
    SpringBoot2.x笔记——基础入门_第10张图片

项目配置

yaml配置

SpringBoot使用一个全局的配置文件application.properties或application.yml,放置在 sre/main/resources目录或者类路径的/config下。
SpringBoot不仅支持常规的properties配置文件,还支持yaml语言的配置文件。yaml是以数据为中心的语言,在配罝数据的时候具有面向对象的特征。SpringBoot的全局配置文件的作用是对一些默认配置的配置值进行修改。简单配置如下:

server:
  port: 8080
  servlet:
    context-path: /basis

命令行参数配置

SpringBoot可以是基于jar包运行的,打成jar包的程序可以直接通过下面命令运行(修改端口为9090):

java -jar xx.jar --server.port=9090

@PropertySource和@Value

组合使用,可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。

#persion配置类
persion.name=张三
persion.age=12

@Component
@PropertySource(value = "classpath:config/persion.properties", ignoreResourceNotFound = true, encoding = "utf-8")
public class PersonPropertis {

    @Value("${persion.name}")
    private String name;
    @Value("${persion.age}")
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "PersonPropertis{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

SpringBoot2.x笔记——基础入门_第11张图片

@ConfigurationProperties

一般和@PropertySource组合使用,否则读取默认配置文件(application.properties),可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。

#student配置类
student.name=张三
student.age=12

@Component
@PropertySource(value = "classpath:student.properties", ignoreResourceNotFound = true, encoding = "utf-8")
@ConfigurationProperties(prefix = "student")
public class StudentPropertis {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "StudentPropertis{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
//用法2(推荐)
@Configuration
@PropertySource(value = "classpath:config/student.properties", ignoreResourceNotFound = true, encoding = "utf-8")
public class StudentConfig {

    @Bean
    @ConfigurationProperties(prefix = "student")
    public StudentPropertis studentPropertis(){
        return new StudentPropertis();
    }
}

SpringBoot2.x笔记——基础入门_第12张图片

日志配置

默认情况下,SpringBoot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序时,可以看到很多INFO级别的日志了。
SpringBoot2.x笔记——基础入门_第13张图片
默认日志输出内容元素具体如下:

  • 时间日期:精确到毫秒
  • 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
  • 进程ID
  • 分隔符:—前面几个内容和实际日志的分割
  • 线程名:方括号括起来([ main])
  • Logger名:通常使用源代码的类名
  • 日志内容

yaml方式配置

# 日志配置
logging:
  # 日志级别
  level:
    root: info
  file:
    # 日志文件名格式
    name: ./logs/${spring.application.name}.log
  pattern:
    # 一般使用默认格式就行,无需配置
    # 日志记录格式[组件名称] [时间戳] [日志级别] [类名.方法名] [消息文本]
    file: "%d{yyyy-MM-dd HH:mm:ss.SSS} %p %C.%M %m %n"
  logback:
    rollingpolicy:
      # 根据文件大小归档,超过2KB自动归档,次日启动服务时也会自动归档
      file-name-pattern: ./logs/%d{yyyyMMdd}/${spring.application.name}.%d{yyyy-MM-dd}_%i.log.gz
      # 最大日志文件大小(默认为10MB,这里为了测试归档,暂时设置为2KB,具体视情况修改)
      max-file-size: 2KB
      # 要保留的日志备份的总大小(默认为0B)
      total-size-cap: 1GB
      # 保存存档日志文件的最大天数(默认为7)
      max-history: 20

自定义配置

# application-dev.yml日志配置
log:
  # 日志级别
  level:
    root: info
    com:
      fengfan:
        basis: debug
  file:
    path: ./log
    maxHistory: 20
    maxFileSize: 2KB
    totalSizeCap: 1GB
    pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} %p %C.%M %m %n"


<configuration debug="false">
    
    <springProperty scope="context" name="LOG_HOME" source="log.file.path" defaultValue="./log"/>
    <springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="basis"/>
    
    <springProperty scope="context" name="ROOT_LEVEL" source="log.level.root" defaultValue="INFO"/>
    <springProperty scope="context" name="BASIS_LEVEL" source="log.level.com.fengfan.basis" defaultValue="DEBUG"/>
    <springProperty scope="context" name="PATTERN" source="log.file.pattern" defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} - [%X{traceID}] - [%thread] %-5level %logger{50}.%M\(%line\) - %msg%n"/>
    
    <springProperty scope="context" name="MAXHISTORY" source="log.file.maxHistory" defaultValue="30"/>
    
    <springProperty scope="context" name="MAXFILESIZE" source="log.file.maxFileSize" defaultValue="100MB"/>
    
    <springProperty scope="context" name="TOTALSIZECAP" source="log.file.totalSizeCap" defaultValue="10GB"/>

    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            
            <pattern>${PATTERN}pattern>
        encoder>
    appender>
    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            
            <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/${APP_NAME}.%d{yyyy-MM-dd}_%i.log.gzfileNamePattern>
            
            <maxHistory>${MAXHISTORY}maxHistory>
            <maxFileSize>${MAXFILESIZE}maxFileSize>
            <totalSizeCap>${TOTALSIZECAP}totalSizeCap>
        rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            
            <pattern>${PATTERN}pattern>
        encoder>
    appender>

    
    <logger name="com.apache.ibatis"/>
    <logger name="java.sql.Connection"/>
    <logger name="java.sql.Statement"/>
    <logger name="java.sql.PreparedStatement"/>

    
    <springProfile name="dev">
        <root level="${ROOT_LEVEL}">
            <appender-ref ref="FILE"/>
            <appender-ref ref="STDOUT"/>
        root>
        <logger name="com.fengfan.basis" level="${CN_LEVEL}"/>
    springProfile>

    








    
    <root level="${ROOT_LEVEL}">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    root>
    <logger name="com.fengfan.basis" level="${CN_LEVEL}"/>

configuration>

SpringBoot2.x笔记——基础入门_第14张图片
具体使用请参见logback官网https://logback.qos.ch/

profile配置

Spring对不同环境,提供不同配置功能的支持,可以通过激活、指定参数等方式快速的切换环境,环境就是平常的开发环境、测试环境、生产环境等。

spring:
  application:
    name: basis
  profiles:
    active: dev

xml使用配置

SpringBoot提倡零配置,即无xml配置,但是在实际项目中,可能有一些特殊要求你必须使用xml配置,这时我们可以通过Spring提供的@ImportResource来加载xml配置,如下:

@ImportResource("classpath:config/spring.xml")

打包部署

  1. 在web子模块中添加打包插件
    SpringBoot2.x笔记——基础入门_第15张图片
  2. 执行打包命令需要忽略执行test,不然就会报错。使用命令mvn package -Dmaven.test.skip=true 或者 mvn package -DskipTests=true来忽略。

你可能感兴趣的:(SpringBoot,spring,boot,java)