首页 > 其他分享 >【Spring boot】自动配置的理论基础

【Spring boot】自动配置的理论基础

时间:2022-10-02 21:24:24浏览次数:51  
标签:Spring 配置 boot Bean 自动 某个 注解

本文结论

  • SpringBoot的自动配置就是SpringBoot在源码中预先写好了一些配置类,预先定义好了一些Bean!
  • 在使用SpringBoot时,这些配置类就已经在我们项目的依赖中了!
  • 自动配置类或自动配置Bean是否生效,看具体所指定的条件!

在spring中有哪些配置

  • 配置文件:类似端口号、数据库地址、用户名密码等
  • 各种Bean:比如整合Mybatis需要配置的MapperFactoryBean,比如整合事务需要配置DataSourceTransactionManager...

自动配置做什么事情

  • 核心是配置各种Bean。
  • 对于配置文件来说,spring并不知道你的地址、密码、账号...这些值,所以spring不能进行自动配置。
  • 对于服务端口号、中间件端口号...这些配置,spring boot中也会提供默认值。

spring boot中自动配置做了什么?

  • Spring整合各种Servlet容器(Tomcat、Jetty)的Bean。
  • Spring整合各种消息队列(RabbitMQ、Kafka、RocketMQ)的Bean。
  • Spring整合各种数据库(MySQL、oracle)的Bean。
  • Spring整合各种缓存(redis)的Bean。
  • 等等

一些自动配置类

  • ServletWebServerFactoryAutoConfiguration:配置了Servlet Web场景中所需要的一些Bean。
  • TransactionAutoConfiguration:配置了事务场景中所需要的一些Bean。
  • AopAutoConfiguration:配置了AOP场景中所需要的一些Bean。
  • RabbitAutoConfiguration:配置了Rabbitmq场景中所需要的一些Bean。
  • ...

自动配置类的生效控制方式:条件注解

  • ConditionalOnBean:是否存在某个某类或某个名字的Bean。
  • ConditionalOnMissingBean:是否缺失某个某类或某个名字的Bean。
  • ConditionalOnSingleCandidate:是否符合指定类型的Bean只有一个。
  • ConditionalOnClass:是否存在某个类。
  • ConditionalOnMissingClass:是否缺失某个类。
  • ConditionalOnExpression:指定的表达式返回的是true还是false。
  • ConditionalOnJava:判断Java版本。
  • ConditionalOnJndi:JNDI指定的资源是否存在。
  • ConditionalOnWebApplication:当前应用是一个Web应用。
  • ConditionalOnNotWebApplication:当前应用不是一个Web应用。
  • ConditionalOnProperty:Environment中是否存在某个属性。
  • ConditionalOnResource:指定的资源是否存在。
  • ConditionalOnWarDeployment:当前项目是不是以War包部署的方式运行。
  • ConditionalOnCloudPlatform:是不是在某个云平台上。
  • Conditional:上面这些注解上都有这个@Conditional注解!

条件注解的作用域

  • 条件注解是可以写在类上和方法上。
  • 个条件注解写在了自动配置类上,那该自动配置类会不会生效就要看当前条件能不能符合。
  • 条件注解写在某个@Bean修饰的方法上,那这个Bean生不生效就看当前条件符不符合。

条件注解的实现原理

  • Spring在解析某个自动配置类时,会先检查该自动配置类上是否有条件注解,如果有,则进一步判断该条件注解所指定的条件当前能不能满足,如果满足了则继续解析该配置类,如果不满足则不进行解析了,也就是配置类所定义的Bean都得不到解析,也就是相当于没有这些Bean了。
  • 同理,Spring在解析某个@Bean的方法时,也会先判断方法上是否有条件注解,然后进行解析,如果不满足条件,则该Bean不会生效。
  • 处理条件注解的源码位置在:org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isCandidateComponent(MetadataReader)中的调用isConditionMatch(metadataReader);方法内部。

结束语

  • 你的点赞是我提高文章质量最大的动力!!!
  • 获取更多本文的前置知识文章,以及新的有价值的文章,让我们一起成为架构师!
  • 目前已经完成了并发编程、MySQL、spring源码、Mybatis的源码。可以在公众号下方菜单点击查看之前的文章!
  • 这个公众号的所有技术点,会分析的很深入!
  • 这个公众号,无广告!!!
    作者公众号.jpg

标签:Spring,配置,boot,Bean,自动,某个,注解
From: https://www.cnblogs.com/zfcq/p/16749488.html

相关文章

  • 【Spring】SpringSecurity的使用
    4SpringSecurity只需要协助SpringSecurity创建好用户对应的角色和权限组,同时把各个资源所要求的权限信息设定好,剩下的像“登录验证”、"权限验证"等等工作都交给Spring......
  • U盘插入自动读写/U盘插入自动复制/python检测U盘的插入,以及进行自动复制文件并写入文
    U盘自动读写的小玩意共有四种方法(我了解的,全是转载)方法一(vbs方法全自动,转载自bilibili 点我跳转)文件下载链接(点我下载)方法二(cmd方法需手动,转载自bilibili点我跳转)文......
  • Spring AOP基础之代理模式.静态代理和动态代理
    代理模式一、代理模式介绍代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展......
  • 面试官:生成订单 30 分钟未支付,则自动取消,该怎么实现?
    在开发中,往往会遇到一些关于延时任务的需求。例如生成订单30分钟未支付,则自动取消生成订单60秒后,给用户发短信对上述的任务,我们给一个专业的名字来形容,那就是延时任......
  • SpringBoot整合Swagger
    什么是Swagger?Swagger是目前最常用的接口生成文档工具之一。Swagger通过注解接口生成网页的在线文档,文档包括接口名、请求方法、参数、返回信息等。更多信息参考:Whatis......
  • springboot+vue前后端分离项目CRUD
    今天完成了项目最基础的一个表的增删改查,后端是springboot+Myabtis-Plus框架,没有写SQL。主要学习一下springboot+vue项目的搭建和使用,以及用elementUI搭建的页面。并......
  • Bootstrap5 如何创建多媒体对象
    一、在Bootstra5中使用媒体对象Bootstrap媒体对象在版本5中已经停止支持了。但是,我们仍然可以使用flex和margin创建包含左对齐或右对齐媒体对象(如图像或视频)以及......
  • springboot开启单元测试的方法分享
    转自:​​http://www.java265.com/JavaFramework/SpringBoot/202206/3781.html​​SpringBoot:  SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spri......
  • springboot项目打包方式
    springboot和ssm项目打包方式1.打jar包说明:springboot项目默认的打包方式就是打jar包,因为它内嵌了tomcat,用不着打war包部署到tomcat的webapp目录下,安装了jdk,就可......
  • Spring Boot 打包方式的选择
    1.背景介绍新建SpringBoot后,会自带打包方式,现在一般都是打包成jar包,当然你想打包成war包也可以,我就不介绍了!本文主要想谈谈自带的打包方式和assembly打包方式,这两者有什......