SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @ConfigurationProperties 等几个注解来进行自动配置完成的。
@EnableConfigurationProperties :给自动配置提供具体的配置参数,只需要写在 application.properties 中,就可以通过映射写入配置类的 POJO 属性中。
@Conditional :条件注解,通过判断类路径下有没有相应配置的 jar 包来确定是否加载和自动配置这个类。
通过@Import导入了AutoConfigurationImportSelector.class ,找到selectImports()方法,他调用了getCandidateConfigurations()方法,在这里,这个方法又调用了Spring Core包中的loadFactoryNames()方法。这个方法的作用是,会查询META-INF/spring.factories文件中包含的JAR文件,然后将 autoconfig 包里的已经写好的自动配置加载进来。
会remove exclude的configuration.
例如MybatisPlusAutoConfiguration
具体几个@Conditon*注解的含义
@ConditionalOnBean : 仅仅在当前上下文中存在某个对象时,才会实例化一个Bean
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnClass : 某个class位于类路径上,才会实例化一个Bean),该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnExpression :当表达式为true的时候,才会实例化一个Bean
@ConditionalOnMissingBean :仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean,该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean,可以给该注解传入参数例如
@ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行
@ConditionalOnMissingClass :某个class类路径上不存在的时候,才会实例化一个Bean
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效