如何自定义Spring Boot Starter以后背后的原理
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中信息:
既然到这里,那么我们就简单提一下自动装配的实现原理 哈哈哈
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
文件示例:
4.1 创建工程
创建Spring boot项目就可以
4.2 pom.xml
记得引入基本的Spring boot依赖
也引入你实现功能所需要的第三方的依赖
例如:
<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 创建你自己的配置类
4.4 创建META-INF/spring.factories
4.5 最后新建工程并引入
引入坐标
注入对象
使用对象的方法,成功捏
希望能帮到大家!!!
转载自:https://juejin.cn/post/7391694596692934706