首页 > 编程语言 > 详细

Springboot基础回顾

时间:2021-07-01 00:19:33      阅读:40      评论:0      收藏:0      [点我收藏+]

Springboot的使命就是解决Spring的繁琐配置,使用JavaConfig的方式取代XML配置。

Springboot 特性

  1. 约定优于配置

    使用一些约定来避免配置,如数据库表名和实体类的映射。如果不满足约定,就需要手动指定。

  2. starter

    解决某一场景下需要多个依赖的问题。starter本身可能不包含代码,但是他会在pom.xml中引入当前场景所需要的依赖。用户在使用时就不需要自己一个个引入某个场景下(如web)所需要的依赖,只需要引入starter即可。

  3. 自动配置

    根据引入的依赖,自动的配置一些对象可供直接使用。

  4. 简化部署

    内置Tomcat、Jetty等服务器,简化了部署流程,可以直接以Jar包方式运行。

热部署

在IDEA中使用热部署需要完成以下配置:

  1. 引入热部署的依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    
  2. 开启IDEA的自动编译

    技术分享图片

  3. 允许IDEA在程序运行期间自动编译

    在IDEA的任意界面按下Ctrl+Shift+Alt+/打开Maintenance窗口,点击Registry

    技术分享图片

热部署原理

devtools会监控classpath的资源变化,如果加入了新的资源就会触发重启。所以在我们打开IDEA的自动编译功能之后,每一次对代码编辑之后都会自动编译并加入到classpath中,随后触发devtools的重启。

那么为什么devtools的重启这么快呢。原因是devtools使用了双ClassLoader的机制,第三方Jar包等不会改变的class文件就使用基础类加载器加载,业务代码等经常修改的代码生成的class文件就使用devtools自己的类加载器加载。这样一来,就不需要每次都重复加载大量的第三方Jar包中的class文件,速度自然比冷启动快不少。

所以即便我们不对IDEA进行设置,也可以用手动编译的方式触发devtools的热启动,同样不需要重新加载第三方的class,同样很快,而且可控。

排除资源

devtools默认会将META-INF/maven/**,META-INF/resources/**,resources/**,static/**,public/**,templates/**,**/*Test.class,**/*Tests.class,git.properties,META-INF/build-info.properties这些目录排除在外。也就是说当这些目录中的文件发生改变时,不会触发重启,但是会触发重新加载资源。如果想要自定义排除的资源,可以在配置文件中加入spring.devtools.restart.exclude=参数来实现。

全局配置文件

优先级

Springboot使用application.properties或者application.yaml文件作为全局配置文件。全局配置文件按照优先级由高到低可以出现在以下几个位置:

  1. file: ./config/
  2. file: ./
  3. classpath: ./config/
  4. classpath: ./

优先级更高的配置文件会被优先加载,并且同名属性不会被覆盖,也就是说优先级高的配置文件中的属性优先生效。如果不同位置的配置文件中有不同的属性,就都会被Springboot读取。具体的文件位置可以按照序号在下面这张图中找到。

技术分享图片

如果在同一个位置同时出现了.properties和.yaml文件,那么谁的优先级更高?

当Springboot>=2.4.0时,.yaml>.properties。当Springboot<2.4.0时,.properties>.yaml。

并且如果想要在Springboot 2.4.0之后的版本使用 .properties>.yaml的优先级逻辑的话,可以添加如下配置:

spring.config.use-legacy-processing=true

但是,请不要同时使用.properties和.yaml。

配置文件自定义属性

@ConfigurationProperties

在配置文件中除了可以对框架提供的配置项进行配置之外,还可以对自定义的配置属性实现类进行注入。主要通过@ConfigurationProperties注解实现。

比如说我们现在有下面这样一个PersonProperties类,要对他的每个属性实现在配置文件中配置。

//此处省略了getter/setter方法,setter方法是必须的!!
public class PersonProperties {
    private String name;
    private Integer age;
    private String[] family;
    private Map<String, String> others;
}

那么我们需要使用@ConfigurationProperties注解来实现属性的注入,在PersonProperties上加上注解。

@Component
@ConfigurationProperties(prefix = "person")

此时IDEA会提醒你没有找到Springboot 的配置注解处理器,说人话就是IDEA不会在配置文件中提供代码提示,那么要怎么解决这个问题呢,只需要在pom.xml中添加如下依赖即可。如果是码字达人也可以略过,并不影响配置信息的注入。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

技术分享图片

在配置文件中加上如下配置:

person.name=supermaskv
person.age=23
person.family=mother,father
person.others.sex=male
person.others.sexual-orientation=female

再写一个Controller简单验证一下:

@RestController
public class DemoController {
    @Autowired
    private PersonProperties personProperties;

    @RequestMapping("/person")
    public PersonProperties person() {
        return personProperties;
    }
}

技术分享图片

YAML文件同理,这里就不多赘述了。

除了可以在类上使用@ConfigurationProperties,还可以在@Bean标记的方法上使用。例如:

@Configuration
public class MyConfiguration {
    @Bean
    @ConfigurationProperties(prefix = "person")
    public PersonProperties personProperties() {
        return new PersonProperties();
    }
}

再次访问我们之前的接口/person可以发现同样是生效了的。这个方式特别适合将参数注入给第三方的类,比如Datasource之类的。

@Value

@ConfigurationProperties比较适合批量注入,如果我们只有个别属性需要注入,比如说boolean类型的标志变量,就可以简单的使用@Value来注入属性,下面来看个例子。

@RestController
public class DemoController {
    //冒号后表示如果没有在配置文件中找到对应配置使用的默认值
    @Value("${demo.controller.flag:false}")
    private Boolean flag;

    @Autowired
    private PersonProperties personProperties;

    @RequestMapping("/person")
    public PersonProperties person() {
        return flag ? personProperties : null;
    }
}

访问一下这个接口就会发现默认的返回的是null,在配置文件中加入下面的配置之后:

demo.controller.flag=true

访问/person接口就又正常显示PersonProperties的属性了。

@Value和@ConfigurationProperties

特性 @ConfigurationProperties @Value
宽松绑定 yes limited
元数据支持 yes no
SpEL no yes

解释一下这个宽松绑定,意思就是Springboot可以自行在几种命名风格之间转换,如firstName可以和first-name、first_name、FIRST_NAME转换。@Value推荐使用first-name这种形式。如果在@Value中使用firstName这种形式,那么就会忽略first-name和FIRST_NAME。下面是官方文档:

技术分享图片

日志

Springboot 是如何做到统一日志框架的

不同的框架会使用不同的日志框架,如Spring Framework默认使用的是commons-logging,而hibernate默认使用的是jboss-logging,但是我们又要使用slf4j+logback作为日志框架,Springboot是如何做到的呢?

其实Springboot使用的是slf4j提供的方案,一方面先将第三方框架使用的日志依赖排除,然后引入slf4j提供的适配器。例如,将Spring Framework引入的commons-logging依赖排除,再引入jcl-over-slf4j。这样做可以避免Spring Framework因找不到日志实现而报错,同时又能在保持Spring Framework原有代码不变的情况下将日志框架替换为slf4j。

Springboot 日志的常用配置

# 将全局日志等级更改为trace级别
logging.level.root=trace
# 控制台输出的日志格式
logging.pattern.console=
# 文件输出的日志格式
logging.pattern.file=
# 输出的日志名
logging.file.name=
# 输出的日志目录
logging.file.path=

Springboot基础回顾

原文:https://www.cnblogs.com/supermaskv/p/14956760.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!