likes
comments
collection
share

如何自定义Spring Boot Starter以后背后的原理

作者站长头像
站长
· 阅读数 24

1、引言

众所周知,Spring Boot Starter 是一组预先配置好的依赖集合;我们仅仅通过在 pom.xml 文件中导入starter的坐标后,通过一些简单的注解或一些简单的配置后,我们便可以直接使用这个starter的中提供好的功能;

那么,这是为什么呢?

这不就得提到Spring Boot一个很伟大的特性:自动装配;Spring Boot 通过自动装配将它们加载到Spring容器中进行管理;加载到Spring容器后,我们便可以当成对象一样,很方便的使用

请看下面的讲解

2、什么是自动装配

SpringBoot 定义了一套接口规范,这套规范规定:

SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。

对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。

查看下图,这是第三方的starter中信息:

如何自定义Spring Boot Starter以后背后的原理

既然到这里,那么我们就简单提一下自动装配的实现原理 哈哈哈

3、自动装配的实现原理

首先,我们查看我们的启动类,这里是起点:

 @SpringBootApplication
 public class MainApplication {
 ​
     public static void main(String[] args) {
         SpringApplication.run(MainApplication.class, args);
     }
 ​
 }
 ​

主要在 @SpringbootApplication 这个注解,这个注解包含了三个注解:

  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
  • @Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
  • @ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类

这里的核心注解就是@EnableAutoConfiguration,自动装配的原理就是由他实现的

该注解通过@Import注解导入对应的配置选择器

 @Target({ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Inherited
 @AutoConfigurationPackage //作用:将main包下的所欲组件注册到容器中
 @Import({AutoConfigurationImportSelector.class}) //加载自动装配类 xxxAutoconfiguration
 public @interface EnableAutoConfiguration {
     String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
 ​
     Class<?>[] exclude() default {};
 ​
     String[] excludeName() default {};
 }

内部就是读取了项目和该项目一弄的Jar包的classpath路径下的META-INF/spring.factories文件中配置的类的全类名,在这些配置类中所定义的Bean会根据条件注解是指定的条件是否需要将其导入Spring容器中

条件判断会有像ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载类,把这个配置类的所有的Bean放入Spring 容器中使用

差不多就是这样

所以扯回正题

4、自定义Spring Boot Stater的步骤

通过上面我们知道了,Spring Boot 通过自动装配,将starter中的功能类自动注入Spring 容器中,提供给我们使用;

其实我们在做好我们自己的功能类后,主要需要配置META-INF/spring.factories文件,填入配置类的全类名,配置Spring Boot 自动装配 我们就可以实现自定Stater了

META-INF/spring.factories文件示例:

如何自定义Spring Boot Starter以后背后的原理

4.1 创建工程

创建Spring boot项目就可以

如何自定义Spring Boot Starter以后背后的原理

4.2 pom.xml

记得引入基本的Spring boot依赖

也引入你实现功能所需要的第三方的依赖

如何自定义Spring Boot Starter以后背后的原理

例如:

 <dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
     </dependency>
 ​
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-configuration-processor</artifactId>
         <optional>true</optional>
     </dependency>
     <!--hutool-->
     <dependency>
         <groupId>cn.hutool</groupId>
         <artifactId>hutool-all</artifactId>
         <version>5.8.16</version>
     </dependency>
     <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
         <optional>true</optional>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
     </dependency>
 </dependencies>

注意:

 <groupId>com.sgx</groupId>
 <artifactId>gxapi-client-sdk</artifactId>
 <version>0.0.1</version>

这些是导入你的依赖的坐标,这是你创建项目的时候自定义的

4.3 创建你自己的配置类

如何自定义Spring Boot Starter以后背后的原理

如何自定义Spring Boot Starter以后背后的原理

4.4 创建META-INF/spring.factories

如何自定义Spring Boot Starter以后背后的原理

4.5 最后新建工程并引入

引入坐标

如何自定义Spring Boot Starter以后背后的原理

注入对象

如何自定义Spring Boot Starter以后背后的原理

使用对象的方法,成功捏

如何自定义Spring Boot Starter以后背后的原理

希望能帮到大家!!!

转载自:https://juejin.cn/post/7391694596692934706
评论
请登录