SpringBoot自学好几天 中途开始写笔记 @Conditional && 自动配置报告 20190119
@Conditinal派生注解
作用:必须是@Conditonal指定的条件成立,才给容器中添加组件(Bean),配置类里边的所有内容才生效。
Conditional 是由 SpringFramework 提供的一个注解,位于 org.springframework.context.annotation 包内,定义如下:
package org.springframework.context.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
Conditon接口:
package org.springframework.context.annotation;
import org.springframework.core.type.AnnotatedTypeMetadata;
@FunctionalInterface
public interface Condition {
boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
matches方法参数是ConditionContext ,他可以获取Spring的以下信息:
public interface ConditionContext {
BeanDefinitionRegistry getRegistry();
@Nullable
ConfigurableListableBeanFactory getBeanFactory();
Environment getEnvironment();
ResourceLoader getResourceLoader();
@Nullable
ClassLoader getClassLoader();
}
当一个 Bean 被 Conditional 注解修饰时,Spring容器会对所有 Condition 接口的 matches() 方法进行判断,只有当其中所有 Condition 接口的 matches()方法都为 ture 时,才会创建 Bean 。关于这个Spring的注解,我下载了一个视频31 尚硅谷 Spring注解驱动开发 这里先简单了解一下 等这个SpringBoot视频看完之后去看那个视频,对Spring的注解有进一步了解
SpringBoot扩展注解:
-
@ConditionalOnJava:当前系统的JAVA版本是否符合
-
@ConditionalOnBean:当容器里有指定Bean的条件下
-
@ConditionalOnMissingBean:当容器里没有指定Bean的情况下
-
@ConditionalOnExpression:基于SpEL表达式作为判断条件
-
@ConditionalOnClass:当类路径下有指定类的条件下
-
@ConditionalOnMissingClass:当类路径下没有指定类的条件下
-
@ConditionalOnSingleCandidate:当指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean
-
@ConditionalOnProperty:指定的属性是否有指定的值
-
@ConditionalOnResource:类路径是否有指定的值
-
@ConditionalOnWebApplication:当前项目是Web项目的条件下。
-
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
-
@ConditionalOnJndi:在JNDI存在的条件下差在指定的位置
自动配置类在一定条件下才能生效。我们要一个一个打开这些配置类,去里边看看条件是否符合,比如RabbitAutoConfiguration 我们需要点进去 看看是否他的条件都满足,满足的话他才能生效。
这样太麻烦了,我们可以在配置文件中配置一个属性:
debug=true
开启SpringBoot的debug模式 项目启动的时候控制台就会打印自动配置报告 这样我们就知道哪些自动配置类生效了:
自定义Conditional