首页 > 其他分享 >SpringBoot - 自动装配

SpringBoot - 自动装配

时间:2024-08-07 20:39:17浏览次数:8  
标签:装配 SpringBoot 配置 ImportSelector Bean 自动 Import 注解

SpringBoot - 自动装配

SpringBoot 最核心的功能就是自动装配,

Starter 作为 SpringBoot 的核心功能之一,基于自动配置代码提供了自动配置模块及依赖的能力,让软件集成变得简单、易用。使用 SpringBoot 时,我们只需引人对应的 Starter,SpringBoot 启动时便会自动加载相关依赖,集成相关功能,这便是 SpringBoot 的自动装配功能。

简单概括其自动配置的原理:由@SpringBootAppliction组合注解中的@EnableAutoConfiguration注解开启自动配置,加载 spring.factories 文件中注册的各种 AutoConfiguration 配置类,当其 @Conditional 条件注解生效时,实例化该配置类中定义的 Bean,并注入 Spring 上下文。

 


SpringBoot 自动装配过程涉及以下主要内容:@EnableAutoConfiguration: 扫描类路径下的META-INF/spring.factories文件,并加载其中中注册的 AutoConfiguration 配置类,开启自动装配;

spring.factories:配置文件,位于 jar 包的 META-INF 目录下,按照指定格式注册了 AutoConfiguration 配置类;AutoConfiguration 类:自动配置类,SpringBoot 的大量以 xxxAutoConfiguration 命名的自动配置类,定义了三方组件集成 Spring 所需初始化的 Bean 和条件;@Conditional 条件注解及其行生注解:使用在 AutoConfiguration 类上,设置了配置类的实例化条件;Starter:三方组件的依赖及配置,包括 SpringBoot 预置组件和自定义组件,往往会包含 spring.factories 文件、AutoConfiguration 类和其他配置类。其功能间的作用关系如下图:


1. @EnableAutoConfiguration

2. @AutoConfigurationImportSelector

@EnableAutoConfiguration的自动配置功能是通过@Import注解导入的ImportSelector来完成的。 @Import(AutoConfigurationlmportSelector.class)是@EnableAutoConfiguration注解的组成部分,也是自动配置功能的核心实现者。下面讲解@Import的基本使用方法和ImportSelector的实现类AutoConfigurationlmportSelector。
2. @Import
@Import注解,提供了导入配置类的功能。SpringBoot 的源代码中,有大量的EnableXXX类都使用了该注解,了解@Import有助于我们理解 SpringBoot 的自动装配,@Import有以下三个用途:

通过@Import引入@Configuration注解的类;
导入实现了ImportSelector或ImportBeanDefinitionRegistrar的类;
通过@lmport导入普通的POJO。

3. AutoConfigurationlmportSelector 实现类
@Import的许多功能都需要借助接口ImportSelector来实现,ImportSelector决定可引人哪些 @Configuration的注解类,ImportSelector接口源码如下:
java 代码解读复制代码public interface ImportSelector {
String[] selectImports(AnnotationMetadata importingClassMetadata);
}

ImportSelector接口只提供了一个参数为AnnotationMetadata的方法,返回的结果为一个字符串数组。其中参数AnnotationMetadata内包含了被@Import注解的类的注解信息。在selectimports方法内可根据具体实现决定返回哪些配置类的全限定名,将结果以字符串数组的形式返回。如果实现了接口ImportSelector的类的同时又实现了以下4个Aware接口,那么 Spring 保证在调用ImportSelector之前会先调用Aware接口的方法。这4个接口为:EnvironmentAware、BeanFactoryAware、 BeanClassLoaderAware和ResourceLoaderAware。
在AutoConfigurationlmportSelector的源代码中就实现了这4个接口:


  四、@Conditional 注解

  @Conditional 注解允许你根据特定的条件来动态配置 Spring Bean。换句话说,只有在特定条件满足的情况下,Spring 才会实例化和注入标注了 @Conditional 的 Bean。

  @Conditional 注解本身并不包含具体的条件逻辑,而是依赖于实现了 Condition 接口的类来定义条件逻辑。使用时需要将实现了 Condition 接口的类作为参数传递给 @Conditional 注解。

   1.  Condition 接口

1 package org.springframework.context.annotation;
2 
3 import org.springframework.core.type.AnnotatedTypeMetadata;
4 
5 @FunctionalInterface
6 public interface Condition {
7     boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
8 }

 


Spring 提供了一些常用的 @Conditional 注解,用于处理常见的条件逻辑:

@ConditionalOnProperty: 根据配置属性来判断是否注入 Bean。
@ConditionalOnClass: 当类路径中存在特定的类时注入 Bean。
@ConditionalOnMissingBean: 当容器中不存在特定的 Bean 时注入。
@ConditionalOnBean: 当容器中存在特定的 Bean 时注入。
@ConditionalOnWebApplication: 只有在 Web 应用环境中才注入 Bean。
@ConditionalOnExpression: 根据 SpEL 表达式的结果来判断是否注入 Bean。


参考链接:https://juejin.cn/post/7137095650160115743

标签:装配,SpringBoot,配置,ImportSelector,Bean,自动,Import,注解
From: https://www.cnblogs.com/hld123/p/18347859

相关文章

  • SpringBoot项目中HTTP请求体只能读一次?试试这方案
    问题描述在基于Spring开发Java项目时,可能需要重复读取HTTP请求体中的数据,例如使用拦截器打印入参信息等,但当我们重复调用getInputStream()或者getReader()时,通常会遇到类似以下的错误信息:大体的意思是当前request的getInputStream()已经被调用过了。那为什么会出现这个问题呢?......
  • springboot的jar在linux上sh启动脚本
     java在linux上start、stop、restart、status等启动命令,sh脚本,appMgr.sh放在reources/ops下#!/usr/bin/shAPP_NAME="@project.name@[email protected]@.jar"DEPLOY_PATH=`pwd`#JVM启动参数1JVM_PARAMS="-Dfastjson.parser.safeMode=true"command=$1#nohup......
  • 前端国际化自动工具 - 国际化文案配置系统
    背景笔者之前所在的公司主要做东南亚和欧洲一些国家的业务,做的是Web后台管理系统,项目被不同国家(有的项目多达七八个国家)的客户使用,所以前端项目需要支持多语言展示,也就是适配国际化。日常编码中,系统需要接入前端web国际化插件,vue项目使用的是vue-i18n,而react项目......
  • Springboot计算机毕业设计大学生请假系统(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,教师,学院,专业,班级,请假信息,请假条,销假信息,公告信息,出勤率开题报告内容一、选题背景与意义随着高等教育的普及和学生数量的不断增加,传统的学生请假......
  • Springboot计算机毕业设计大学生档案管理系统-程序+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,教师,学生档案,班级成绩单,登记表,个人荣誉开题报告内容一、研究背景与意义研究背景:随着高等教育的发展,大学生人数的不断增加,学生档案信息的数量急剧增长......
  • Springboot计算机毕业设计打印助手平台21swx
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表打印参数,用户,店铺,打印服务,打印订单开题报告内容一、项目背景与意义随着信息技术的快速发展,企业和校园中的打印服务已成为日常办公和学习中不可或缺的一部分......
  • DockerCompose中使用自定义网络的方式实现部署SpringBoot+Mysql+Redis
    场景Docker中Docker网络-理解Docker0与自定义网络的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140788458Docker中使用自定义网络方式实现Redis集群部署与测试流程:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140797109上面介绍了D......
  • springboot实战
    pom<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org......
  • 基于springboot+vue开发的垃圾分类识别系统
    背景随着社会的快速发展,计算机的影响是全面且深入的。日常生活中,“垃圾”无处不在,家庭公寓里的垃圾桶、街头巷尾的垃圾箱、城市郊区的垃圾场、校园的垃圾站点等等,你也常常会发现,垃圾处理时通常有着多种分类,随着垃圾分类的普及,用户的数量和管理员的工作量在不断增加,工作也更......
  • 基于springboot+MySQL校园社团信息管理系统的设计与实现-计算机毕设 附源码 02705
    springboot校园社团信息管理系统的设计与实现目 录摘要1绪论1.1研究背景1.2 研究意义1.3论文结构与章节安排2 校园社团信息管理系统系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.2.2数据修改流程2.2.3数据删除流程2.3 系统......