• Spring Boot 自定义starter


    Spring Boot 自定义starter

    Spring Boot 为大多数流程的开源项目提供了stater包,便于开发者做系统集成。同时,Spring Boot 允许开发者根据业务需要自定义stater,以方便在同一个组织中使用。在之前的公司中,自定义的starter由架构师团队开发维护,他们负责研发公司内部公共组件。

    Spring Boot 自动配置机制

    Spring Boot 启动时,在classpath中寻找位于 /META-INF目录下的 spring.factories 文件。Spring Boot Auto Configuration 自动装配机制根据以下几种情况确定是否进行装配

    • @ConditionalOnProperty - 根据属性判断是否进行装配
    • @ConditionalOnClass - 根据类名判断是否进行装配
    • @ConditionalOnBean - 根据bean判断是否进行装配
    • @ConditionalOnResource - 根据资源判断是否进行装配

    以上注解都是 自动装配经常使用的。Spring Boot 自动注解详细介绍请参考

    自定义starter

    根据官网文档描述,自定义Spring Boot starter 需要包含两部分

    • An auto-configure class for our library along with a properties class for custom configuration.

      自定义jar包内部,根据配置属性自动装配的class文件
      
      • 1
    • A starter pom to bring in the dependencies of the library and the autoconfigure project.

      一个引用的starter项目,引入依赖jar包,以及自动装配其他模块
      
      • 1

    首先创建三个模块

    • starter-library - 公共的基础模块
    • hello-spring-boot-starter-configure - 自动装配模块
    • hello-spring-boot-starter - 外部引用模块

    公共基础模块

    在该模块中,定义了几个基础的类

    public class Greeter {
    
        private GreetingConfig greetingConfig;
    
        public Greeter(GreetingConfig greetingConfig) {
            this.greetingConfig = greetingConfig;
        }
    
        public String greet(LocalDateTime localDateTime) {
    
            String name = greetingConfig.getProperty(USER_NAME);
            int hourOfDay = localDateTime.getHour();
    
            if (hourOfDay >= 5 && hourOfDay < 12) {
                return String.format("Hello %s, %s", name, greetingConfig.get(MORNING_MESSAGE));
            } else if (hourOfDay >= 12 && hourOfDay < 17) {
                return String.format("Hello %s, %s", name, greetingConfig.get(AFTERNOON_MESSAGE));
            } else if (hourOfDay >= 17 && hourOfDay < 20) {
                return String.format("Hello %s, %s", name, greetingConfig.get(EVENING_MESSAGE));
            } else {
                return String.format("Hello %s, %s", name, greetingConfig.get(NIGHT_MESSAGE));
            }
        }
    
        public String greet() {
            return greet(LocalDateTime.now());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    public class GreeterConfigParams {
    
        public static final String USER_NAME = "user.name";
        public static final String MORNING_MESSAGE = "morning.message";
        public static final String AFTERNOON_MESSAGE = "afternoon.message";
        public static final String EVENING_MESSAGE = "evening.message";
        public static final String NIGHT_MESSAGE = "night.message";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    public class GreetingConfig extends Properties{
    
        private static final long serialVersionUID = 5662570853707247891L;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    自动装配模块

    pom依赖
    <dependency>
      <groupId>com.andy.spring.boot.custom.startergroupId>
      <artifactId>starter-libraryartifactId>
      <version>1.0-SNAPSHOTversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    自动装配类
    @ConfigurationProperties(prefix = "com.greeter")
    @Data
    @ToString
    public class GreeterProperties {
    
        private String userName;
        private String morningMessage;
        private String afternoonMessage;
        private String eveningMessage;
        private String nightMessage;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    @Configuration
    @ConditionalOnClass(Greeter.class)
    @EnableConfigurationProperties(GreeterProperties.class)
    public class GreeterAutoConfiguration {
    
        @Autowired
        private GreeterProperties greeterProperties;
    
        @Bean
        @ConditionalOnMissingBean
        public GreetingConfig greeterConfig() {
    
            String userName = greeterProperties.getUserName() == null
                    ? System.getProperty("user.name")
                    : greeterProperties.getUserName();
    
            // ..
    
            GreetingConfig greetingConfig = new GreetingConfig();
            greetingConfig.put(USER_NAME, userName);
            // ...
            return greetingConfig;
        }
    
        @Bean
        @ConditionalOnMissingBean
        public Greeter greeter(GreetingConfig greetingConfig) {
            return new Greeter(greetingConfig);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    外部引用模块

    该模块只包含pom文件依赖,没有任何实际的代码

    <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starterartifactId>
                <version>${spring-boot.version}version>
            dependency>
            <dependency>
                <groupId>com.andy.spring.boot.custom.startergroupId>
                <artifactId>hello-spring-boot-starter-configureartifactId>
                <version>${project.version}version>
            dependency>
            <dependency>
                <groupId>com.andy.spring.boot.custom.startergroupId>
                <artifactId>starter-libraryartifactId>
                <version>${project.version}version>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    验证测试

    添加属性

    本地另外创建一个项目,在application.properties文件中增加

    # 自定义 stater 配置
    baeldung.greeter.userName=Baeldung
    baeldung.greeter.afternoonMessage=Woha\ Afternoon
    
    • 1
    • 2
    • 3

    添加依赖

    在pom文件中添加

    <dependency>
    			<groupId>com.andy.spring.boot.custom.startergroupId>
    			<artifactId>hello-spring-boot-starterartifactId>
    			<version>1.0-SNAPSHOTversion>
    		dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注入Bean

    添加依赖后,开发者可以想使用普通bean注入一样,直接使用@Autowired注入bean

    @SpringBootApplication
    public class GreeterSampleApplication implements CommandLineRunner {
    
        @Autowired
        private Greeter greeter;
    
        public static void main(String[] args) {
            SpringApplication.run(GreeterSampleApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception {
            String message = greeter.greet();
            System.out.println(message);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    源码地址

    点击这里

  • 相关阅读:
    Docker 应用架构
    设计模式--开篇
    【C++编程能力提升】
    STM32F103实现激光测距传感器测距WT-VL53L0 L1
    Error message “error:0308010C:digital envelope routines::unsupported“
    【obs】obsqsv11 硬编 及与metartc codec对比
    欧科云链联合FT中文网与香港大学,探寻Web3未来安全合规之路
    判断链表是否成环
    Coinbase Ventures团队亲述CV简史及投资版图
    CSS中常用属性
  • 原文地址:https://blog.csdn.net/u013433591/article/details/128086700