SpringBoot中Bean按条件装配

@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自动装配源码解析

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

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

相关文章

定义一个手表_华米Amazfit Pop评测:一款功能全面的“性价比”手表

目前的智能手表虽然品牌、型号众多&#xff0c;但基本可以分为二种类型&#xff1a;第一种为入门级智能手表&#xff0c;其功能单一与智能手环差不多&#xff0c;但胜在屏幕大、能够带来更好的观感且价格便宜&#xff1b;第二种为旗舰级智能手表&#xff0c;功能全面、硬件水准…

[Java基础]复制文件的异常处理try...catch...finally的做法

代码如下: package ErrorOperatorPack;import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class CopyFileDemo01 {public static void main(String[] args){}private static void method() {FileReader fr null;FileWriter fw null…

有哪些你踏入社会才明白的道理

不知不觉已经工作10多年&#xff0c;从一个懵懂的大学生到被社会无情毒打&#xff0c;终于成长一个职场老鸟。最近几天在胡思乱想&#xff0c;这10多年不少认知和感悟&#xff0c;如果10年前有人能告诉我&#xff0c;我会不会少走很多很多弯路&#xff1f;读书的时候&#xff0…

手把手教你 git revert merge

开发中git分支管理 研发流程 从develop分支切出一个新分支&#xff0c;根据是功能还是bug&#xff0c;命名为id-xxx 或 id-fixbug-*。开发者完成开发&#xff0c;提交分支到远程仓库。开发者发起merge请求&#xff0c;将新分支请求merge到develop分支&#xff0c;并提醒code r…

如何把自己的经历写成小说_古天乐的经历教会我们:如何在被欺骗以后改善自己的心理状态...

众所周知&#xff0c;这个只有太阳能黑他的男人&#xff0c;早年未发迹时曾干过泊车小弟等工作&#xff0c;后来作为模特经纪人接触娱乐圈&#xff0c;传闻某次模特迟到&#xff0c;古爷临时救场&#xff0c;算是正式踏入娱圈&#xff0c;出现在无数大牌歌星的MV里&#xff0c;…

从GC的SuppressFinalize方法带你深刻认识Finalize底层运行机制

如果你经常看开源项目的源码&#xff0c;你会发现很多Dispose方法中都有这么一句代码&#xff1a; GC.SuppressFinalize(this); &#xff0c;看过一两次可能无所谓&#xff0c;看多了就来了兴趣&#xff0c;这篇就跟大家聊一聊。一&#xff1a;背景1. 在哪发现的相信现在Mysql在…

NIO工作方式浅析

java Socket 工作机制 Socket是描述计算机之前相互通信的一种抽象功能。通过基于TCP/IP的流套接字协议建立连接A机器B机器通信—建立Socket连接—通过TCP连接&#xff08;端口号指定唯一应用&#xff09;----IP寻址&#xff08;寻找唯一主机&#xff09;----最终找到唯一主机上…

bufferedimage生成的图片模糊_Kaptcha图片验证码工具

阅读文本大概需要3分钟。验证码的作用图片验证码自从诞生以来从未被抛弃&#xff0c;依然发出属于它所应有的光。验证码经常验证如下一些场景。1、用户登录&#xff0c;防止机器人登录2、论坛留言&#xff0c;防止恶意灌水3、短信验证码发送&#xff0c;防止盗刷短信Kaptcha 简…

[Java基础]对象(反)序列化流

对象序列化流: 代码如下: package ObjectOutputStreamPack;import java.io.Serializable;public class Student implements Serializable {private String name;private int age;public Student() {}public Student(String name, int age) {this.name name;this.age age;}pu…

C# 9 新特性:代码生成器、编译时反射

前言今天 .NET 官方博客宣布 C# 9 Source Generators 第一个预览版发布&#xff0c;这是一个用户已经喊了快 5 年特性&#xff0c;今天终于发布了。简介Source Generators 顾名思义代码生成器&#xff0c;它允许开发者在代码编译过程中获取查看用户代码并且生成新的 C# 代码参与…

I/O性能与可靠性

I/O调优 磁盘I/O优化 性能检测&#xff1a; 压力测试应用程序&#xff0c;观察系统I/O wait指标是否正常&#xff0c;例如有n个CPU&#xff0c;利息情况下I/O wait参数不超过25%&#xff0c;如果超过&#xff0c;就是这个程序的瓶颈就是在IO操作上了可以用iostat命令查看另外…

.NET开源工具类库:Masuit.Tools

【开源框架】| 通用工具类库这是恰童鞋骚年的第223篇原创文章本文介绍一个我的同事【懒得勤快】&#xff08;人称勤快哥&#xff0c;我们叫他骚哥&#xff09;写的一个.NET开源工具类库项目&#xff0c;包含一些常用的操作类&#xff0c;大都是静态类&#xff0c;加密解密&…

[Java基础]字节,字符打印流

代码如下&#xff1a; package PrintWriterPack;import java.io.FileNotFoundException; import java.io.PrintWriter;public class PrintWriterDemo {public static void main(String[] args) throws FileNotFoundException {PrintWriter pw new PrintWriter("D:\\Java…

javaI/O包中的包装模式

设计模式解析–适配器模式 对适配器模式功能比较好理解&#xff0c;就是讲一个类的接口换成客户端所能接受的另外一个接口&#xff0c;从而使两国接口不匹配而无法在一起工作的两个类能在一起工作。 适配器的结构 适配器UML图如下 Target&#xff08;目标接口&#xff09;&…

DevOps vs. Agile:它们有什么共同点?

导语DevOps与Agile有很多不同&#xff0c;但它们之间仍可发现很多共同点&#xff0c;这篇文章为读者揭晓。正文DevOps和Agile之间有着明显的关系。Agile是方法论&#xff0c;Scrum是框架&#xff0c;并DevOps随着看板也落在了Agile的“伞”下。精益&#xff0c;大规模的Scrum&a…

[Java基础]Properties

代码如下: package PropertiesPack;import java.util.Properties; import java.util.Set;public class PropertiesDemo01 {public static void main(String[] args){Properties prop new Properties();prop.put("001","Tom");prop.put("002",&…

空心点_空心砖的新玩法,看完大开眼界

我们所见的空心砖大都在建筑工地上常见的有水泥空心砖和粘土空心砖特点是轻质、环保、保温和隔音如此常见的空心砖仅仅是只为建筑而生吗不是&#xff0c;不管是古朴砖红色空心砖&#xff0c;还是高冷的水泥空心砖他们可以演绎不同的角色甚至让每个渴望回归本真的我们&#xff0…

IO与零拷贝

IO与零拷贝 零拷贝基本介绍 零拷贝时网络编程的一个关键优化点在Java程序中&#xff0c;常用的零拷贝又mmap&#xff08;内存映射&#xff09;和sendFile。那么在OS中的设计时如何&#xff0c;我们需分析mmap和sendFile对比最后通过案例分析 用户进程与操作系统关系 我们先…

从堆里找回“丢失”的代码

前言 前一阵子&#xff0c;使用小乌龟&#xff08;TortoiseGit&#xff09;提交代码的时候&#xff0c;错误的 Revert 了部分代码&#xff0c;本文记录了找回这部分代码的过程。文章标题致敬张银奎老师《格蠹汇编》的第一章 —— 从堆里抢救丢失的博客。说明&#xff1a; 本文的…