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.mzph.cn/web/58470.shtml

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

相关文章

Json 类型与多值索引 — OceanBase 4.3.2 AP 功能体验

本文来自 2024年OceanBase技术征文大赛——“让技术被看见 | OceanBase 布道师计划”的用户征文。也欢迎更多的技术爱好者参与征文&#xff0c;赢取万元大奖。和我们一起&#xff0c;用文字让代码跳动起来&#xff01; 参与2024年OceanBase技术征文大赛>> MySQL在5.7.8…

ORACLE建表(11G)

BEGIN EXECUTE IMMEDIATE DROP TABLE business CASCADE CONSTRAINTS; EXCEPTION WHEN OTHERS THEN IF SQLCODE ! -942 THEN -- 942 是表不存在的错误码 RAISE; END IF; END; CREATE TABLE business ( uuid VARCHAR2(255) NOT NULL, product VARCHAR2(255) NULL, promotion VARC…

Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 目录 一、Spark on YARN 的优势 &#xff08;一&#…

java后端工程师转行AI大模型岗,工作、自我提升两不误!

随着技术的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已经成为当今科技领域最热门的话题之一。许多开发者开始考虑从传统的软件开发领域&#xff0c;如Java&#xff0c;转向人工智能领域&#xff0c;今天小编和大家一起来探讨Java开发者是否可以转型到人工智能&a…

【系统设计】提升Kafka系统性能:Spring Boot实现Lag感知的生产者与消费者

在分布式系统中&#xff0c;消息队列扮演着至关重要的角色&#xff0c;而Kafka凭借其高吞吐量和低延迟的特性&#xff0c;成为了流数据处理的首选。然而&#xff0c;随着应用规模的扩大&#xff0c;如何有效管理Kafka的offset与lag&#xff0c;确保系统的高可用性和性能稳定&am…

通宵修bug

前两个月的某天凌晨&#xff0c;我司全新的一个营销工具&#xff0c;在全国如期上线。然而整个发布过程并非一帆风顺&#xff0c;在线上环境全量发布后&#xff0c;有同事观测到他所负责模块的监控曲线有异常&#xff01;监控曲线在发布的时刻近乎于直线下跌。 经过初步排查&am…

Rust-宏编程

巴山楚水凄凉地&#xff0c;二十三年弃置身。 怀旧空吟闻笛赋&#xff0c;到乡翻似烂柯人。 沉舟侧畔千帆过&#xff0c;病树前头万木春。 今日听君歌一曲&#xff0c;暂凭杯酒长精神。 ——《酬乐天扬州初逢席上见赠》唐刘禹锡 【哲理】翻覆的船只旁仍有千千万万的帆船经过&a…

leetcode912.排序数组的题解

题目描述&#xff1a; 题目要求在不使用任何内置函数的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))。 笔者使用了快速排序&#xff0c;但是直接使用最原始的快速排序&#xff0c;有些特殊的测试用例会超时。 1&#xff09;如果数组本身基本有序&#xff0c;则使用原始…

TikTok品牌出海:从“流量为王”到“价值为王”

随着市场竞争的加剧&#xff0c;品牌逐渐意识到&#xff0c;仅仅依靠流量已不足以在海外市场立足&#xff0c;必须实现从“流量为王”到“价值为王”的转变。本文Nox聚星将和大家探讨品牌如何与TikTok达人合作&#xff0c;在海外市场中建立长期稳定的品牌形象。 一、品牌出海的…

纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践

1、测试框架选择 hdc&#xff1a;类似 android 系统的 adb 命令&#xff0c;提供设备信息查询&#xff0c;包管理&#xff0c;调试相关的命令ohos.UiTest&#xff1a;鸿蒙 sdk 的一部分&#xff0c;类似 android sdk 里的uiautomator&#xff0c;基于 Accessibility 服务&…

Kafka 可观测性最佳实践

Kafka 概述 Kafka 是由 LinkedIn 开发一个分布式的基于发布订阅模式的消息队列&#xff0c;是一个实时数据处理系统&#xff0c;可以横向扩展。与 RabbitMQ、RockerMQ 等中间件一样拥有几大特点&#xff1a; 异步处理服务解耦流量削峰 监控 Kafka 是非常重要的&#xff0c;因…

《XGBoost算法的原理推导》12-13树的叶子节点权重w和映射关系q 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们重新定义一颗树&#xff0c;包括两个部分&#xff1a; 叶子结点的权重向量 w w w&#xff1b;实例 -> 叶子结点的映射关系 q q q&#xff08;本质是树的…

电商API:开启电商新时代的关键钥匙

一、电商API&#xff1a;定义与发展 电商API&#xff0c;即应用程序编程接口&#xff0c;是连接不同软件系统的桥梁&#xff0c;在电商领域中发挥着至关重要的作用。电商API的发展历程可以追溯到20世纪90年代&#xff0c;当时电子商务刚刚兴起&#xff0c;企业开始意识到通过A…

多client向同一个pushgateway推送指标被覆盖问题

问题: 多个client向同一个pushgateway推送指标&#xff0c;每个client推送的指标名称相同但是lable不同。如下&#xff1a; # TYPE ObjectCount gauge ObjectCount{server_id"server1"} 4 ObjectCount{server_id"server2"} 4 ObjectCount{server_id"…

C++__XCode工程中Debug版本库向Release版本库的切换

Debug和Release版本分别设置编译后&#xff0c;就分别得到了对应的lib库&#xff0c;如下图&#xff1a; 再生成Release后如下图&#xff1a;

梧桐数据库中处理连续日期序列的解决方案

在数据库管理中&#xff0c;处理时间序列数据是一项常见的任务&#xff0c;尤其是在需要识别连续日期序列的场景中。例如&#xff0c;在一个生产环境中&#xff0c;我们可能需要跟踪产品的输出类型&#xff0c;并记录这些输出是否连续。本文将介绍如何在梧桐数据库中实现这一功…

增删改增删改

savePostMapping("/save") public ResponseResult save(RequestBody ChannelDto channelDto){ // 参数判断 if(channelDto null || StringUtils.isBlank(channelDto.getName())){ return ResponseResult.error(AppHttpCodeEnum.PARA…

消费疲软下,家居品牌如何利用营销实现新的突围与增长?

在消费疲软的大环境下&#xff0c;家居品牌面临着前所未有的挑战与机遇。尤其以耐消品为主的家居行业&#xff0c;也受到一定程度影响——有效需求不足导致产能过剩&#xff0c;营销乏力&#xff0c;市场竞争开始变得激烈&#xff0c;不少家居品牌正在面临业绩压力。家居品牌如…

Apache Shiro -配置先后的影响

在Apache Shiro框架中&#xff0c;shiroFilterChainDefinition&#xff08;或filterChainDefinitions&#xff09;的配置顺序确实有影响。以下是具体的影响和原因&#xff1a; URL匹配规则&#xff1a;Shiro在验证URL时&#xff0c;会按照filterChainDefinitions中配置的顺序进…

How to use ffmpeg to convert video format from .webm to .mp4

The .mp4 container format doesn’t support the VP8 codec, which is commonly used in .webm files. MP4 containers typically use the H.264 codec for video and AAC for audio. You’ll need to re-encode the video using the H.264 codec and re-encode the audio us…