一 核心注解
只使用了一个@SpringBootApplication注解来启动应用, 这个注解有两个作用: 配置和启动引导,相当于3个注解组成:
@Configuration : 标明spring基于java的配置
@ComponentScan: 启动组件扫描,把相关@Component @Controller @Service @Repository等注解的Bean扫描到并实例化到上下文容器中
@EnableAutoConfiguration: 开始自动配置
说明:
1)@ComponentScan 可以通过basePackages 来定制化自动扫描的范围,如果不指定的,则默认会从@ComponentScan所在类的package进行扫描;所以,springboot的启动类最好放在root package下,这样就能扫描所有的bean
2) @EnableAutoConfiguration是一个复合注解, 也是借助@Import 将复合自动配置条件的bean加载到IOC容器中,具体会扫描classpatch下所有的spring.factories文件获取其中的自动配置类,根据@EnableConfigurationProperties 注解为配置类初始化属性
二 起步依赖
使用某个依赖,会把相关所有依赖都自动引入,且这些组合的依赖都是经过测试验证的。
当出现起步依赖传递过程有冲突,解决办法:覆盖掉要传递的依赖,如下:
<dependency>
<groupId>****</groupId>
<artifactId>****</artifactId>
//排除掉传递的依赖
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
排除掉传递依赖的版本,如果想引入其他版本2.4.3的依赖,可以直接在pom.xml中声明,如下:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>
三 自动配置
springboot把常用的配置类统一维护起来,通过@EnableAutoConfiguration注解来实现加载所有配置类。
自动配置原理参考: https://blog.csdn.net/u014745069/article/details/83820511
自动配置原理总结:
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容 器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。在自动配置类中使用@EnableConfigurationProperties把绑定到XxxxProperties类的bean导入到Spring容器中。
四 自定义配置
有两种方式实现自定义配置,一个是对原来自动配置的覆盖,一个是新写一个属性文件配置类作为一个新配置类来单独使用。
1. 覆盖springboot自动配置
自动配置类有注解@ConditionalOnMissingBean(JdbcOperations.class) 如果想覆盖这个配置类,可以增加一个应用配置类去配置JdbcOperations的Bean因为Spring Boot的设计是加载应用级配置,随后再考虑自动配置类, 自动配置类在加载的时候发现JdbcOperations已经存在Bean就不会在实例化了,从而实现了覆盖的目的。
注意并不是所有的方式都可以使用自定义配置类来覆盖自动配置类,也可以使用外置属性文件新生成一个配置类来单独使用。
2.属性文件外置配置
1)可以使用@ConfigurationProperties 为Bean 中属性初始化
从技术上来说,单独的@ConfigurationProperties注解不会生效,除非先向Spring配置类添加@EnableConfigurationProperties注解。 但通常springboot全部自动配置类
都已经加上了@EnableConfigurationProperties注解。
自定义配置可以使用@Bean结合使其生效,如下:(此方式推荐)
@Bean(name = "baseConfigDataSource")
@ConfigurationProperties(prefix = "datasource.baseConfig")
public DataSource getBaseConfigDataSource() {
return new DruidDataSource();
}
或者和@Component 注解一起使用,被扫描到后就会被注入到容器中,如下:
2)区分不同环境的配置可以使用Profile
springboot可以为不同环境配置不同的配置文件, 遵循applicatoin-{profile}.properties ,例如: dev环境的就是 application-dev.properties
激活profile有3种方式:
a 选择不同环境的时候,可以在命令行激活profile,例如:
java -jar *.jar --spring.profiles.active=dev
b 在appliction.properties中激活profile,例如:
spring.profiles.active=dev
c 也可以配置环境变量方式实现,例如:
SPRING_PROFILES_ACTIVE=dev
五 springboot中配置文件的优先级和加载顺序
1 加载application.properties配置文件顺序规则
SpringApplication会从以下路径加载所有的application.properties文件:
1)classpath:/(classpath根目录)
2)classpath:/config/(classpath下的config目录)
3)file:./(当前目录)
4)file:./config/(当前目录下的config文件夹)
加载配置文件优先级由上至下。
注意:
优先级是指扫描优先级路径的顺序,最后加载的配置会覆盖掉优先加载的相同配置。例如classpath:/config/和file:./config/都存在配置文件,那么加载过程会加载classpath:/config/路径下配置文件的所有属性,然后再加载file:./config/路径下配置文件的属性并替换已有的属性。此外,如果你在相同优先级位置同时有application.properties和application.yml,那么application.yml里面的属性就会覆盖application.properties里的属性。
如果你不想使用application.properties的格式命名配置文件,那么可以通过环境变量spring.config.name来设置文件名称,例如:
$ java -jar myproject.jar --spring.config.name=zhy-sys.properties此时,要加载的配置文件名为zhy-sys.properties。除了修改名称。
还可以使用 spring.config.location 来添加要加载的路径。例如我们以这个命令启动JVM:
$ java -jar myapp.jar --spring.config.location=classpath:/myconfig/,file:./myconfig/
那么加载application.properties文件的路径以及优先级会变为:
1)classpath:/
2)classpath:/config/
3)file:./
4)file:./config/
5)classpath:/myconfig/
6)file:./myconfig/
总结:
springboot的加载顺序,先classpath下 / /config/ 在加载当前目录的 ./ ./config/, 后加载的相同配置会覆盖掉优先加载的配置。
(由内而外加载application.properties,后加载的覆盖之前的加载配置,一般把git配置仓库中的配置最后加载,这样运维只需要改动此配置就能全局生效)
2 application.yml 和bootStrap.yml加载顺序
若application.yml 和bootStrap.yml 在同一目录下,则bootStrap.yml 的加载顺序要高于application.yml,即bootStrap.yml 会优先被加载。
原理:
bootstrap.yml 用于应用程序上下文的引导阶段。
bootstrap.yml 由父Spring ApplicationContext加载。
•bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
•application.yml 可以用来定义应用级别的,如果搭配 spring-cloud-config 使用 application.yml 里面定义的文件可以实现动态替换。
六 启动原理
SpringApplication.run(FundRepaymentBoot.class, args); 执行的过程如下: