最近看了《Spring boot 实战》这本书,但其中大部分内容都是讲如何使用spring boot和一些spring的常用配置,并没有过多涉及到其中的实现方式和原理。对于已经会使用,想要了解其中原理的同学并不推荐看这本书。下面将Spring boot中最关键的自动配置相关知识来梳理一下。
自定义配置
影响自动配置的方式有:1、显示配置进行覆盖;2、使用属性进行精细化配置
1、覆盖Spring boot自动配置
只需要编写一个显式配置,Spring Boot会发现你的配置,随后降低自动配置的优先级,以显示的配置为准。
是怎么允许被覆盖的?
大部分情况 SpringBoot的自动配置类的Bean方法上有注解@ConditionalOnMissingBean,意思是没有里配置指定的Bean时才会执行。因此当我们显示的配置对应的类时,就不会执行Spring本身的配置类。
其中基本上配置类都在org.springframework.boot.autoconfigure.*中, 如JDBC的配置
1 | package org.springframework.boot.autoconfigure.jdbc; |
JdbcTemplate()方法上添加了@Bean注解,在需要时可以配置出一个JdbcTemplate Bean。还有@ConditionalOnMissingBean注解,要求当前不存在JdbcOperations类型的Bean时才生效。Spring Boot的设计是先加载应用级配置,随后再考虑自动配置类。
2、通过属性文件外置配置
除了上述直接写配置类去覆盖自动配置,更多是通过配置文件去修改原先的配置。Spring Boot应用程序有多种设置途径,可以从多种属性源获得属性,包括:
- 命令行参数
- java:comp/env里的JNDI属性
- JVM系统属性
- 系统环境变量
- 随机生成的待random.*的属性,如${random.long}
- 应用程序以外的application.properties文件
- 应用程序内的application.properties文件
- 通过@PropertySource标注的属性源
- 默认属性
以上列表是按优先级排序的,优先级高的会覆盖优先级低的属性。
如application.properties文件可以放在以下四个位置:
- 外置,在相对于应用程序运行目录的/config子目录里
- 外置,在应用程序运行的目录里
- 内置,在config包内
- 内置,在Classpath根目录
一般来说,都是放在Classpath根目录下的resource文件夹下。其实是优先级最低的,会被上面的覆盖。
自动配置中使用的条件化注解
条件化注解 | 配置生效条件 |
---|---|
@ConditionOnBean | 配置了某个特定Bean |
@ConditionOnMissingBean | 没有配置特定Bean |
@ConditionOnClass | Classpath里有指定的类 |
@ConditionOnMissingClass | Classpath里缺少指定的类 |
@ConditionOnExpression | 给定的Spring Expression Language表达式计算为true |
@ConditionOnJava | Java的版本匹配特定值或一个范围值 |
@ConditionOnJndi | 参数给定的Jndi位置 |
@ConditionOnProperty | 指定的配置属性要有一个明确的值 |
@ConditionOnResource | Classpath里有指定 |
@ConditionOnWebApplication | Web应用程序 |
@ConditionOnNotWebApplication | 不是Web应用程序 |