SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter

这篇具有很好参考价值的文章主要介绍了SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 自动配置流程

  1. 导入starter
  2. 依赖导入autoconfigure
  3. 寻找类路径下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
  4. 启动,加载所有 自动配置类 xxxAutoConfiguration
    1. 给容器中配置功能组件
    2. 组件参数绑定到 属性类中。xxxProperties
    3. 属性类配置文件前缀项绑定
    4. @Contional派生的条件注解进行判断是否组件生效

所有场景自动配置好可以直接使用,修改配置文件,就会修改底层参数,例如:通过修改yaml配置server.port,就可以修改tomcat运行端口,注入SpringBoot配置好的组件可以随时使用。

2. SPI机制

  • Java中的SPI(Service Provider Interface)是一种软件设计模式用于 在应用程序中动态地发现和加载组件 。SPI的思想是,定义一个接口或抽象类,然后通过在classpath中定义实现该接口的类来实现对组件的动态发现和加载。
    SPI的主要目的是解决在应用程序中使用 可插拔组件 的问题。例如,一个应用程序可能需要使用不同的日志框架或数据库连接池,但是这些组件的选择可能取决于运行时的条件。通过使用SPI,应用程序可以在运行时发现并加载适当的组件,而无需在代码中硬编码这些组件的实现类。
    在Java中,SPI的实现方式是通过在META-INF/services目录下创建一个以服务接口全限定名为名字的文件,文件中包含实现该服务接口的类的全限定名。当应用程序启动时,Java的SPI机制会自动扫描classpath中的这些文件,并根据文件中指定的类名来加载实现类。
    通过使用SPI,应用程序可以实现更灵活、可扩展的架构,同时也可以避免硬编码依赖关系和增加代码的可维护性。

在SpringBoot中,文件位置位于:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

场景:抽取聊天机器人场景,它可以打招呼.
效果:任何项目导入此starter都具有打招呼功能,并且问候语中的人名需要可以在配置文件中修改

  1. 创建自定义starter项目,引入spring-boot-starter基础依赖
  2. 编写模块功能,引入模块所有需要的依赖。
  3. 编写xxxAutoConfiguration自动配置类,帮其他项目导入这个模块需要的所有组件
  4. 编写配置文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports指定启动需要加载的自动配置
  5. 其他项目引入即可使用

3. @EnableXxxx 功能开关

自动配置,项目一启动,SPI文件中指定的所有类都会加载。通过@EnableXxxx手动控制哪些功能的开启; 手动导入。都是利用 @Import 把此功能要用的组件导入进去。

4. SpringBoot核心注解

1. @SpringBootApplication

@SpringBootConfiguration

就是: @Configuration ,容器中的组件,配置类。spring ioc启动就会加载创建这个类对象

@EnableAutoConfiguration:开启自动配置

开启自动配置

@AutoConfigurationPackage:扫描主程序包:加载自己的组件

  • 利用 @Import(AutoConfigurationPackages.Registrar.class) 想要给容器中导入组件。
  • 把主程序所在的包的所有组件导入进来。

@Import(AutoConfigurationImportSelector.class):加载所有自动配置类:加载starter导入的组件

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
		List<String> configurations = ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader())
			.getCandidates();
		Assert.notEmpty(configurations,
				"No auto configuration classes found in "
						+ "META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
						+ "are using a custom packaging, make sure that file is correct.");
		return configurations;
	}

扫描SPI文件:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@ComponentScan

组件扫描:排除一些组件(哪些不要)
排除前面已经扫描进来的配置类、和自动配置类。

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

2. 完整启动加载流程

SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter,SpringBoot,spring boot,spring,java

5. 自定义starter

1. 创建robot-boot-starter模块

这个模块作为公有的聊天机器人模块,也就是有很多项目模块都需要引入它

引入依赖

<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>3.0.5</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
        <scope>provided</scope>
    </dependency>
    <!--        导入配置处理器,配置文件自定义的properties配置都会有提示-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

自定义配置有提示。导入以下依赖重启项目,再写配置文件就有提示

@ConfigurationProperties(prefix = "robot", ignoreInvalidFields = true)  //此属性类和配置文件指定前缀绑定
@Component
@Data
public class RobotProperties {
    private String name;
}
<!--        导入配置处理器,配置文件自定义的properties配置都会有提示-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
@Service
public class RobotService {

    @Autowired
    private RobotProperties robotProperties;

    public String hello(){
        return "你好," + robotProperties.getName();
    }
}

2. 创建spring-user模块

引入聊天机器人模块(robot-boot-starter)

<dependency>
    <groupId>org.robot</groupId>
    <artifactId>robot-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
@RequestMapping(value = "/user")
@RestController
public class UserController {

    //这个组件是在robot-boot-starter模块中定义的
    @Autowired
    private RobotController robotController;

    public String robot(){
        return robotController.hello();
    }
}

yml配置

robot:
  name: chatgpt

6. 如何在业务模块中实现公有模块中的组件注册

方式一(指定包扫描)

Spring默认只扫描启动类目录下和子包下边的组件,所以这里要指定扫描robot-boot-starter

@ComponentScan(value = {"org.robot"}) //扫描机器人模块下的组件
@SpringBootApplication
public class UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

方式二(XxxAutoConfiguration)

robot-boot-starter模块写一个RobotAutoConfiguration,给容器中导入这个场景需要的所有组件

@Import({RobotController.class, RobotProperties.class, RobotService.class})
public class RobotAutoConfiguration {
}

spring-user模块中,导入RobotAutoConfiguration.class

@Import(RobotAutoConfiguration.class)
@SpringBootApplication
public class UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

方式三(@EnableXxx)

使用@EnableXxx机制,只要使用这个注解 就会开启这个功能

robot-boot-starter模块自定义@EnableRobot注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
//以上元注解直接找个@EnableXxx类 拷贝进来即可
@Import(RobotAutoConfiguration.class)
public @interface EnableRobot {

}

spring-user模块中启用注解,相当于导入了RobotAutoConfiguration.class中导入的组件

@EnableRobot
@SpringBootApplication
public class UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

别人引入starter需要使用 @EnableRobot开启功能,灵活配置

方式四(完全自动配置)

  • 依赖SpringBoot的SPI机制
  • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中编写好我们自动配置类的全类名即可
  • 项目启动,自动加载我们的自动配置类

robot-boot-starter类路径下新建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里边放入指定要扫描的配置类

org.robot.config.RobotAutoConfiguration

这样只要别的项目引入了robot-boot-starter模块,里边的组件都会自动注入文章来源地址https://www.toymoban.com/news/detail-603360.html

到了这里,关于SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot启动流程及自动配置

    SpringBoot启动流程源码: 1、启动SpringBoot启动类SpringbootdemoApplication中的main方法。 2、调用SpringApplication.run(SpringbootdemoApplication.class, args),该方法是一个静态方法。 3、继续调用SpringApplication内部的run方法 ,且构建了一个SpringApplication对象,应用程序将从指定的主要来源加载Bea

    2024年02月14日
    浏览(42)
  • 【SpringBoot3.0源码】启动流程源码解析 • 上

    SpringBoot启动类:

    2024年02月02日
    浏览(35)
  • SpringBoot3.0新特性:1、spring.factories文件废弃,自动配置包位置变化 2、Spring Native 快速体验 3、jakata api迁移 3、三方库的支持

    有自己写过starter包的友友们一定知道,一定用/META-INF/spring.factories文件定义发现自动配置,但是在springboot 2.7,这个文件就被弃用了,在springboot 3.0 就被彻底移除了。 比如之前定义的/META-INF/spring.factories文件: 而现在 这个/META-INF/spring.factories并不是不存在了,只是在3.0之后 外

    2024年02月10日
    浏览(43)
  • SpringBoot3之配置文件(学习SpringBoot3的配置这一篇足够)

    1.1 SpringBoot3简介 SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用(说明:SpringBoot底层是Spring) ,大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术! SpringBoot的主要目标是: 为所有 Spring 开发提供更快速、可广泛访问的入

    2024年01月18日
    浏览(46)
  • 手写Springboot核心流程

    目录 Springboot启动流程 核心代码 验证效果 创建Spring容器, 扫描并启动 容器选择Tomcat/Jetty 创建DispatchServlet, 与spring容器绑定 将DispatchServlet添加到Tomcat 启动Tomcat 1. 首先, 创建两个module  2. maven依赖 springboot模块依赖 user模块依赖 3. springboot核心配置类  4. Import自动配置类  spi注入

    2024年02月01日
    浏览(36)
  • 高版本springboot3.1配置Eureka客户端问题

    只需要按上面配置好,然后高版本的Eureka,不需要@EnableEurekaClient这个注解了,直接SpringBoot启动,就可以注册到注册中心。 /*********************************************************/ /**  * 开启eureka客户端功能  */ //@EnableEurekaClient /**  * @EnableEurekaClient和@EnableDiscoveryClient都让注册中心能够发

    2024年02月10日
    浏览(35)
  • SpringBoot3中的属性绑定注解和YMAL配置文件、日志

    SpringBoot摒弃XML配置方式,改为 全注解驱动 1. 组件注册 @Configuration 、 @SpringBootConfiguration @Bean 、 @Scope @Controller 、 @Service 、 @Repository 、 @Component @Import @ComponentScan 步骤: 1、@Configuration 编写一个配置类 2、在配置类中,自定义方法给容器中注册组件。配合@Bean 3、或使用@Import

    2024年02月11日
    浏览(53)
  • springboot3整合consul实现服务注册和配置管理快速入门

    服务注册: 配置管理: 注册中心的比较: 在微服务的世界中,服务注册是必不可少的。现在比较流行的也就是Consul和Nacos,Zookeeper没有管理界面,一般不建议使用,而Eureka已经处于停更,并且本身就存在很多bug,一般不建议使用! 我之前写过一篇spring boot整合nacos实现服务注

    2024年04月16日
    浏览(46)
  • SpringBoot核心原理以及工作流程

    1. SpringBoot 概述 SpringBoot 是Spring的一套快速配置脚手架,快速的将一些常用的第三方依赖整合(原理:通过Maven子父工程的方式),简化xml配置,全部采用注解形式,内嵌web应用容器(如:jetty和Tomcat),最终以java应用程序进行执行 2. SpringBoot的启动类入口 2.1 @SpringBootApplicat

    2024年02月01日
    浏览(48)
  • 【Docker】RocketMQ5.1.0的配置部署与基于SpringBoot3.0.5的代码基础配置

    JAVA 17 SpringBoot 3.0.5 CentOS 7.5 Rocket 5.1.0 1.1 查看镜像 1.2 拉取镜像 1.3 查看已拉取镜像 1.4 创建挂载文件夹 1.4.1 创建Broker挂载文件夹 1.4.2 创建NameServer挂载文件夹 1.5 启动容器以复制配置文件 1.5.1 启动NamerServer容器 1.5.2 复制NameServer启动脚本 1.5.3 修改脚本文件 1.5.4 停止并删除Name

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包