Spring高级装配--条件化的bean

news2024/11/28 8:27:10

目录

条件化创建bean的例子

使用

解析


  • 条件化创建bean的例子

    • 希望一个或多个bean只有在应用的类路径下包含特定的库时创建
    • 希望某个bean只有当另外某个特定的bean也声明之后才会创建
    • 要求某个特定的环境变量设置之后,才会创建某个bean
  • 在Spring 4之前,很难实现这种级别的条件化配置
  • 但是Spring 4引入了一个新的@Conditional 注解,它可以用到带有@Bean 注解的方法上
  • 如果给定的条件计算结果为true,就会创建这个bean,否则的话,这个bean会被忽略
  • 设想一种应用场景:应用部署在多台服务器上,而想应用的其中某个服务只运行在一台服务器上(比如定时任务或者kafka消息监听处理消息等服务),条件化的bean可以实现此类需求
  • 比如应用上下文在创建某个bean之前,查询数据库,若数据库配置的此环境ip与当前虚机ip一致,则创建,否则则不创建
  • 使用

  • 自定义的条件类IpSameCondition需要实现Condition接口,重写matches()方法即可

  • 可以看出来,这个接口实现起来很简单直接
  • 只需提供matches()方法的实现即可
  • 如果matches()方法返回true,那么就会创建带有@Conditional 注解的bean
  • 如果matches()方法返回false,将不会创建这些bean
  • 解析

  • matches()方法很简单但功能强大
  • 它能通过给定的ConditionContext对象进而得到Environment对象再进行检查
  • 但Condition实现的考量因素可能会比这更多
  • matches()方法会得到ConditionContext和AnnotatedTypeMetadata对象用来做出决策
  • ConditionContext是一个接口,大致如下所示:

  • 通过ConditionContext,我们可以做到如下几点:
    • 借助getRegistry()返回的BeanDefinitionRegistry检查bean定义
    • 借助getBeanFactory()返回的ConfigurableListableBeanFactory检查bean是否存在,甚至探查bean的属性
    • 借助getEnvironment()返回的Environment检查环境变量是否存在以及它的值是什么
    • 读取并探查getResourceLoader()返回的ResourceLoader所加载的资源
    • 借助getClassLoader()返回的ClassLoader加载并检查类是否存在
  • AnnotatedTypeMetadata则能够让我们检查带有@Bean 注解的方法上还有什么其他的注解
  • 像ConditionContext一样,AnnotatedTypeMetadata也是一个接口;它如下所示:

  • 借助isAnnotated()方法,我们能够判断带有@Bean 注解的方法是不是还有其他特定的注解
  • 借助其他的那些方法,我们能够检查@Bean 注解的方法上其他注解的属性
  • 非常有意思的是,从Spring 4开始,@Profile 注解进行了重构,使其基于@Conditional 和Condition实现
  • 作为如何使用@Conditional 和Condition的例子,我们来看一下在Spring 4中,@Profile 是如何实现的

  • @Profile 本身也使用了@Conditional 注解,并且引用ProfileCondition作为Condition实现
  • 如下所示,ProfileCondition实现了Condition接口,并且在做出决策的过程中,考虑到了ConditionContext和AnnotatedTypeMetadata中的多个因素
  • ProfileCondition检查某个bean profile是否可用:

  • 可以看到,ProfileCondition通过AnnotatedTypeMetadata得到了用于@Profile 注解的所有属性
  • 借助该信息,它会明确地检查value属性,该属性包含了bean的profile名称
  • 然后,它根据通过ConditionContext得到的Environment来检查[借助acceptsProfiles()方法]该profile是否处于激活状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【乐观锁与悲观锁】—— 每天一点小知识

💧 乐观锁与悲观锁 \color{#FF1493}{乐观锁与悲观锁} 乐观锁与悲观锁💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客🎐 🐳 《数据结构与算法》专栏的文章图文并茂&…

2023-06-09:什么是Redis事务?原理是什么?

2023-06-09:什么是Redis事务?原理是什么? 答案2023-06-09: Redis中的事务是以一组命令的形式出现的,这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令,而且所有命令…

linuxOPS基础_linux ACL访问控制

问题:我们学过的所有者身份包含哪些? 答案:ugo,属主,属组,其他。 问题:我们学过的文件权限包含哪些? 答案:rwx,读写执行,特殊s,t ​ ACL,是 Access Contro…

java变量

基本数据类型介绍 基本的数据类型: 整数类型:byte、short、int、long 定义long类型的变量,赋值时需要以"l"或"L"作为后缀。 Java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long。 Java的整…

移动开发行业,就业及毕业,再到无业,夜夜无眠~

近期听得最多的一个消息就是:“今年太不好找工作了” 这是粉丝朋友发来的感叹,三个星期内没有找到工作,在我朋友圈中算短的了,还有不少朋友已经失业快半年了,情况都和这个类似。 是移动互联网市场变了吗? …

字符串是否相等案例s1==s3?

下列代码的运行结果是? public class test { public static void main(String[] args) { String s1 "abc"; String s2 "ab"; String s3 s2 "c"; System.out.println(s1 s3); } } /** C…

【linux】信号的保存和递达处理

上节我们了解到了预备(信号是什么,信号的基础知识)再到信号的产生(四种方式)。今天我们了解信号的保存。信号产生,进程不一定立马就去处理,而是等合适的时间去处理,那么在这段时间内…

[Java基础]面向对象

目录 1、对象和类 2、类之间的关系 3、引用 4、对象的创建和使用 5、构造函数/构造方法 6、内存解析 在这篇文章中,我们将学习面向对象的思想,并学习如何使用面向对象思想编程。在学习面向对象编程之前,我们先了解一下编程语言的发展&a…

Win安装Node.js Npm

1、在使用之前,先类掌握3个东西,明白它们是用来干什么的: npm: nodejs 下的包管理器。 webpack: 它主要用途是通过CommonJS 的语法把所有浏览器端需要发布的静态资源作相应的准备,比如资源的合并和打包。 vue-cli: 用户生成Vue工…

HNU-操作系统OS-作业4(37-40章)

OS_homework_4 这份文件是OS_homework_4 by计科2102 梅炳寅 202108010206 文档设置了目录,可以通过目录快速跳转至答案部分。 第37章 运行程序wolf/OS-homework/file-disks/disk.py 解释一些参数 -G可以查看可视化内容-c可以计算结果。-a 提供待访问的数组-S 将寻道速率改…

深度学习训练营之优化器对比

深度学习训练营之优化器对比 原文链接环境介绍前置工作设置GPU 数据处理导入数据数据集处理数据集可视化 模型构造模型训练结果可视化 原文链接 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章:365天深度学习训练营…

deque(简单介绍一下)

deque的基本情况: 简单的来说deque是一个双头队列。且两边的尺寸可以动态收缩或者扩张。 其底层实现相当复杂,而且效率并不高。大多数时候都不会使用。 deque诞生的原因是vector和list的优缺点不可分割。 正好复习一下vector和list的优缺点。 vector的…

手机抓包fiddler配置及使用教程

本文基于Fiddler4讲解基本使用 fiddler抓包原理 注意:Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888。当Fiddler退出的时候它会自动注销,这样就不会影响别的 程序。不过如果Fiddler非正常退出&…

学校热水供应系统方案

学校热水供应系统是现代化校园建设的重要组成部分。一套高效、可靠、安全、环保的热水供应系统,不仅能够满足学生、教职工的日常生活需求,也能提高学校形象和竞争力。 在设计学校热水供应系统方案时,需要考虑以下几个方面: 一、热…

【计算机网络复习之路】运输层(谢希仁第八版)万字详解 主打基础

运输层是OSI七层模型中最重要最关键的一层,是唯一负责总体数据传输和控制的一层。运输层要达到两个主要目的:第一,提供可靠的端到端的通信(“端到端的通信” 是应用进程之间的通信);第二,向会话…

【css】box-sizing属性

box-sizing 是一个 CSS 属性,用于指定元素的总宽度和高度的计算方式。它影响内容框的大小,并可以包括或排除元素的填充、边框和外边距。 box-sizing 属性接受两个值: content-box:这是默认值。它指定元素的宽度和高度只包括内容区…

培训班出来拿17K,入职后8天就被裁了....

最近翻了一些网站的招聘信息,把一线大厂和大型互联网公司看了个遍,发现市场还是挺火热的,虽说铜三铁四,但是软件测试岗位并没有削减多少,建议大家有空还是多关注和多投简历,不要闭门造车,错过好…

电脑重装系统后无法开机是什么原因导致的

电脑重装系统是一种常见的解决问题和提升性能的方法,但有时候重装系统后可能会遇到无法开机的问题。本文将介绍一些常见原因和解决方法,帮助您解决电脑重装系统后无法开机的困扰。 工具/原料: 系统版本:windows7系统 品牌型号&…

HNU-操作系统OS-作业3(26-31章)

OS_homework_3 这份文件是OS_homework_3 by计科210X wolf 202108010XXX 文档设置了目录,可以通过目录快速跳转至答案部分。 第26章 运行该程序wolf/OS-homework/threads-intro/x86.py 通过README可知一些重要的标识符如下 -p:指定程序 -t:线程数 -i:指定每执行i个指令…

BT8918D----GPIO模块

0 Preface/Foreword 1 宏定义和数据结构 1.1 gpio_t typedef struct { psfr_t sfr; //GPIO SFR ADDR u8 num; u8 type; //type 1,高压IO,没有300R的强上下拉电阻。 type 0, 普通IO, 有内部300R上下拉电阻。 } gpio_t; 1.…