Spring Boot 之自定义starter

没有调查就没有发言权! 做JavaEE开发的小伙伴们肯定听说过“约定大于配置”这样一句话,就是说系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置

spring boot 中也为我们提供了丰富的starter

  • spring-boot-starter-web:快速构建基于Spring MVC的Web项目,使用Tomcat做默认嵌入式容器。
  • spring-boot-starter-data-redis:操作Redis。
  • pring-boot-starter-data-jpa:操作Mysql。
  • spring-boot-starter-activemq:操作Activemq。
  • ……

今天我们就来看下spring boot 自定义starter

spring boot starter的命名规则

规则1:spring 官方开发的组件命名格式:spring-boot-starter-XXX

example:

  • spring-boot-starter-aop
  • spring-boot-starter-cache
  • spring-boot-starter-data-mongodb
  • spring-boot-starter-web

规则2:第三方开发的starter命名格式:XXX-spring-boot-starter

example:

  • mybatis-spring-boot-starter
  • dubbo-spring-boot-starter
  • rocketmq-spring-boot-starter

开发Starter步骤:

  • 创建Starter项目
  • 定义Starter需要的配置(Properties)类
  • 编写自动配置类
  • 编写spring.factories文件加载自动配置类
  • 编写配置提示文件spring-configuration-metadata.json(不是必须的)

一、建立自定义starter

1、创建Starter项目

父pom如下:

记得更新repositories地址

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.jarvan</groupId>
    <artifactId>test-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>test-starter</name>
    <packaging>pom</packaging>


    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <my-starter.version>1.0.0-SNAPSHOT</my-starter.version>
    </properties>

    <modules>
        <module>my-starter</module>
        <module>client-starter</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.jarvan</groupId>
                <artifactId>my-starter</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>



    <repositories>
        <repository>
            <id>nexus</id>
            <url>http://192.168.1.xxx:8081/repository/maven-public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
            </snapshots>
        </repository>
    </repositories>
    <distributionManagement>
        <repository>
            <id>releases</id>
            <name>releases Repository</name>
            <url>http://192.168.1.xxx:8081/repository/maven-releases/</url>
        </repository>

        <snapshotRepository>
            <id>snapshots</id>
            <url>http://192.168.1.xxx:8081/repository/maven-snapshots/</url>
            <uniqueVersion>true</uniqueVersion>
        </snapshotRepository>
    </distributionManagement>

</project>

starter的pom如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>test-starter</artifactId>
        <groupId>com.jarvan</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>my-starter</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </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>
</project>

2、定义starter配置类

package com.jarvan.mystarter.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author zjw
 */
@Data
@Component
@ConfigurationProperties("jarvan.user")
public class UserProperties {
    private String name;
    private Integer age;
}

3、编写自动配置类

package com.jarvan.mystarter.config;

import com.jarvan.mystarter.module.UserClient;
import com.jarvan.mystarter.properties.UserProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

/**
 * @author zjw
 */
@Configuration
@EnableConfigurationProperties(UserProperties.class)
public class UserAutoConfiguration {


    @Bean
       # 如果是多个可以用ConditionalOnProperty来控制哪些放入到spring容器中,一个可以用注解或者spring.factories来控制
    @ConditionalOnProperty(prefix = "jarvan.user", value = "enabled", havingValue = "true")
    public UserClient userClient(UserProperties userProperties) {
        return new UserClient(userProperties);
    }
}

4、编写spring.factories文件加载自动配置类

注意点:因为starter通常是没有启动类的,所以starter的pom中不能有spring-boot-maven-plugin打包配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jarvan.mystarter.config.UserAutoConfiguration

二、使用自定义starter

1、创建starter测试项目并引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.jarvan</groupId>
        <artifactId>test-starter</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <groupId>com.jarvan</groupId>
    <artifactId>client-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>client-starter</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.jarvan</groupId>
            <artifactId>my-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </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>
        <dependency>
            <groupId>com.jarvan</groupId>
            <artifactId>my-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2、注入UserClient

@RestController
public class UserController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/user/name")
    public String getUserName() {
        return userClient.getName();
    }
}

3、写配置文件

jarvan:
  user:
    name: zjw
    age: 25
    enabled: true #starter中默认为true,可以手动指定是否开启

4、启动starter并测试

注意:如果注入显示 Could not autowire. No beans of ‘UserClient’ type found. 在启动类上增加@ComponentScan(basePackages = “com.userClient包路径”)

upload successful

三、注解方式引入

有时我们不想引入了Starter包就自动注入,想让用记来操作是否开启注入,比如常用的@EnableAsync这个注解就是用于开启调用方法异步执行的功能。

如果用注解的方式,那么spring.factories就不需要编写了,下面使用自定义注解来确定是否注入UserClient。

1、增加自定义注解 @EnableUserClient

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({UserAutoConfiguration.class})
public @interface EnableUserClient {
}

2、启动类增加 @EnableUserClient

测试demo整体结构

upload successful

猜你喜欢

转载自blog.csdn.net/Jarvanxy/article/details/132403534
今日推荐