Spring Boot

Constructor @Autowired @PostConstruct 执行顺序

Constructor >> @Autowired >> @PostConstruct

Spring Boot 自动配置原理

自动配置的源码

  • spring boot 关于自动配置的源码在 spring-boot-autoconfigure-version.jar内
  • 想知道spring boot做了哪些自动配置,以debug模式启动,就可以看到自动配置报告

运作原理

@SpringBootApplication
        ↓
@EnableAutoConfiguration
        ↓
@Import({AutoConfigurationImportSelector.class})
        ↓
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;
}
上面这个方法扫描具有META-INF/spring.factories文件的jar包,在spring.factories文件中声明了有哪些自动配置

核心注解

在上面的spring.factories文件里面AutoConfiguration文件里,一般都有下面的条件注解

  • @ConditionalOnBean: 当容器里有指定的Bean的条件下
  • @ConditionalOnClass: 当类路径下有指定的类的条件下
  • @ConditionalOnExpression: 基于SpEL表达式作为判断条件
  • @ConditionalOnJava: 基于JVM版本作为判断条件
  • @ConditionalOnJndi: 在JNDI存在的条件下查找指定的位置
  • @ConditionalOnMissingBean: 当容器里没有指定Bean的情况下
  • @ConditionalOnMissingClass: 当类路径下没有指定的类的条件下
  • @ConditionalOnNotWebApplication: 当项目不是Web项目的条件下
  • @ConditionalOnProperty: 指定的属性是否有指定的值
  • @ConditionalOnResource: 类路径是否有指定的值
  • @ConditionalOnSingleCandidate: 当指定的Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean
  • @ConditionalOnWebApplication: 当前项目是Web项目的条件下