Springboot的使命就是解决Spring的繁琐配置,使用JavaConfig的方式取代XML配置。
约定优于配置
使用一些约定来避免配置,如数据库表名和实体类的映射。如果不满足约定,就需要手动指定。
starter
解决某一场景下需要多个依赖的问题。starter本身可能不包含代码,但是他会在pom.xml中引入当前场景所需要的依赖。用户在使用时就不需要自己一个个引入某个场景下(如web)所需要的依赖,只需要引入starter即可。
自动配置
根据引入的依赖,自动的配置一些对象可供直接使用。
简化部署
内置Tomcat、Jetty等服务器,简化了部署流程,可以直接以Jar包方式运行。
在IDEA中使用热部署需要完成以下配置:
引入热部署的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
开启IDEA的自动编译
允许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文件作为全局配置文件。全局配置文件按照优先级由高到低可以出现在以下几个位置:
优先级更高的配置文件会被优先加载,并且同名属性不会被覆盖,也就是说优先级高的配置文件中的属性优先生效。如果不同位置的配置文件中有不同的属性,就都会被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注解实现。
比如说我们现在有下面这样一个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之类的。
@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的属性了。
特性 | @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。下面是官方文档:
不同的框架会使用不同的日志框架,如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。
# 将全局日志等级更改为trace级别
logging.level.root=trace
# 控制台输出的日志格式
logging.pattern.console=
# 文件输出的日志格式
logging.pattern.file=
# 输出的日志名
logging.file.name=
# 输出的日志目录
logging.file.path=
原文:https://www.cnblogs.com/supermaskv/p/14956760.html