ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
`@Conditional`是 Spring 的原生注解,SpringBoot 将它进行扩展,该注解用于做条件判断,即如果满足条件则怎么样,不满足条件则怎么样。 (1)HttpEncodingAutoConfiguration的部分源码。 ```java @Configuration( proxyBeanMethods = false ) @EnableConfigurationProperties({ServerProperties.class}) // 它用于判断当前的项目是否为Web项目,定义该注解的底层是Spring的@Conditional @ConditionalOnWebApplication( type = Type.SERVLET ) // 用于判断CharacterEncodingFilter是否在当前项目中存在,如果存在 // 则将它导入到当前类中,定义该注解的底层是Spring的@Conditional @ConditionalOnClass({CharacterEncodingFilter.class}) // 用于判断是否存在prefix的配置,如果存在则让其生效,它的底层也是Spring的@Conditional @ConditionalOnProperty( prefix = "server.servlet.encoding", value = {"enabled"}, matchIfMissing = true ) public class HttpEncodingAutoConfiguration { ... } ``` (2)我们看一下`@ConditionalOnClass`的部分源码。 ```java @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented // 利用到了OnClassCondition类,我们下面看一下这个类的源码 @Conditional({OnClassCondition.class}) public @interface ConditionalOnClass { Class<?>[] value() default {}; String[] name() default {}; } ``` (3)看一下`@OnClassCondition`的部分源码。 ``` @Order(-2147483648) class OnClassCondition extends FilteringSpringBootCondition { OnClassCondition() { } ``` (4)看一下`@FilteringSpringBootCondition`的部分源码。 ```java abstract class FilteringSpringBootCondition extends SpringBootCondition implements AutoConfigurationImportFilter, BeanFactoryAware, BeanClassLoaderAware { private BeanFactory beanFactory; private ClassLoader beanClassLoader; FilteringSpringBootCondition() { } // 最终调用该方法来判断是否符合条件,如果符合则返回true // 让被@Conditional扩展注解标记的类生效 public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {...)) ``` 下面列举了一些`@Conditional`注解的派生注解。它们的作用是:必须是注解指定的条件成立,才给容器中添加相应的组件,配置里面的内容才生效。 | @Conditional扩展注解 | 作用(判断是否满足当前指定条件) | | --- | --- | | @ConditionalOnJava | 系统的java版本是否符合要求 | | @ConditionalOnBean | 容器中存在指定Bean | | @ConditionalOnMissingBean | 容器中不存在指定Bean | | @ConditionalOnExpression | 满足SpEL表达式指定 | | @ConditionalOnClass | 系统中有指定的类 | | @ConditionalOnMissingClass | 系统中没有指定的类 | | @ConditionalOnSingleCandidate | 容器中只有一一个指定的Bean ,或者这个Bean是首选Bean | | @ConditionalOnProperty | 系统中指定的属性是否有指定的值 | | @ConditionalOnResource | 类路径下是否存在指定资源文件 | | @ConditionalOnWebApplication | 当前是为web环境 | | @ConditionalOnNotWebApplication | 当前不是web环境 | | @ConditionalOnJndi | JNDI存在指定项 |