@Conditional条件装配

  • @Conditional是Spring Framework提供的一个核心功能注解,这个注解的作用是提供自动装配的条件限制,一般我们在用@Configuration,@Bean的时候使用它。
  • 也就是我们在自定义Bean的注入的时候,我们可以通过@Condition来对bean的注入增加逻辑判断,符合我们要求的我们才让他自动装配
@Conditional 的使用
  • 如下注解源码是@Condition
@FunctionalInterface
public interface Condition {/*** Determine if the condition matches.* @param context the condition context* @param metadata metadata of the {@link org.springframework.core.type.AnnotationMetadata class}* or {@link org.springframework.core.type.MethodMetadata method} being checked* @return {@code true} if the condition matches and the component can be registered,* or {@code false} to veto the annotated component's registration*/boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);}
  • condition是一个函数式接口,提供了一个matches方法,主要提供一个条件匹配的规则,返回表示是否可以注入Bean。

  • @Conditional 的注解来声明如下,他可以接受接收一个Condition的数组

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {/*** All {@link Condition Conditions} that must {@linkplain Condition#matches match}* in order for the component to be registered.*/Class<? extends Condition>[] value();}
Conditional使用Demo
  • 我们通过对以上Conditional的了解来自己实现一个Bean的按自定义条件的装配:
  • 定义一个Condition,判断系统来返回是否装配:
/*** Created by jiamin5 on 2022/3/10.*/
public class GpCondition implements Condition{private static final Logger logger = LoggerFactory.getLogger(GpCondition.class);@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {String os = context.getEnvironment().getProperty("os.name");logger.info("GpCondition matthes osName:{}", os);if(os.contains("Windows")){return true;}return false;}
}
  • 定义配置类,装载一个BeanTestClass
/*** Created by jiamin5 on 2022/3/10.*/
@Configuration
public class ConditionConfig {@Bean@Conditional(GpCondition.class)public BeanTestClass beanTestClass(){return new BeanTestClass();}
}
  • 如上,我们在BeanTestClass上增加了一个@Conditional(GpCondition.class),其中的具体条件就是我们自定义的注入限制条件类。
  • 意思就是,当条件满足我们定义的GpCondition的时候,我们就注入,否则不注入。
  • 依然在Application启动类中添加对新定义Bean的获取,如下
/*** @author liaojiamin* @Date:Created in 11:08 2022/3/7*/
@SpringBootApplication
@EnableAutoImport
public class Application {public static void main(String[] args) {ConfigurableApplicationContext ca = SpringApplication.run(Application.class, args);System.out.println(ca.getBean(FilterFirstObj.class));BeanTestClass beanTestClass = ca.getBean(BeanTestClass.class);System.out.println(beanTestClass);}
}
  • 当我们在Mac os上运行,有如下结果

Spring Boot 中的@Conditional

  • 在SpringBoot中,有针对@Conditional的扩展,提供了更简单的使用方式,扩张了各种类型的注解,如下:

    • ConditionalOnBean/ConditionalOnMissBean 容器中存在或者不存在某个类的时候进行Bean加载
    • ConditionalOnClass/ConditionalOnMissClass:classpath下存在或者不存在指定类的时候进行Bean加载
    • ConditionalOnCloudPlatform:只允许在指定的云平台上才加载指定Bean
    • ConditionalOnExpression:基于SpEl表达式的条件判断
    • ConditionalOnJava:只允许在指定版本Java才加载Bean
    • ConditionalOnJndi:只有指定资源通过JNDI加载后才加载Bean
    • ConditionalOnWebApplication/ConsitionalOnNotWebApplication:如果是活着不是web应用才加载指定的Bean
    • ConditionalOnProperty:系统中指定对呀的属性是否有对应值
    • ConditionOnResource:要加载的Bean依赖指定资源是否存在于classpath
    • ConditionOnSingleCandidate:只有在确定了给定Bean的单个候选项时候才会加载Bean
  • 以上这些都在spring-boot-autoconfiguration.jar 中

其他注入方式spring-autoconfigure-metadata

  • 除了@Conditional注解。Spring Boot中提供了spring-autoconfigure-metadata.properties文件来实现批量自动装配条件配置

  • 与@Conditional意义,只是将条件放在的文件,我们可以在spring-boot-autoconfigure.jar中找到这种配置

  • 同样遵循“约定由于配置”,通过这种配置实现条件过滤需保证两个前提条件:

    • 如上图中,文件路径名称必须是/META-INF/spring-autoconfigure-metadata.properties
    • 配置文件的key’的配置格式:自动配置类的类全路径名.条件 = 值
  • 这种配置优点在于可以有效降低Spring Boot启动时间,通过这种过滤方式减少配置陪的加载数量,因为这个过滤发生在配置类的装载之前,所以他可以降低Spring Boot启动时装载Bean的耗时

上一篇:SpringBoot自动装配源码解析

SpringBoot中Bean按条件装配相关推荐

  1. Springboot配置绑定和条件装配

    其他配置注解 @ConditionalOnBean(name = "tom") // 条件装配 ,存在tom容器时,配置类中所有容器才会生效. @ConditionalOnMiss ...

  2. @data注解不生效_面试官:你经常在SpringBoot中使用的条件注解底层是如何实现的?你了解过吗?...

    SpringBoot内部提供了特有的注解:条件注解(Conditional Annotation).比如@ConditionalOnBean.@ConditionalOnClass.@Conditio ...

  3. 如何正确控制springboot中bean的加载顺序总结

    1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功 ...

  4. Springboot中Bean的具体含义

    在 Spring Boot 中,Bean 是一种由 Spring 容器管理的组件对象,实例化后可以在程序中使用. Bean 的具体含义可以从以下几个方面进行解释: 实例化对象:Bean 是一个普通的 ...

  5. Springboot中Bean的理解

    一.Bean是什么 1.Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化): 2.凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性: 3.规律:凡是 ...

  6. springboot中bean的排除

    此贴用来记录开发遇到的问题哈 背景: 我在做springboot项目b,项目b依赖了项目a,但a中的某个配置类aConfig不是我想要的配置,但又不能改动依赖中的代码,于是我要在b中自定义一个配置类b ...

  7. 详解Spring中Bean的自动装配~

    目录 1. 环境搭建 2. byName.byType 3. 使用注解实现自动装配 @Autowired @Resource 小结 自动装配是Spring满足bean依赖的一种方式 Spring会在上 ...

  8. SpringBoot之Bean之条件注入@ConditionalOnProperty

    1.美图 2.配置属性作为条件 主要是根据配置参数,来决定是否需要创建这个bean,这样就给了我们一个根据配置来控制Bean的选择的手段了,如前面一篇博文中根据配置来选择是随机生成boolean还是随 ...

  9. SpringBoot之Bean之条件注入@Condition

    1.美图 2.概述 这个注解在Spring4中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean 3.定义 @Conditional注解定义如下,其内部主要就是利用了Cond ...

最新文章

  1. 助力健康中国,国内首个中文医疗信息处理挑战榜正式发布
  2. linux 内核 proc_create 函数 内幕初探
  3. exec 和 call 用法详解
  4. 剑指offer(21)从上往下打印二叉树
  5. opc读取ab的plc数据_C#读写 AB PLC 直接通过节点来读写数据 读写 AllenBradley PLC
  6. 由已打开的文件读取数据---read
  7. 获取页面元素的滚动位置,兼容各浏览器
  8. Windows安装Linux, (WSL)Windows Subsystem for Linux
  9. 用Wireshark轻松解密TLS浏览器流量
  10. python访问字符串中的部分字符的操作_小白学Python-13(字符串基础与简单操作)...
  11. 【AI视野·今日CV 计算机视觉论文速览 第245期】Wed, 20 Apr 2022
  12. oracle函数translate,oracle中Translate()函数用法
  13. SNF快速开发平台--规则引擎在程序当中如何调用
  14. 反射可以使用lambda吗_社保卡可以在外地使用吗?
  15. DirectX11:着色器
  16. bzoj 1606 购买干草
  17. 2. 英特尔格式与摩托罗拉格式对比
  18. 神仙技巧-应急响应的神兵利器
  19. Java常见面试题整理(一)
  20. C++ 无符号高精度计算合集

热门文章

  1. linux之cut命令使用和总结
  2. linux之使用indent格式化代码总结
  3. java trim()函数_Java - split()函数和trim()函数的使用方法
  4. qqp2011java_腾讯开放平台中实现QQ登陆的功能
  5. 用台球杆击球,这个击球力道能传递到10米之外的球上吗?
  6. 我居然从一只猫身上学到了斐波那契数列
  7. 周杰伦新歌《说好不哭》彩蛋大汇总! | 今日最佳
  8. Python资料分享来袭,收下不谢!
  9. 一文读懂 AVL 树
  10. python葡萄酒数据集_利用python分析红葡萄酒数据