SpringBoot基础

255 阅读6分钟

一、入门

1、编写基本的SpringBoot项目

1、创建maven工程

2、导入依赖

3、编写主程序

/**
 * 表明这是一个SpringBoot的主程序类
 */
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        // Spring应用启动起来
        SpringApplication.run(MainApplication.class, args);
    }
}

2、HelloWorld探究

1、POM文件

1、父项目
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>
​
它的父项目是spring-boot-dependecies:来真正管理springboot应用的所有依赖版本
有一个<propertes>定义了每一个依赖的版本

SpringBoot的版本仲裁中心

以后导入依赖默认是不需要写版本;dependecies中没引入的需要声明版本号

2、场景启动器
spring-boot-stater-web

spring-boot-stater:

SpringBoot场景启动器,声明了一些依赖导入,导入web模板正常运行需要依赖的组件

SpringBoot将所有的功能场景都抽取处理啊,做成一个个的starters(启动器),只需要在项目里引入这些相关场景的依赖。版本由父pom自动控制,一个功能对应一个场景启动器

2、主程序类

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        // Spring应用启动起来
        SpringApplication.run(MainApplication.class, args);
    }
}

@SpringBootApplication 标注的类是SpringBoot的主配置类,运行该类main方法来启动应用

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

1、 @SpringBootConfiguration:表示是SpringBoot的配置类,底层是@Configuration配置类=配置文件,配置类也是容器中的一个组件

2、 @EnableAutoConfiguration:开启自动配置功能。是一个组合注解

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

1、@AutoConfigurationPackage:自动配置包。

将主配置类的所在包及下面所有子包里面的所有组件扫描到Spring容器中

2、@Import({AutoConfigurationImportSelector.class}):给容器中导入一个组件;导入的组件由AutoConfigurationImportSelector.class(导入组件的选择器)指定。

AutoConfigurationImportSelector.class该类下的String[] selectImports()方法,将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。会给容器中导入非常多的自动配置类(xxxAutoConfiguration)

todo 截图自动配置类内容

AutoConfigurationImportSelector.getCandidateConfigurations()方法
-> SpringFactoriesLoader.loadFactoryNames():从"META-INF/spring.factories"路径下,spring-boot-autoconfiguration包下的META-INF/spring.factories文件里面定义的org.springframework.boot.autoconfigure.EnableAutoConfiguration字段定义的配置类,导入到容器中,自动配置类就生效

3、使用Spring Initializer快速创建项目

选中自己需要的模块,联网自动下载依赖

默认生成的内容:

  • 主程序已经生成好,无需手动编写Application类

  • resources文件夹。

    • static:保存所有静态资源:imags...
    • templates:保存所有模板页面,默认jar包方式,嵌入式Tomcat,默认不支持jsp页面,可以使用模板引擎(freemarker、thymeleaf)
    • application.properties:Spring Boot应用的配置文件。可修改一些默认设置,ex:server.port=XXX

二、配置文件

1、配置文件

SpringBoot使用一个全局的配置文件

  • application.properties
  • application.yml

作用:修改自动配置的默认值

YAML(YAML Ain't Markup Language):以数据为中心的配置

  • a:是一个标记语言
  • isn't:不是一个标记语言

标记语言:

yml配置案例

server:
  port: 8090

2、YAML语法

1、基本语法

K: [空格]V 表示一个键值对

以空格缩进来控制层级关系,左对齐的一列数据是同一层级

属性和值也是大小写敏感

2、值的写法

字面量:普通的值(数字、字符串、布尔)

  • k: v:字面量直接写、字符串默认不用加引号
  • "":不转义字符串中特殊字符
  • '':会转义特殊字符

对象:属性+值,键值对

  • k: v:下一行写对象的属性和值
friends:
   lastName:zhangsan
   age:20
  • 行内写法

    friends: {lastName:zhangsan, age: 18}
    

数组:

用-值表示数组中的一个元素

pets:
 - cat
 - dog
 - pig
 
pets: [cat,dog,pig]

3、获取配置文件值

1、将配置文件中配置的属性值映射到组件中@ConfigurationProperties(prefix = "xxx"):将本类中的所有属性和配置文件中值进行绑定

2、导入配置文件处理器

spring-boot-configuration-processor

单元测试

@SpringBootTest:使用SpringBoot的单元测试

@RunWith(SpringRunner.class) :驱动器

3、properties配置文件

1、语法

2、获取配置文件值

1、@ConfigurationProperties(prefix = "xxx");编码问题:FileEncodings:设置转换成ASCII

2、@Value:Spring的底层注解,为字段赋值。@Value(${xxx.yyy}/表达式/字面量)

获取map的值:

@ConfigurationProperties@Value
功能导入一个类的属性定义单个字段的导入
松散绑定last-name=lastName不支持
spEl不支持支持
复杂类型封装支持不支持

JavaBean和配置文件进行映射时->@ConfigurationProperties

单个字段获取配置值->@Value

三、Profile

用来支持多环境配置

1、多Profile文件

1、properties文件

主配置文件编写时,文件名可为application-{profile}.properties/yaml

2、yaml文件

---:同一个文件中划分不同的document

2、激活指定profile

  • Spring-profiles.active = xxx:配置文件中指明激活指定profile
  • 命令行:idea运行时指定。--spring.profiles.active = dev。优先级更高
  • 将项目打成jar包(打完的包在target目录下),java -jar xxx.jar --spring.profiles.active = dev
  • 虚拟机参数。VM options:-Dspring-profiles.active=dev

四、日志

1、日志框架

JUL、JCL、JBoss-logging、logback、log4j、log4j2、slf4j....

日志门面(抽象层)日志实现
JCL、SLF4j、jboss-loggingLog4j、JUL、Log4j2、LogBack

左边选一个门面,右边选一个实现

日志门店:slf4j;实现:log4j2

SpringBoot底层是Spring框架,Spring默认是JCL、SpringBoot选用的是slf4j和logback

2、SLF4J使用

导入slf4jjar报和logback的实现jar

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

image.png 每个日志的实现框架都有自己的配置文件,使用slf4j之后,配置文件还是做成日志实现框架的配置文件;

如何让系统中所有日志都统一到slf4j:有转换jar(A-over-B.jar)包可以导入

image.png

1、将系统中自带的日志框架排除出去

2、用中间包替换原有的日志框架

3、导入实际使用的slf4j的实现包

3、SpringBoot日志关系

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

SpringBoot中spring-boot-start-logging 底层导入了多种XX-over-slf4j的包,底层导入了日志抽象层slf4j,将其他日志转为了slf4j、使用logback实现记录日志

image.png

如果要引入其他框架,一定要把这个框架的默认日志依赖移除掉

image.png SpringBoot能自动适配所有的日志,底层使用的是slf4j-logback的方式记录日志,引入其他框架时需要将日志依赖排除掉。默认已经配置好日志了,可以直接使用。

        /**
         * 生成一个记录器。LoggerFactory记录器工厂,日志级别:由低到高
         */
        Logger logger = LoggerFactory.getLogger(getClass());
        // 跟踪信息
        logger.trace();
        // 调试信息,调试关键点的输出
        logger.debug();
        // SpringBoot默认使用的是info及以上的级别
        // 常用的信息输出
        logger.info();
        // 警告
        logger.warn();
        // 错误日志
        logger.error();

image.png

logging.file=XXX  // 不指定路径在当前项目下生成
logging.path=YYY

spring.log是不指定file时默认的日志文件名

日志输出格式

<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %t %-5level %logger{30}.%method - %msg%n" />