Springboot之自定义starter


1. 前置知识

在我们自定义starter的时候,先要了解 Springboot自动装配原理
我们可以参照 mybatis-plus-boot-starter源码来实现我们的自定义starter功能。

涉及案例代码:https://gitee.com/StarSea007/spring-boot-demo

2. 什么是starter?

Starter是一种用于简化依赖管理和配置的方式。它是一个预定义的依赖关系集合, 包含了一组常用的依赖和配置,以便于快速启动和构建特定类型的应用程序。

使用Starter可以大大简化项目的依赖管理和配置工作,提供了一种快速启动和构建特定类型应用程序的方式。
例如,Spring Boot提供了spring-boot-starter-web用于快速构建Web应用程序,它包含了常用的Web依赖(如
Spring MVC、Tomcat等)和相关的自动配置。

开发者也可以自定义自己的Starter,将常用的依赖和配置打包为一个Starter,方便在复用和共享。自定义
Starter可以提供一组特定领域的依赖和配置,以满足开发需求。

3. 常用的Condition注解说明

在加载自动配置类的时候,并不是将spring.factories的配置全部加载进来,而是通过@Conditional等注解的判断进行动态加载
@Conditional其实是spring底层注解,意思就是根据不同的条件,来进行自己不同的条件判断,如果满足指定的条件,那么配置类里边的配置才会生效。
常用的Conditional注解:

  • @ConditionalOnClass : classp ath中存在该类时起效
  • @ConditionalOnMissingClass : classpath中不存在该类时起效
  • @ConditionalOnBean : DI容器中存在该类型Bean时起效
  • @ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
  • @ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或 @Primary的只有一个时起效
  • @ConditionalOnExpression : SpEL表达式结果为true时
  • @ConditionalOnProperty : 参数设置或者值一致时起效
  • @ConditionalOnResource : 指定的文件存在时起效
  • @ConditionalOnJndi : 指定的JNDI存在时起效
  • @ConditionalOnJava : 指定的Java版本存在时起效
  • @ConditionalOnWebApplication : Web应用环境下起效
  • @ConditionalOnNotWebApplication : 非Web应用环境下起效

4. starter的命名规范

Spring官方Starter通常命名为 spring-boot-starter-{name}如:spring-boot-starter-web
Spring官方建议非官方Starter命名应遵循 {name}-spring-boot-starter的格式:如 mybatis-spring-boot-starter。

5. 自定义自己的starter流程

5.1 创建starter项目

自定义一个starter,名字是demo-spring-boot-starter。

5.2 添加依赖

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

  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
  </dependency>
</dependencies>

5.3 读取并注入配置信息

@Data
@ConfigurationProperties(prefix = "sea.person")
public class PersonProperties implements Serializable {
    private String name;
    private int age;
}

5.4 自定义业务类

public class PersonService {

    @Autowired
    private PersonProperties personProperties;

    public String sayHello() {
        return "Hello, name is "+ personProperties.getName() + ", age is " + personProperties.getAge();
    }
}

5.5 编写自动配置类,把服务注入到Spring中

@Configuration
@EnableConfigurationProperties(PersonProperties.class)
@ConditionalOnClass(PersonService.class)
public class PersonAutoConfiguration {

    @Bean
    public PersonService personService(){
        return new PersonService();
    }
}

5.6 创建spring.factories文件

在资源目录下,创建文件META-INF\spring.factories,指定自动配置类的路径

org.springframework.beans.autoconfig.EnableAutoConfiguration=\
  com.sea.config.PersonAutoConfiguration

反斜杠表示换行,太长了可以换到下一行。

5.7 把项目打成jar发布maven仓库

直接使用idea的maven功能进行打包

5.8 使用自定义的starter

5.8.1 创建一个springboot项目,导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-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-autoconfigure</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

    <!--自定义Starter工程-->
    <dependency>
        <groupId>com.sea</groupId>
        <artifactId>demo-spring-boot-starter</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

5.8.2 在配置文件进行配置

sea.person.name=张三
sea.person.age=40

5.8.3 测试类

@RestController
public class PersonController {

    @Autowired
    private PersonService personService;

    @GetMapping("/sayHello")
    public String sayHello() {
        return personService.sayHello();
    }
}

image.png


如果有收获! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客
### 如何创建和使用 Spring Boot 自定义 Starter #### 创建自定义 Starter 项目结构 为了构建一个可重用的组件,通常会创建一个新的 Maven 或 Gradle 项目来作为自定义 Starter 的容器。这个项目的 `pom.xml` 文件应该包含必要的依赖项以及打包方式设置为 jar。 对于名为 `test-my-starter` 的 Spring Boot 项目,在其 `pom.xml` 中引入特定于业务逻辑或其他功能模块所需的第三方库或框架支持[^3]: ```xml <dependencies> <!-- 引入其他所需依赖 --> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` #### 编写自动配置类 在自定义 Starter 内部实现自动化配置的关键在于编写带有条件化注解(如 @ConditionalOnClass, @ConditionalOnMissingBean 等)的 Java 类,并将其注册给应用程序上下文以便被发现与应用。这些条件允许开发者控制何时激活某些 Bean 定义或者行为模式[^2]。 假设要开发一个简单的 Hello Service,则可以按照下面的方式设计服务接口及其默认实现形式: ```java package com.example.testmystarter; public interface MyService { String sayHello(); } @Component @ConditionalOnProperty(name = "example.enabled", havingValue = "true", matchIfMissing = true) public class DefaultMyServiceImpl implements MyService { private final Environment environment; public DefaultMyServiceImpl(Environment environment) { this.environment = environment; } @Override public String sayHello() { return "Hello from Test My Starter!"; } } ``` #### 注册自动配置器 为了让 Spring Boot 在启动过程中识别并加载上述编写的自动配置类,还需要通过资源目录下的 `META-INF/spring.factories` 文件声明该类的位置。此文件的内容应当遵循键值对的形式,其中键固定为 org.springframework.boot.autoconfigure.EnableAutoConfiguration[]^4]^: ``` # META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.testmystarter.MyServiceAutoConfiguration ``` 这里假定存在这样一个名为 `MyServiceAutoConfiguration.java` 的类用于管理所有关于 `MyService` 接口实例化的规则。 #### 发布至本地/远程仓库 当完成了以上步骤之后就可以考虑将所制作好的 Starter 打包发布出去供他人引用了。如果是在团队内部共享的话可以直接推送到私有 Nexus/Sonatype Artifactory 上面;而对于开源社区而言则可以选择提交到中央仓库或者其他公共平台上去[^5]。 最后一步就是确保任何想要利用我们新建立起来的功能扩展的人都可以在自己的工程里轻松地添加如下所示的一行 POM 配置即可完成集成工作: ```xml <!-- 将自定义 starter 添加到目标项目的 pom.xml 中 --> <dependency> <groupId>com.example</groupId> <artifactId>test-my-starter</artifactId> <version>${latest.version}</version> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值