SpringBoot—自定义Starter篇

x33g5p2x  于2022-02-14 转载在 Spring  
字(3.9k)|赞(0)|评价(0)|浏览(478)

一、自定义Starter 的思路:

  1. 创建一个Maven工程,创建三个模块
  2. 一个模块为demo-app,一个模块为demo-module,一个模块为demo-module-springboot-starter
  3. demo-module中定义一个MyModule类,其中有一个save方法,两个属性:version,age
  4. demo-module-springboot-starter中定义一个自动配置类ModuleAutoConfiguration,关联一个配置类ModuleConfig,这个配置类通过读取properties配置文件中的属性值(通过配置文件注入值)完成对象的初始化
  5. app模块中引入demo-module-springboot-starter模块,不需要初始化Module,只需要在配置文件(application.properties)中配置属性值,即可初始化Moudle,调用save方法

二、具体实现步骤

通过以下步骤实现自定义starter

1、创建一个Maven工程,创建三个模块

2、环境准备
①、他们都是基于SpringBoot的模块需要在父模块的pom文件中引入如下:

  1. <!--springboot版本2.5.0-->
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.5.0</version>
  6. <relativePath/>
  7. </parent>
  8. <dependencies>
  9. <!--web模块mvc-->
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-web</artifactId>
  13. </dependency>
  14. </dependencies>
  15. <packaging>pom</packaging>

②、demo-module-springboot-starter还需要额外引入demo-module模块和配置文件注入的2个依赖

  1. <!--避免属性文件的一个提示-->
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-configuration-processor</artifactId>
  6. <optional>true</optional>
  7. </dependency>
  8. <!--导入demo-module-->
  9. <dependency>
  10. <groupId>org.example</groupId>
  11. <artifactId>demo-module</artifactId>
  12. <version>1.0-SNAPSHOT</version>
  13. </dependency>
  14. </dependencies>

③、demo-app是我们测试自定义的starter的所以引入我们定义的starter模块即可

  1. <dependency>
  2. <groupId>org.example</groupId>
  3. <artifactId>demo-module-springboot-starter</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. </dependency>

3、 demo-module中定义一个MyModule类

  1. package com.sqx.module;
  2. public class MyModule {
  3. private String version ;
  4. private Integer age ;
  5. public void save(){
  6. System.out.println("my module save ... version:" + version + ",age:" + age);
  7. }
  8. public String getVersion() {
  9. return version;
  10. }
  11. public void setVersion(String version) {
  12. this.version = version;
  13. }
  14. public Integer getAge() {
  15. return age;
  16. }
  17. public void setAge(Integer age) {
  18. this.age = age;
  19. }
  20. }

此时我们的deomo-moudle模块的任务就完成了!

4、demo-module-springboot-starter中定义一个自动配置类ModuleAutoConfiguration

  1. @Configuration
  2. @EnableConfigurationProperties(ModuleConfig.class)
  3. public class ModuleAutoConfiguration {
  4. @Bean
  5. @ConditionalOnProperty(name = {"com.sqx.version" ,"com.sqx.age"})
  6. public MyModule myModule(ModuleConfig moduleConfig){
  7. MyModule myModule = new MyModule();
  8. myModule.setVersion(moduleConfig.getVersion());
  9. myModule.setAge(moduleConfig.getAge());
  10. return myModule ;
  11. }
  12. }

这个自动配置类会加载我们的ModuleConfig ,然后将其作为参数传入初始化MyMoudle的方法中

5、创建一个配置类ModuleConfig

  1. @ConfigurationProperties(prefix = "com.sqx")
  2. public class ModuleConfig {
  3. private String version ;
  4. private Integer age ;
  5. public String getVersion() {
  6. return version;
  7. }
  8. public void setVersion(String version) {
  9. this.version = version;
  10. }
  11. public Integer getAge() {
  12. return age;
  13. }
  14. public void setAge(Integer age) {
  15. this.age = age;
  16. }
  17. }

我们这个配置类会将applicaiton.properties中由com.sqx开头的配置值注入到我们的这个配置类中,此时我们的第四步中,就可以获取到我们的值,然后通过@Conditional注解的判断将自动配置类初始化到我们的Spring容器当中

6、创建一个配置文件Spring.factories,并进行如下配置

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration= com.sqx.bootstarter.ModuleAutoConfiguration

这个配置文件的作用是在我们的SpringBoot项目启动的时候,会扫描这个配置文件,将这个配置文件中的配置类,加载到我们的Spring容器当中,其配置内容就是告诉我们的SpringBoot我们的自动配置类的位置!

7、接下来,就是demo-app的编写,创建一个启动类DemoApp,和一个配置文件application.properties

  • 启动类DemoApp
  1. @SpringBootApplication
  2. public class DemoApp {
  3. public static void main(String[] args) {
  4. SpringApplication.run(DemoApp.class,args) ;
  5. }
  6. }
  • application.properties
  1. com.sqx.version=1.0
  2. com.sqx.age=21

8、此时我们的所有步骤都完成了,我们对整个流程做一个梳理:

1、SpringBoot启动的时候,在@EnableAutoConfiguration的作用下,会去加载META-INF下的spring.factories配置文件
2、扫描上述配置文件,将其中的自动配置类注入到Spring容器当中,并且会去加载自动配置类绑定的配置类,这个配置类会去applicaiton.properties中去找到对应的值并且注入
3、通过@Condition判断自动配置类是否生效,如果生效,会将自动配置类中的@Bean加载到我们的Spring容器当中
4、此时我们在demo-app中就获取到MyModule,然后通过自动装配@Autowired获取到,接着调用其中的save方法

9、启动demo-app,进行测试

以上就是自定义Spring的一个Starter的具体流程 !

相关文章