spring boot自动配置

Posted tianjin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot自动配置相关的知识,希望对你有一定的参考价值。

spring boot多环境配置及文件位置

spring boot 配置文件(application.yaml / xml)优先级:官方文档

file:./config/ - 优先级最高(项目根路径下的config

file:./ - 优先级第二 -(项目根路径下)

classpath:/config/ - 优先级第三(项目resources/config下)

classpath:/ - 优先级第四(项目resources根目录)

spring boot切换环境配置

  • 使用spring.profiles.active = ??? 切换配置环境,如下 |

 spring
profiles:
  active: 配置文件名
spring.profiles.active=配置文件名
  • 但是配置文件太多文件目录可能有点乱,那么yaml的优势就来了,如果你有多个配置,可以放在一个yaml中

server: #默认
port: 8080
?
server:
port: 8089
spring: #one配置
profiles: one
 
server:
port:9090
spring: #two配置
profiles: two
 
spring
profiles:
  active: 配置文件名

如果我们要选择要用的配置,可以使用spring.profiles.active=配置名在一个yaml文件中切换(没有profiles属性的是默认选择)。

 

spring boot自动配置

spring boot的@SpringBootApplication下的源码如下

@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}
)}
)
````````````````````````````````下面还有很多

@EnableAutoConfiguration 和自动配置相关,打开源码

?
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
   String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
?
   Class<?>[] exclude() default {};
?
   String[] excludeName() default {};
}
?

在@EnableAutoConfiguration下存在@Import({AutoConfigurationImportSelector.class}) ,这个就是选择导入,从这里进入找到

getAutoConfigurationEntry(省略了很多),这个实体从

List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);这个里面获得实体,然后或偶去配置,获取配置从

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
       List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
       Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
       return configurations;
  }

这里获取配置this.getBeanClassLoader() 标注了注解类,所以能够找到,在上面的private ClassLoader beanClassLoader;这里,

然后从这里在这里返回已经标志了的类,如下

  protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
       List<String> configurations =     SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
       Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
       return configurations;
  }
从this.getSpringFactoriesLoaderFactoryClass(), 这里返回
protected ClassLoader getBeanClassLoader() {
       return this.beanClassLoader;
  }

spring boot读取的资源自动装配,最终指向配置文件FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories",源码如下

public final class SpringFactoriesLoader {
   public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
   private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
   private static final Map<ClassLoader, MultiValueMap<String, String>> cache = new ConcurrentReferenceHashMap();
?
   private SpringFactoriesLoader() {
  }

技术图片

META-INF/spring.factories这个文件特别牛批!!!!!!我们的配置和它密切相关,无论哪一个,都带有注释@Configration 被配置!!!!!spring帮我们配置了很多东西,我们只需要直接用,spring boot牛皮!!!!!!!!!!!!!!!!

spring的底层注解@CondionalOnXXXX,根据不同的条件,判断当前配置或者类是否生效!!!!!!!!!

xxxAutoConfiguration 《---- xxxProperties 《----- 配置文件

































































以上是关于spring boot自动配置的主要内容,如果未能解决你的问题,请参考以下文章

学记:为spring boot写一个自动配置

Spring Boot自动配置源码解析(基于Spring Boot 2.0.2.RELEASE)

Spring boot:thymeleaf 没有正确渲染片段

在 Spring Boot 应用程序中禁用 Spring JMS 自动配置

Spring boot h2自动配置不起作用

spring boot 自动配置原理