当前位置: 首页 > news >正文

24、springboot的自动配置01--类条件注解@ConditionalOnClass、bean条件注解@ConditionalOnBean

springboot的自动配置

★ 自动配置

Spring Boot的自动配置通常可根据依赖库自动触发——当Spring Boot检测到项目中包含某些框架的JAR包时,Spring Boot就会触发自动配置。其实通过@EnableAutoConfiguration注解来启动▲ 其实你用到@SpringBootApplication,该注解其实就组合了@EnableAutoConfiguration注解。因此应用主类只要使用@SpringBootApplication注解,就相当于添加@EnableAutoConfiguration注解。

★ 自动配置的替换原则

 Spring Boot会为我们自动配置很多Bean——这些Bean就是整合某个框架所需要的基础Bean。举例来说,以整合MyBatis为例,典型至少需要DataSource、SqlSessionFactory、SqlSessionTemplate……如果不用Spring Boot,开发者就需要自行在容器中配置这些基础Bean来完成整合。用了Spring Boot之后,这些完成整合的基础Bean就交给Spring Boot来自动配置了。▲ 两种常见的替换原则:A. 一旦你在容器中配置了某种类型的(DataSource)的Bean,Spring Boot将不再自动配置该类型的Bean。这意味着开发者定制配置替换了Spring Boot的自动配置。  —这种是基于类型的替换原则。基于注解: @ConditionalOnMissingBean({DataSource.class})B. 一旦你在容器中配置了某个特定Id的(sqlSessionTemplate)的Bean,Spring Boot将不再自动配置该ID的Bean。这意味着开发者定制配置替换了Spring Boot的自动配置。——这种是基于ID的替换原则。基于注解:@ConditionalOnMissingBean(name = "sqlSessionTemplate")▲ 当开发者要替换Spring Boot的自动配置时,通常只要做一件事情——在Spring容器中添加自定义的配置,一旦你添加了自定义配置,Spring Boot自动配置就自动“退场”了。

★ 禁用自动配置

 只要你使用了@EnableAutoConfigation注解,Spring Boot会自动启用所有XxxAutoConfiguration自动配置类。而XxxAutoConfiguration就是一个配置类(通常它带有@Configuration注解修饰),默认Spring Boot会扫描并加载它们【备注】:Spring Boot官方的自动配置类通常都位于spring-boot-autoconfigure.jar包中。▲ 禁用某个自动配置类:通过@EnableAutoConfiguration注解的如下属性来指定:- exclude:该属性值可以是一个Class数组,用于禁用一个或多个自动配置类。- excludeName:与前一个属性的作用基本相同,只不过此处指定一个或者多个自动配置类的完整类名的字符串形式。(就是全限定类名的形式)例子:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})——禁用DataSourceAutoConfiguration.class自动配置类。在application.properties文件中通过spring.autoconfigure.exclude例子:
spring.autoconfigure.exclude=\org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration▲ 自动配置和定制配置自动配置确实非常简单,所以Spring Boot上手很简单但Spring Boot自动配置只能处理那些最通用的情况,实际项目往往都需要定制配置,因此你必须掌握Spring Boot定制配置的原理,并能用定制配置去替换自动配置。

★ 自动配置的本质

就是由自动配置类提前配置了整合某个框架所需的基础Bean。——如果你不用Spring Boot,那么整合框架所需的这些基础Bean应该由开发者来配置。用了Spring Boot之后,这些Bean就交给Spring Boot的自动配置类来配置,开发者就无需手动配置,比较简单。

=========================================================
springboot最核心的就是条件注解,真正属于springboot的注解。
而之前的那些 @Controller、@RestController、@PathVariable @Bean 这些其实不属于springboot本身,其实是属于spring mvc,都是属于spring的框架本身

条件注解分类:

类条件注解:
@ConditionalOnClass、
@ConditionalOnMissingClass

Bean条件注解:
@ConditionalOnMissingBean、
@ConditionalOnSingleCandidate
@ConditionalOnBean
@ConditionalOnMissingFilterBean

属性条件注解:@ConditionalOnProperty

资源条件注解:@ConditionalOnResource

Web应用条件注解:
@ConditionalOnWebApplication.
@ConditionalOnNotWebApplication.
@ConditionalOnWarDeployment

SpEL表达式条件注解:
@ConditionalOnExpression

特殊条件注解:
@ConditionalOnCloudPlatform、
@ConditionalOnJava、
@ConditionalOnJndi.
@ConditionalOnRepositorylype

在这里插入图片描述

★ 类条件注解

类条件有两个@ConditionalOnClass、@ConditionalOnMissingClass,
分别表示某些类存在或不存在时被修饰的配置类或被修饰的配置方法生效。@ConditionalOnClass:表示某些类【存在】时被修饰的配置类或被修饰的配置方法生效。
@ConditionalOnMissingClass表示某些类【不存在】时被修饰的配置类或被修饰的配置方法生效。@ConditionalOnClass注解可通过value或name属性指定它所要求存在的类。@ConditionalOnMissingClass则只能通过value属性指定它所要求不存在的类。

代码演示 类条件注解 中的 @ConditionalOnClass

@ConditionalOnClass:表示某些类【存在】时被修饰的配置类或被修饰的配置方法生效。

演示使用注解 @ConditionalOnClass ,表示这个被这个注解修饰的类,得注解限制的一些东西存在,该类才能生效。

比如这个被 @ConditionalOnClass 注解修饰的类,
通过@ConditionalOnClass(name = “com.mysql.cj.jdbc.Driver”) 修饰,就是要求当前项目中存在 MYSQL 驱动时,这个配置类才会生效。

在这里插入图片描述
得有这个mysql的驱动,在启动类中获取这个配置类bean才能生效。
在这里插入图片描述

如图,有了@ConditionalOnClass(name = “com.mysql.cj.jdbc.Driver”)声明的mysql驱动,就可以在成功获取这个MyConfig01配置类这个bean(这个配置类在启动的时候会被加载成bean)
在这里插入图片描述MyConfig01类贴了@ConditionalOnClass(name = “com.mysql.cj.jdbc.Driver”),如果没有mysql驱动,那么如图
在这里插入图片描述

★ Bean条件注解

@ConditionalOnBean:特定Bean存在时条件生效。
@ConditionalOnMissingBean:特定Bean不存在时条件生效。
@ConditionalOnSingleCandidate:特定Bean存在且唯一时条件生效。
@ConditionalOnMissingFilterBean:专门用于检查Filter。- 如果指定了name属性,表明根据Bean ID进行检查;否则根据Bean类型进行检查。【注意】:使用Bean条件注解时,务必要注意Bean的加载顺序。换而言之,你要检查某个Bean是否存在时,一定要保证你的该条件注解的执行时机在你检查的bean之后。
示例:
@ConditionalOnBean(name = "abc") ——当容器中有ID为abc的Bean时,下面的配置才生效。可能出现的情况时,虽然容器中已经配置了ID为abc的Bean,但由于abc 这个 Bean的加载时机较晚,晚于@ConditionalOnBean这个条件注解的加载时机,因此同样可能导致该条件失效。

▲ 控制顺序的注解:

@AutoConfigureBefore:只能修饰自动配置类,要求被修饰的配置类必须在指定配置类之前生效。@AutoConfigureAfter:只能修饰自动配置类,要求被修饰的配置类必须在指定配置类之后生效。@AutoConfigureOrder:可修饰配置类、方法、成员变量,指定一个自动配置顺序编号。编号越小的越先加载这3个注解主要用于控制自动配置类之间的顺序,对类内部的配置方法的顺序一般不做控制。@AutoConfigureOrder 官方说是能控制配置类、方法、成员变量的加载顺序,但其实只能控制类层面的加载顺序,如果要控制一个类中的多个方法的加载顺序,是没有效果的。

代码演示 Bean条件注解 @ConditionalOnBean

@ConditionalOnBean:特定Bean存在时条件生效。

创建一个userService 接口,然后把这个接口用@Bean 注解修饰为容器中的bean。
然后用@ConditionalOnBean(name = “getDataFormat”)修饰bean方法。
可以看出因为有 getDataFormat 这个bean,所以 userService 这个bean方法才能生效。
在这里插入图片描述

如果把两个bean的顺序反过来,就会因为加载时机的问题,导致出问题。

如图:我们把userService方法写在getDataFormat方法前面,那么项目在启动加载的时候,就会先加载userService方法,但是userService方法要生效的前提是有getDataFormat这个bean,但是此时的getDataFormat 方法加载时机比较慢,虽然代码写了,但是因为还没加载,在@ConditionalOnBean(name = “getDataFormat”) 看来就是没有getDataFormat这个bean,所以userService方法不生效,所以在启动类那边,ctx.getBean(“userService”),就找不到userService这个bean。
在这里插入图片描述

演示控制顺序的注解 @AutoConfigureOrder

@AutoConfigureOrder:可修饰配置类、方法、成员变量,指定一个自动配置顺序编号。编号越小的越先加载
这3个注解主要用于控制自动配置类之间的顺序,对类内部的配置方法的顺序一般不做控制。
@AutoConfigureOrder 官方说是能控制配置类、方法、成员变量的加载顺序,但其实只能控制类层面的加载顺序,如果要控制一个类中的多个方法的加载顺序,是没有效果的。

如图:即使加了注解,但是这个注解修饰方法,并没有效果,说是只有修饰类有效果
在这里插入图片描述
如图:还是得让getDataFormat方法先执行靠谱。
在这里插入图片描述

http://www.lryc.cn/news/125525.html

相关文章:

  • 婚恋交友h5多端小程序开源版开发
  • uniapp案例30余种实战项目
  • 回归预测 | MATLAB实现GRNN广义回归神经网络多输入多输出预测
  • 从零开始学习VBA(一)
  • Kotlin Executors线程池newSingleThreadExecutor单线程
  • ZooKeeper介绍
  • 首起针对国内金融企业的开源组件投毒攻击事件
  • 源于传承,擎领未来,新架构、新工艺下的“换心工程”——金融电子化访中电金信副总经理、研究院院长况文川
  • pytest数据驱动(最简单)
  • 分布式 - 服务器Nginx:一小时入门系列之代理缓冲与缓存
  • 什么是集成学习算法
  • springboot多模块打包方式
  • 【爬虫】Urllib让我们的 python 假装是浏览器
  • java基础面试
  • C++ 动态规划经典案例解析之最长公共子序列(LCS)_窥探递归和动态规划的一致性
  • 接口测试自动化:简化测试流程,提升效率
  • LoRA微调方法详解
  • redis-数据类型及样例
  • 公司电脑三维图纸加密、机械图挡加密软件
  • 安装使用IDEA,修改样式,配置服务,构建Maven项目(超级详细版)
  • Apache Dubbo 云原生可观测性的探索与实践
  • DaVinci Resolve Studio 18 for Mac 达芬奇调色
  • Excelize Go语言操作 Office Excel文档基础库
  • SpringBoot、Java 使用 Jsoup 解析 HTML 页面
  • C# 随心记
  • 华为OD机试-字符串分割
  • element-ui的el-dialog,简单的封装。
  • SpringBoot引入外部jar打包失败解决,SpringBoot手动引入jar打包war后报错问题
  • HTTP基础:学习HTTP协议的基本知识,了解请求和响应的过程
  • Spark基础-任务提交相关参数