SpringBoot自动配置中bean的加载控制

🙈作者简介:练习时长两年半的Java up主
🙉个人主页:程序员老茶
🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎
📚系列专栏:Java全栈,计算机系列(火速更新中)
💭 格言:种一棵树最好的时间是十年前,其次是现在
🏡动动小手,点个关注不迷路,感谢宝子们一键三连

目录

  • 课程名:Java
    • 内容/作用:知识点/设计/实验/作业/练习
    • 学习:SpringBoot自动配置中bean的加载控制
      • bean的加载控制

课程名:Java

内容/作用:知识点/设计/实验/作业/练习

学习:SpringBoot自动配置中bean的加载控制

bean的加载控制

​ 前面复习bean的加载时,提出了有关加载控制的方式,其中手工注册bean,ImportSelector接口,ImportBeanDefinitionRegistrar接口,BeanDefinitionRegistryPostProcessor接口都可以控制bean的加载,这一节就来说说这些加载控制。

​ 企业级开发中不可能在spring容器中进行bean的饱和式加载的。什么是饱和式加载,就是不管用不用,全部加载。比如jdk中有两万个类,那就加载两万个bean,显然是不合理的,因为你压根就不会使用其中大部分的bean。那合理的加载方式是什么?肯定是必要性加载,就是用什么加载什么。继续思考,加载哪些bean通常受什么影响呢?最容易想的就是你要用什么技术,就加载对应的bean。用什么技术意味着什么?就是加载对应技术的类。所以在spring容器中,通过判定是否加载了某个类来控制某些bean的加载是一种常见操作。下例给出了对应的代码实现,其实思想很简单,先判断一个类的全路径名是否能够成功加载,加载成功说明有这个类,那就干某项具体的工作,否则就干别的工作。

public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {try {Class<?> clazz = Class.forName("com.itheima.bean.Mouse");if(clazz != null) {return new String[]{"com.itheima.bean.Cat"};}} catch (ClassNotFoundException e) {
//            e.printStackTrace();return new String[0];}return null;}
}

​ 通过上述的分析,可以看到此类操作将成为企业级开发中的常见操作,于是springboot将把这些常用操作给我们做了一次封装。这种逻辑判定你开发者就别搞了,我springboot信不过你这种新手开发者,我给你封装一下,做几个注解,你填参数吧,耶,happy。

​ 下例使用@ConditionalOnClass注解实现了当虚拟机中加载了com.itheima.bean.Wolf类时加载对应的bean。比较一下上面的代码和下面的代码,有没有感觉很清爽。其实此类注解还有很多。

@Bean
@ConditionalOnClass(name = "com.itheima.bean.Wolf")
public Cat tom(){return new Cat();
}

​ @ConditionalOnMissingClass注解控制虚拟机中没有加载指定的类才加载对应的bean。

@Bean
@ConditionalOnMissingClass("com.itheima.bean.Dog")
public Cat tom(){return new Cat();
}

​ 这种条件还可以做并且的逻辑关系,写2个就是2个条件都成立,写多个就是多个条件都成立。

@Bean
@ConditionalOnClass(name = "com.itheima.bean.Wolf")
@ConditionalOnMissingClass("com.itheima.bean.Mouse")
public Cat tom(){return new Cat();
}

​ 除了判定是否加载类,还可以对当前容器类型做判定,下例是判定当前容器环境是否是web环境。

@Bean
@ConditionalOnWebApplication
public Cat tom(){return new Cat();
}

​ 下面是判定容器环境是否是非web环境。

@Bean
@ConditionalOnNotWebApplication
public Cat tom(){return new Cat();
}

​ 当然还可以判定是否加载了指定名称的bean,这种有什么用呢?太有用了。比如当前容器中已经提供了jdbcTemplate对应的bean,你还需要再加载一个全新的jdbcTemplate的bean吗?没有必要了嘛。spring说,如果你自己写的话,我就不帮你操这份心了,如果你没写,我再给你提供。自适应,自适应,明白?没有的话就提供给你,有的话就用你自己的,是不是很帅?

@Bean
@ConditionalOnBean(name="jerry")
public Cat tom(){return new Cat();
}

​ 以下就是判定当前是否加载了mysql的驱动类,如果加载了,我就给你搞一个Druid的数据源对象出来,完美!

public class SpringConfig {@Bean@ConditionalOnClass(name="com.mysql.jdbc.Driver")public DruidDataSource dataSource(){return new DruidDataSource();}
}

​ 其中springboot的bean加载控制注解还有很多,这里就不一一列举了,最常用的判定条件就是根据类是否加载来进行控制。

总结

  1. springboot定义了若干种控制bean加载的条件设置注解,由spring固定加载bean变成了可以根据情况选择性的加载bean
往期专栏
Java全栈开发
数据结构与算法
计算机组成原理
操作系统
数据库系统
物联网控制原理与技术

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

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

相关文章

Echarts+D3气泡图

EchartsD3气泡图&#xff08;相邻效果&#xff0c;气泡之间不叠加&#xff09; <template><div ref"chart" style"width: 500px; height: 500px"></div> </template><script setup> import * as echarts from echarts/core …

不同用户同时编辑商品资料导致的db并发覆盖

背景 这个问题的背景来源于有用户反馈&#xff0c;他在商品系统中对商品打的标签不见了&#xff0c;影响到了前端页面上商品的资料显示 不同用户编辑同一商品导致的数据覆盖问题分析 查询操作日志发现用户B确实编辑过商品资料&#xff0c;并且日志显示确实打上了标签&#x…

前端从普通登录到单点登录(SSO)

随着前端登录场景的日益复杂化和技术思想的不断演进&#xff0c;前端在登录方面的知识结构变得越来越复杂。对于前端开发者来说&#xff0c;在日常工作中根据不同的登录场景提供合适的解决方案是我们的职责所在&#xff0c;本文将梳理前端登录的演变过程。 1、无状态的HTTP H…

【面试题】webpack的五大核心、构建流程、性能优化

【面试题】webpack的五大核心、webpack的构建流程、webpack的性能优化 webpack是什么?webpack的五大核心webpack的构建流程webpack性能优化 webpack是什么? js静态模块打包工具。 功能 将多个文件打包成更小的文件&#xff0c;(压缩)翻译 babal-loader es6进行降级兼容。 …

合泰HT66F2390----定时器中断学习笔记

前言 无需多言 直接开始定时器中断 的学习 通过上次的PWM学习&#xff0c;上次用的是周期型TM定时器模块 这次使用标准型TM定时器模块&#xff08;STM&#xff09; 代码 #include <HT66F2390.h>void Timer0_Init(void){_stm0c0 0b00001000;_stm0c1 0b11000001;_stm…

基于巨控GRM561/562/563Y西门子1200PLC发邮件

巨控GRM560,GRM600系列同比之前的GRM530&#xff0c;除短信&#xff0c;微信&#xff0c;电话语音播报增加了邮件发送功能&#xff0c;简单介绍一下PLC发邮件。 1在博途中建立好DB块 2.打开GRMDEV6&#xff0c;新建工程&#xff0c;做好数据采集&#xff0c;这里以DB4.D0&#…

三大数学软件之Maple

相信钻研数学的小伙伴们对MATLAB、SPSS这样的重量级软件并不陌生&#xff0c;这些大型软件能求解复杂的运算&#xff0c;解决各领域的数学问题。今天博主为大家带来了一款名不见经传的软件——Maple&#xff0c;作为三大数学软件之一&#xff0c;Maple同样拥有不菲的计算能力&a…

Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)

本文将详细介绍Java中工厂模式的多种实现方式&#xff0c;包括简单工厂模式、工厂方法模式和抽象工厂模式。我们将通过示例代码和解释来阐述每种工厂模式的特点、使用场景以及优缺点&#xff0c;帮助读者更好地理解和应用这些设计模式。 [参见]&#xff1a; Java设计模式&…

sqoop-import 详解

文章目录 前言一、介绍1. sqoop简介2. sqoop import的作用3. 语法3.1 sqoop import 语法3.2 导入配置属性 二、导入参数1. 常见参数2. 验证参数3. 导入控制参数4. 用于覆盖映射的参数5. 增量导入参数6. 输出行格式参数7. 输入解析参数8. Hive 参数9. HBase 参数10. Accumulo 参…

栈和队列之队列

1.队列 1.1队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队…

数学建模【基于熵权法对TOPSIS模型的修正】

一、修正原因 在前面有关于TOPSIS法和熵权法的介绍&#xff0c;我们可以知道TOPSIS有一个和层次分析法共有的问题&#xff0c;就是各个指标的权重是由我们主观或根据专家的主观评价估计的。层次分析法这个问题还更甚之。而恰好熵权法中的权重是由数据确定的&#xff0c;绝对客…

009-CSS-Less、Scss、Sass

Less、Scss、Sass 概念常用的扩展能力1、嵌套&#xff1a;代码层级清晰2、变量&#xff1a;项目风格抽离3、混合&#xff1a;公共样式封装4、&&#xff1a;当前选择器的父级5、导入&#xff1a;公共文件抽离 在实际工作中&#xff0c;CSS 编写更多的采用 CSS 扩展语言&…

Git 撤销修改

如果我们在我们的工作区写了很长时间代码&#xff0c;发现出现错误&#xff0c;想回退到之前的版本&#xff0c;这时改怎么做呢&#xff1f; 情况一&#xff1a;对于工作区的代码&#xff0c;还没有 add 我们当然也可以使用git diff 查看与上次提交的差异&#xff0c;进行手动删…

【场景题】让你设计一个订单号生成服务,该怎么做?

方案 当设计订单号生成服务时&#xff0c;我们需要考虑唯一性、数据量、可读性、基因法、可扩展性、高性能和高可用性等多个方面。根据这些考虑&#xff0c;一个简单的订单号生成服务设计方案可以采取以下措施&#xff1a; 使用Snowflake算法或第三方分布式ID生成器&#xff…

【力扣经典面试题】58. 最后一个单词的长度

目录 一、问题描述 二、解题思路 三、代码实现&#xff08;C版&#xff09; 四、总结 喜欢可以点赞关注哦&#xff01;谢谢大家哦 一、问题描述 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 …

PackagesNotFoundError:学习利用报错信息找到解决方法

反思&#xff1a;之前看到报错经常是直接复制报错信息去网上搜&#xff0c;但很多情况下报错信息里其实就给出了解决方案 报错信息&#xff1a; Collecting package metadata (current_repodata.json): done Solving environment: unsuccessful initial attempt using frozen …

FRM模型十五:净值归因之Fama_French三因子模型

文章目录 一、起源二、构建因子三、投资组合的净值归因1. 市场因子2. 规模因子3.价值因子4. 基于净值的归因方法 三、代码实现 一、起源 在多因子模型推出之前&#xff0c;CAPM模型被视为资产定价的第一标准。随着市场不断发展&#xff0c;发现了越来越多CAPM模型无法解释的现…

java中的this

在Java中&#xff0c;this 是一个关键字&#xff0c;用于引用当前对象。它可以用于访问当前对象的实例变量和方法。this 关键字通常在以下情况下使用&#xff1a;区分实例变量和局部变量&#xff1a;当实例变量和局部变量名称相同时&#xff0c;可以使用 this 关键字来引用实例…

【linux】crontab定时任务介绍

1.简介2.crontab语法3.crontab限制4.crontab配置文件5.crontab格式介绍 1.简介 Linux crontab 是用来定期执行程序的命令。 当安装完成操作系统之后&#xff0c;默认便会启动此任务调度命令。 crond 命令每分钟会定期检查是否有要执行的工作&#xff0c;如果有要执行的工作便…

u-boot的DM驱动模型

0、本文基于U-Boot 2022.01-v2.07版本进行分析。 1、u-boot编译流程简要分析 2、u-boot启动流程简要分析 3、u-boot增加自定义命令 4、u-boot的DM驱动模型 4.1、参考资料 Uboot中的DM驱动模型&#xff1a;这篇文章详细介绍了DM驱动模型的原理。 本文重点整理了几个数据结构…