springBoot 自动配置与starter

目录

一、自动配置

Springboot实现自动配置的核心机制

@Conditional的作用是什么?

如何自定义自动配置?

步骤

例子分析

自动配置的优先级

如何禁用特定的自动配置?

二、starter

如何理解Spring Boot中的starter?

如何自定义starter?

三、自动配置和 Starter 的关系和区别?


一、自动配置

Springboot实现自动配置的核心机制

1)自动配置是通过 @EnableAutoConfiguration 注解实现的。

这个注解位于@SpringBootApplication 中。换句话说,@SpringBootApplication实际上包含了@EnableAutoConfiguration,从而启用了自动配置功能。

通过 @import 注解导入 AtuoConfigurationlmportSelector 类, 会通过扫描类路径中的依赖,根据应用的上下文自动加载配置类,并为应用自动注入合适的Bean。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};
}

2)spring.factories 文件

Spring Boot 的自动配置依赖于META-INF/Spring.factories 文件(文件里定义了所有的自动配置类)。

springboot启动时,它会根据 spring.factories 文件中指定的配置类加载相应的自动配置。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

3)条件注解(Conditional)

自动配置类通常使用@Conditionalonclass、@@ConditionalonMissingBean、@ConditionalonProperty等条件注解。

它们控制自动配置的加载条件,例如,仅在类路径中存在某个类时才加载某些配置。

@Configuration
@ConditionalOnClass(DataSource.class)  // 只有类路径中存在 DataSource 时才生效
public class DataSourceAutoConfiguration {@Bean@ConditionalOnMissingBean  // 如果没有自定义 DataSource,则使用默认配置public DataSource dataSource() {return new HikariDataSource();}
}

@Conditional的作用是什么?

作用于有条件地装配Bean。可以根据特定的条件来决定某个Bean是否应该被加载到 Spring 容器中。

主要作用:

  • 有条件地加载 Bean:@Conditional 根据某个条件来决定某个 Bean 是否需要注入到 Spring 容器中。条件可以是操作系统类型、类路径是否存在某个类、某个属性的值等。
  • 实现动态配置:可以根据环境(如开发、测试、生产)或特定上下文条件动态装配Bean,避免不必要的Bean被加载。

使用场景:

  • 在不同的操作系统或环境中注入不同的Bean。
  • 根据应用程序的配置文件、属性值来动态启用某些功能。
  • 在条件满足时,才装配某些依赖或服务。

如何自定义自动配置?

步骤

1)创建自动配置类

自定义自动配置类需要标注@Configuration注解,同时可以使用各种条件注解控制配置的加载。

@Configuration
@ConditionalOnClass(MyCustomService.class)
public class MyCustomAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyCustomService myCustomService() {return new MyCustomService();}
}

2)配置spring.factories文件

创建 META-INF/spring.factories 文件,并将自定义的自动配置类注册到EnableAutoConfiguration 中。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.config.MyCustomAutoConfiguration

3)打包并发布

自定义的自动配置类可以随应用一起打包,也可以打包成库供其他应用使用。当这个库被引入到其他Spring Boot应用时,自动配置就会生效。

例子分析

这段代码是用于Spring Boot框架的自动配置类。下面是对代码的具体分析:

@Configuration注解:是一个Spring框架的注解,表示该类是一个配置类,其中包含了一个或多个@Bean定义的方法。这些方法返回的对象会被注册为Spring容器中的bean。

@ConditionalOnClass(MyCustomService.class)条件注解:表示只有当类路径下存在MyCustomService类时,这个配置类才会被加载。这是一种常见的用于控制配置是否生效的手段。

@Bean注解:表明这个方法将返回一个对象,该对象会被注册到Spring IoC容器中作为bean。

@ConditionalOnMissingBean注解:表示只有在Spring容器中不存在相同类型的bean时,这个方法才会创建并注册新的bean。这可以避免在已有配置的情况下重复创建相同的bean。

定义一个MyCustomAutoConfiguration的公共类,通过@Configuration注解表示该类是一个自动配置类。通过@ConditionalOnClass(MyCustomService.class)条件注解,设置当该配置类路径下存在MyCustomService类时,该配置类才会被加载。

然后,@Bean和@ConditionalOnMissingBean这两个注解共同作用于myCustomService()方法上。只有在Spring容器中不存在相同类型的bean时,这个方法才会创建并注册新的bean。return new MyCustomService();表示返回一个新的MyCustomService实例,并将其注入到Spring容器中。

在/spring.factories 文件中,org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.config.MyCustomAutoConfiguration这行代码是Spring Boot自动配置的一部分,它告诉Spring Boot在启动过程中自动加载 MyCustomAutoConfiguration 配置类。

总结来说,这段代码定义了一个自动配置类,用于在满足特定条件时(即存在MyCustomService类且当前容器中没有同类型bean时),自动创建并注册一个MyCustomService bean到Spring容器中。这种方式简化了开发者的工作,使得应用可以根据项目实际情况自动调整。

自动配置的优先级

Spring Boot 提供了控制自动配置顺序的机制:可以通过@AutoConfigureBefore 和@AutoConfigureAfter注解,来指定自动配置类的加载顺序。

  • @AutoConfigureBefore:让当前配置类在指定的配置类之前加载。
  • @AutoConfigureAfter:让当前配置类在指定的配置类之后加载。
@Configuration
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class MyDataSourceAutoConfiguration {// 自定义的数据源配置
}

这段代码定义了一个自定义的自动配置类MyDataSourceAutoConfiguration,用于在Spring Boot应用程序中进行数据源配置。下面是详细的分析:

首先,通过@Configuration注解表明这是一个配置类,意味着这个类包含了使用@Bean注解的方法,这些方法会生成Spring管理的bean。

然后,@AutoConfigureBefore(DataSourceAutoConfiguration.class)注解指定了此配置类应该在DataSourceAutoConfiguration之前被处理。其中, DataSourceAutoConfiguration是Spring Boot提供的一个自动配置类,用于配置数据源。通过这种方式,就可以确保这个自定义数据源配置优先于Spring Boot默认的数据源配置。

然后,就可以在类里自定义的数据源配置,代码中没有写具体的配置内容。

如何禁用特定的自动配置?

在某些情况下,SpringBoot的默认自动配置可能与业务需求不符,可以通过以下方式禁用不需要的自动配置类。

1)在 application.properties 中禁用

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

spring.autoconfigure.exclude是一个配置属性,可以在application.propertiesapplication.yml文件中设置,用来排除指定的自动配置类。

2)使用@SpringBootApplication注解的exclude属性

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})注解组合了@Configuration、@EnableAutoConfiguration和@ComponentScan。

注解里的exclude属性用于明确地排除指定的自动配置类,DataSourceAutoConfiguration就是被排除的配置类。

二、starter

如何理解Spring Boot中的starter?

starter就是一组依赖的集合,引l入一个starter就相当于引入了这一组依赖,简化依赖管理。

比如:spring-boot-starter-web 包含了json、tomcat、spring-webmvc等多个依赖。

<dependencies><!-- 使用 starter 管理依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 使用 starter 进行数据访问 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
</dependencies>

spring-boot-starter-web这个依赖项包含了Web应用开发所需的所有依赖,包括Spring MVC、嵌入式Tomcat服务器、JSON支持等。它简化了Web应用的依赖管理,开发者只需添加这一行依赖即可拥有完整的Web开发环境。

spring-boot-starter-data-jpa这个依赖项包含了JPA(Java Persistence API)相关的所有依赖,包括Spring Data JPA、Hibernate、数据库驱动等。它简化了数据访问层的依赖管理,开发者只需添加这一行依赖即可拥有完整的JPA支持。

如何自定义starter?

1)创建自动配置类:选择将哪些对象(比如连接客户端)注入到Spring容器中。

@Configuration
public class JedisAutoConfiguration {@Beanpublic MyService myService(JedisProperties properties) {return new Jedis(properties);}
}

2)创建属性类:加载使用者自定义的属性进来(username、password)。

@ConfigurationProperties("jedis")
public class JedisProperties {private String username;private String password;
}

3)创建spring.factories文件:即使用者的Spring容器初始化时,会将我们的自动配置类加载进去。

在resources/META-INF目录下创建spring.factories文件,内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.JedisAutoConfiguration

4)引入我们自定义的starter依赖。

三、自动配置和 Starter 的关系和区别?

Spring Boot 的自动配置和 Starter 之间有密切的关系,但它们的功能和用途有所不同。下面详细介绍这两者之间的关系和区别。

1)定义

自动配置是 Spring Boot 的核心特性之一,它根据类路径上的依赖和配置属性自动配置应用。自动配置的目标是尽可能减少开发者的手动配置工作。

而Starter 是一组依赖管理工具,简化了 Spring Boot 应用程序的依赖管理。Starter 提供了一组相关的依赖项,使开发者更容易地引入和管理所需的库。

2)关系

依赖关系:自动配置依赖于 starter 来引入所需的依赖项。例如,spring-boot-starter-data-jpa 包含了 JPA 相关的依赖,而自动配置则利用这些依赖来配置 JPA 相关的组件。

互补关系:Starter 提供了依赖管理,而自动配置则提供了基于这些依赖的自动化配置。

3)区别

目的不同

  • 自动配置的目的是减少手动配置工作,提高开发效率。
  • Starter 的目的是简化依赖管理,减少项目构建文件中的冗余配置。

应用场景不同

  • 自动配置适用于希望快速启动并运行应用的场景,尤其是在没有太多自定义需求的情况下。
  • Starter 适用于希望简化项目依赖管理和版本控制的场景。

总结一下,自动配置是通过条件注解和依赖检测自动配置应用组件。Starter是用来简化依赖管理,提供一组相关的依赖项。两者结合使用,可以显著提高开发效率,减少配置工作量。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

《Python编程实训快速上手》第三天--字典和结构化数据

一、字典 1、字典数据类型介绍 myCat {"size":"fat","color":"gray"} 特征&#xff1a; 字典输入时带上{}字典中每一个值是以键值对形式存在&#xff0c;先写键&#xff0c;再写值 2、字典与列表 列表索引必须是整数&#xff0c;字…

Pinia小菠萝(状态管理器)

Pinia 是一个专为 Vue 3 设计的状态管理库&#xff0c;它借鉴了 Vuex 的一些概念&#xff0c;但更加轻量灵活。下面将详细介绍如何使用 Pinia 状态管理库&#xff1a; 安装 Pinia 使用 npm&#xff1a;在项目目录下运行npm install pinia。使用 yarn&#xff1a;在项目目录下运…

【智能算法应用】哈里斯鹰算法优化二维栅格路径规划问题

摘要 本文研究了基于哈里斯鹰优化算法&#xff08;Harris Hawks Optimization, HHO&#xff09;的二维栅格路径规划方法。HHO算法模拟哈里斯鹰的猎食行为&#xff0c;通过迭代搜索过程找到从起点到终点的最优路径&#xff0c;避开栅格中的障碍物。实验结果表明&#xff0c;HHO…

vue/react做多语言国际化的时候,在语言配置中不同的语言配置不同的字体,动态引入scss里面

如果想直接在vue文件的css里面使用&#xff0c;就可以使用i18n的t函数&#xff0c;注意t外层也有引号&#xff1a; font-size: v-bind("t(style.teamCurModelFontSize)"); 前提是要引入t函数&#xff1a;

优衣库在淘宝平台的全方位竞品分析与店铺表现研究:市场定位与竞争策略透视

优衣库品牌在淘宝平台的全方位竞品与店铺表现分析 一、品牌商品分析 1.商品列表与分类分析&#xff08;数据来源&#xff1a;关键词商品搜索接口&#xff1b;获取时间&#xff1a;2024.08.30&#xff09; 商品类别分布柱状图&#xff1a; 根据关键词商品搜索接口获取到的优衣…

spark新能源汽车推荐系统-计算机设计毕业源码42422

摘要 本论文致力于探讨基于Spark技术的新能源汽车推荐系统新能源汽车分析及可视化内容。系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;利用Python编程语言中的爬虫功能&#xff0c;实现对懂车帝的汽车信息数据的爬取&#xff0c;作为系统的数据来源&#xff0c;并…

Element UI组件Dialog显示闪动问题【解决方案】

在ElementUI中&#xff0c;el-dialog弹窗确实有时会导致页面出现抖动或闪动的问题。这通常是由于弹窗出现时对页面布局的影响&#xff0c;特别是滚动条的出现或消失&#xff0c;导致了页面的重新布局和渲染。以下是一些解决或缓解这一问题的方法&#xff1a; 解决方案 1. 关闭…

SpringBoot技术在企业资产管理中的应用

4系统概要设计 4.1概述 系统设计原则 以技术先进、系统实用、结构合理、产品主流、低成本、低维护量作为基本建设原则&#xff0c;规划系统的整体构架. 先进性&#xff1a; 在产品设计上&#xff0c;整个系统软硬件设备的设计符合高新技术的潮流&#xff0c;媒体数字化、压缩、…

月GMV2000W+,在视频号“开超市”也太赚了吧!

今年的视频号双11&#xff0c;似乎更低调了。 ▲ 图片来源&#xff1a;视频号 从官方的双11专栏来看&#xff0c;今年改叫“微信小店11.11好物节”。 今年618时候&#xff0c;还有专门的带货榜单&#xff0c;并且细分为“今日带货榜单、带货总榜、品牌带货榜、达人带货榜”&…

xlsx.js 读取excel文件

需求&#xff1a;读取一个excel文件。 一、 使用antd的Upload组件的 【customRequest】方法。 互斥。此方法跟【onChange】方法互斥&#xff0c;即&#xff1a;不可同时出现。调用次数不一样。onChange方法会根据文件当前的上传状态从而被调用多次&#xff08;读取中&#xff…

华为云创建ECS前台展示规格类型选项是怎么做到的?

前台展示很多规格可选,怎么做到的?先了解规格其实都是管理员在后台service_OM创建好规格 1.规格 1.1设置自定义标签打通规格和主机组还能体验调度功能 引申:AZ可用分区(为了做容灾) 为什么在界面可以让我√az0.dc0,在填工程参数openstack region信息已写 AZ间存储不能共…

我们来学mysql -- 同时使用 AND 和 OR 查询错误(填坑篇)

AND 和 OR 一同使用问题 现象分析处理扩展 现象 业务上在“锁定”当前零件所在出口国的所有零件时&#xff0c;出现其他国家零件 问题定位 分析 or 切断了操作符之间的连续性&#xff0c;从union角度分析 where k1 Td621 and k1 Vda96 or k3 P00009等同 select * fr…

Python入门:了解 Python 中 globals() 和 types 的用法

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 使用 `globals()` 获取当前作用域信息📝 使用 `types` 模块判断函数类型📝 `globals()` 与 `types` 结合使用📢 综合示例📝 总结⚓️ 相关链接 ⚓️📖 介绍 📖 在 Python 中,动态获取当前作用域…

InsectaIntel 智能昆虫识别平台

项目介绍 InsectaIntel智能昆虫识别平台是一款革命性的软件&#xff0c;它将尖端的计算机视觉和深度学习技术融入昆虫识别领域&#xff0c;为用户提供了一个前所未有的工具。该平台通过集成先进的技术&#xff0c;不仅提高了昆虫识别的准确性&#xff0c;还极大地增强了用户体…

Python数据分析NumPy和pandas(二十六、数据整理--连接、合并和重塑 之三:重塑和透视)

对表格数据的重新排列操作&#xff0c;称为 reshape 或 pivot 。有很多种方法对表格数据进行重塑。 一、使用分层索引进行reshape 分层索引提供了一种在 DataFrame 中重新排列数据的方法。主要有两个函数方法&#xff1a; stack&#xff1a;将数据中的列旋转或透视到行。 u…

新能源行业必会基础知识-----电力现货市场理论篇-----电力现货市场价格机制-----电力市场价格体系

新能源行业必会基础知识-----电力现货市场理论篇-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/143364261 这本书是2023年出版的&#xff0c;是当下了解国内电力市场最好的途径了。还是推荐大家买来这本书进行阅读观看&#xff0c;最好作为随身携带…

使用免费的飞书机器人,实现消息推送实时通知

大家好&#xff0c;我是小悟。 实际工作中&#xff0c;我们会经常遇到需要给用户发送业务通知的功能需求&#xff0c;如果是小程序端&#xff0c;那么就使用小程序提供的模板消息通知&#xff0c;如果是APP端&#xff0c;一般就是使用个推、极光等第三方平台。 当然还有个万能…

SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记

这是一篇港科大学生在google research 实习期间发在ECCV2024的语义引导生成式修复的文章&#xff0c;港科大陈启峰也挂了名字。从首页图看效果确实很惊艳&#xff0c;尤其是第三行能用文本调控修复结果牌上的字。不过看起来更倾向于生成&#xff0c;对原图内容并不是很复原&…

MySQL server 免安装教程

1&#xff0c;下载免安装包-社区版本 https://dev.mysql.com/downloads/file/?id534320 2&#xff0c;解压 放到一电脑某个路径下&#xff0c;整个包 3&#xff0c;创建data 文件夹和my.ini文件 my.ini代码照抄&#xff0c;注意修改路径&#xff0c;与解压后的安装包地址一…

网络基础知识--1

1. 说说HTTP常用的状态码及其含义 1.1日 常 开 发 中 的 这 几 个 状 态 码 的 含 义 2. HTTP 常用的请求方式&#xff0c;区别和用途 思 路 : 这 道 题 主 要 考 察 候 选 人 &#xff0c; 是 否 掌 握 H T T P 请 求 方 式 这 个 基 础 知 识 点 &#xff0c; 我 们 用 …