AutoConfiguration(自动配置),是指springBoot项目启动时,将bean自动加载到IOC容器,其核心源码在【spring-boot-autoconfigure-**.jar】中。
自动配置的核心注解是@EnableAutoConfiguration,该注解又引用了两个注解@AutoConfigurationPackage、@Import(AutoConfigurationImportSelector.class)。前者是扫描项目中指定Package下定义的Bean加入到容器中,后者则是从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置类加载到容器中。具体加载逻辑可以见: SpringApplication启动原理
@Conditional表示仅当所有指定条件都匹配时,组件才有资格注册 。该@Conditional注释可以在以下任一方式使用:
@Conditional注解下有多个派生注解,如下图所示,其中@Conditional的参数OnBeanCondition.class是条件校验逻辑处理类:
注解名称 | 说明 |
@ConditionalOnProperty | 判断application.properties 或 application.yml 文件中的属性是否符合要求 |
@ConditionalOnBean | 判断应用上下文是否有某个bean |
@ConditionalOnMissingBean | 判断应用上下文是否没有某个bean |
@ConditionalOnClass | 判断某个类是否存在 classpath 中 |
@ConditionalOnExpression | 判断某个类是否不在 classpath 中 |
@ConditionalOnExpression | 多个配置属性一起判断 |
@ConditionalOnResource | 判断是否存在指定的资源文件。 |
@ConditionalOnJava | 判断是否符合指定的Java版本要求。 |
@ConditionalOnWebApplication | 判断是web 应用环境才加载bean |
@ConditionalOnNotWebApplication | 判断不是web 应用环境才加载bean |
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(CustomCondition.class)
public @interface CustomConditionalAnnotation {
String[] value() default {};
}
public class CustomCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Map<String, Object> annotationMap = metadata.getAnnotationAttributes(CustomConditionalAnnotation.class.getName());
String[] properties = (String[]) annotationMap.get("value");
for (String property : properties) {
if (StringUtils.isEmpty(context.getEnvironment().getProperty(property))) {
return false;
}
}
return true;
}
}
SpringBoot(二)原理剖析:AutoConfiguration原理
原文:https://www.cnblogs.com/ryjJava/p/14427242.html