springboot 3.x 自定义starter【简洁版】

自定义starter

前提: 了解springboot自动配置原理

简介: springboot启动类上的注解** @SpringBootApplication**含有自动配置关键注解 @EnableAutoConfiguration,这个注解通过反射 引入了 AutoConfigurationImportSelector

​ 该类中getAutoConfigurationEntry方法调用类中另一个方法getCandidateConfigurations,

getCandidateConfigurations会去扫描每个jar包的META-INF/下的配置文件

在spring2.7之前, 配置的文件路径为/META-INF/spring.factories

在spring2.7之后

  • 配置的文件在

  • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

  • 同时兼容/META-INF/spring.factories

spring3.0之后

  • 移除META-INF/spring.factories方式
  • 只支持META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 增加自动配置

这里以springboot3.2.1为例

项目结构:
在这里插入图片描述

自定义Starter第一步:

使用idea创建一个空的springboot项目,命名为:xxx-spring-boot-starter(这是自定义starter的命名规范,当然也可以不遵守)

在这里插入图片描述

第二步:

导入pom依赖

<dependencies>
    <!--项目原本含有依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
	
    <!--需要导入的依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>3.1.0</version>
    </dependency>

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

第三步:

编写一个Properties类----SmsProperties

package com.example;

import org.springframework.boot.context.properties.ConfigurationProperties;

//这里指定前缀,与applocation.properties文件绑定
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

第四步:

编写咱们实际的业务类,也就是想要实现的功能------SmsService

package com.example;

import org.springframework.stereotype.Service;

@Service  //注解要加,交给IOC托管,不然会找不到SmsService类
public class SmsService {
    SmsProperties smsProperties;

    public SmsProperties getSmsProperties() {
        return smsProperties;
    }

    public void setSmsProperties(SmsProperties smsProperties) {
        this.smsProperties = smsProperties;
    }
	
    //业务
    public String say(String content){
        return "SmsProperties{" +
                "username='" + smsProperties.getUsername()+ '\'' +
                ", password='" + smsProperties.getPassword()+ '\'' +
                ", content='" + content +
                '}';
    }
}

第五步:

编写自动配置类------SmsAutoConfiguration

package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

@AutoConfiguration
@ConditionalOnClass(value = SmsService.class)//当SmsService类存在时生效
@EnableConfigurationProperties(SmsProperties.class)//绑定Properties
public class SmsAutoConfiguration {

    @Autowired
    SmsProperties smsProperties;

    @Bean  
    @ConditionalOnMissingBean //如果没有SmsService对象就初始化
    public SmsService smsService(){
        SmsService smsService = new SmsService();
        smsService.setSmsProperties(smsProperties);
        return smsService;
    }
}

第六步:

在reesource文件夹下创建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

SmsAutoConfiguration类写入配置文件

com.example.SmsAutoConfiguration

第七步:

利用IDEA工具导出jar包

在这里插入图片描述

第八步:

导出成功后会提示路径和版本

在这里插入图片描述

第九步:测试

新建一个springboot项目,导入自己编写的 jar包,运行测试

在这里插入图片描述

编写配置文件(如果有)

在这里插入图片描述

测试:

在这里插入图片描述

测试结果:

在这里插入图片描述

到这里自定义一个springboot的starter就结束了

可能出现的问题:

在导入包之后,可能引用不到里面的Service对象,如图:

在这里插入图片描述

解决方法:

修改自定义jar包的项目pom文件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            
            <!--添加以下代码-->
            <configuration>
                <skip>true</skip>
            </configuration>
            
            
        </plugin>
    </plugins>
</build>

参考链接:引入自定义springboot的starter后却找不到相关的类(BOOT-INF文件夹的坑)_引入一个自定义的starter,注入一个对象,报未找到该对象-CSDN博客

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot 的 Starter 是一种约定俗成的依赖包,它能够为开发者提供一种快速集成某一类功能的方式。如果你需要自定义一个 Starter,可以按照以下步骤进行: 1. 定义一个 Maven 项目,项目名称以 `spring-boot-starter-` 开头,例如 `spring-boot-starter-mybatis`。 2. 在项目中定义一个自动配置类,命名方式为 `XxxAutoConfiguration`,例如 `MybatisAutoConfiguration`。 3. 在 `META-INF` 目录下创建一个 `spring.factories` 文件,指定自动配置类: ``` org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.mybatis.autoconfig.MybatisAutoConfiguration ``` 4. 在项目中定义一个 Starter Starter 类,命名方式为 `XxxStarter`,例如 `MybatisStarter`,该类中可以提供一些公共的依赖和配置。 5. 打包发布到 Maven 仓库,供其他项目使用。 使用自定义 Starter 的步骤如下: 1. 在项目中添加依赖,例如: ``` <dependency> <groupId>com.example</groupId> <artifactId>spring-boot-starter-mybatis</artifactId> <version>1.0.0</version> </dependency> ``` 2. 在配置文件中配置相关属性,例如: ``` mybatis.mapper-locations=classpath*:mapper/*.xml mybatis.type-aliases-package=com.example.model ``` 3. 在代码中使用相关组件,例如: ``` @Autowired private SqlSessionTemplate sqlSessionTemplate; ``` 通过自定义 Starter,我们可以将一些常见的依赖和配置进行封装,提供给其他项目使用,大大简化了项目的开发和配置工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值