SpringBoot自定义Starters

本文介绍如何自定义Spring Boot Starter,包括创建思路、流程及测试方法。涉及自动配置类、配置属性绑定等关键技术。

#如何自定义Starters#

### 1.创建思路 ###
1.这个场景需要用到的依赖是什么?

2.如何编写自动配置,一些注解的功能?

    @Configuration //指定这个类是一个配置类
    @ConditionalOnXXX //在指定条件成立的情况下自动配置类生效
    @AutoConfigureAfter //指定自动配置类的顺序
    @Bean //给容器中添加组件
    @ConfigurationPropertie结合相关xxxProperties类来绑定相关的配置
    @EnableConfigurationProperties //让xxxProperties生效加入到容器中
    自动配置类要能加载
    将需要启动就加载的自动配置类,配置在META‐INF/spring.factories
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
    org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\

3.starter的模式:

* 启动器只是用来做依赖导入
* 自动配置模块用来写代码逻辑
* 启动器依赖自动配置,只需要引入启动器会自动引入自动配置
* 自定义启动器名:启动器名-spring-boot-starter

### 2.创建流程 ###
1.创建一个自动配置项目:zhangbao-spring-boot-starter-autoconfigure,在pom.xml文件中导入以下依赖

    <!‐‐引入spring‐boot‐starter;所有starter的基本配置‐‐>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!-- 使用ConfigurationProperties需要导入的依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>


2.创建一个maven项目:zhangbao-spring-boot-starter,只在pom.xml文件中导入自动配置项目的依赖

    <!-- 引入自动配置模块 -->
    <dependency>
      <groupId>com.zhangbao</groupId>
      <artifactId>zhangbao-spring-boot-starter-autoconfigure</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>

3.编写配置类:HelloProperties

    //data注解是lombok插件的注解用来生成属性的get/set方法
    @Data
    @ConfigurationProperties(prefix = "spring.zhangbao.hello")
    public class HelloProperties {
    
        private String prefix;
        
        private String suffix;
    }

4.编写业务逻辑类

    @Data
    public class HelloService {
    
        private HelloProperties helloProperties;
    
        public String sayHello(String name) {
            return helloProperties.getPrefix() + "-" + name + "-" + helloProperties.getSuffix();
        }
    }

5.编写自动配置类

    @Configuration
    //web环境该配置类才生效
    @ConditionalOnWebApplication
    @EnableConfigurationProperties(HelloProperties.class)
    public class HelloAutoConfigure {
    
        @Autowired
        private HelloProperties helloProperties;
    
        @Bean
        public HelloService helloService() {
            HelloService helloService = new HelloService();
            helloService.setHelloProperties(helloProperties);
            return helloService;
        }
    }

6.将自动配置类配置在META‐INF/spring.factories文件中

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.zhangbao.config.HelloAutoConfigure

7.使用maven install命令先将zhangbao-spring-boot-starter-autoconfigure项目打包到仓库中

8.然后再使用maven install命令将zhangbao-spring-boot-starter项目打包到仓库中(由于该项目依赖zhangbao-spring-boot-starter-autoconfigure项目所以先将zhangbao-spring-boot-starter-autoconfigure项目打包到仓库中)

9.创建spring-boot-custom-test项目用来测试starter是否创建成功,由于步骤5中自动配置类是在web环境中才生效,所以创建的项目需要导入web依赖

10.测试项目导入zhangbao-spring-boot-starter依赖

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

    <!-- 导入zhangbao-spring-boot-starter依赖 -->
    <dependency>
        <groupId>com.zhangbao</groupId>
        <artifactId>zhangbao-spring-boot-starter</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

11.创建测试Controller
    @RestController
    public class HelloController {
    
        //此时注入的就是zhangbao-spring-boot-starter-autoconfigure项目中的HelloService
        @Autowired
        private HelloService helloService;
    
        @GetMapping("/hello")
        public String hello(String name) {
    
            return helloService.sayHello(name);
        }
    }

12.在application.yml配置文件中添加步骤3中HelloProperties配置类的prefix和suffix

    spring:
      zhangbao:
        hello:
          prefix: hello
          suffix: welcome

13.启动spring-boot-custom-test项目,在浏览器中输入localhost:8080/hello?name=zhangbao
正常应该显示:hello-zhangbao-welcome

14.自定义Spring Boot Starter成功

15.详细代码见spring-boot-custom文件夹

<think>好的,我现在需要解决用户提出的Spring Boot自定义starter在其他项目中引用时出现的“程序包不存在”问题。根据用户提供的引用内容,特别是引用[1]和[5],这个问题可能涉及依赖管理或配置错误。首先,我应该回顾自定义starter的正确创建步骤,确保没有遗漏关键配置。 首先,用户提到自定义starter的包名是com.ch.spring_boot_mystarters。程序包不存在通常意味着编译时无法找到该包下的类。可能的原因包括:依赖未正确安装到本地Maven仓库、项目未正确引入依赖、包路径不一致,或者IDE缓存问题。 根据引用[4],标准的Spring Boot starters通常位于spring-boot-starters模块中,且这些模块本身没有代码,而是通过依赖其他模块实现功能。所以,用户的自定义starter应该遵循相同的结构,确保在pom.xml中正确声明了groupId、artifactId和version,并且通过mvn clean install安装到本地仓库。如果本地仓库中没有生成对应的jar包,其他项目自然无法引用。 另外,引用[5]提到删除slf4j后重新下载依赖,类似的问题可能也适用于用户的starter。需要检查本地Maven仓库中是否存在com/ch/spring_boot_mystarters目录,确认版本是否正确。如果使用了快照版本(SNAPSHOT),可能需要-U参数强制更新。 接下来,检查引用项目中的pom.xml是否正确引入了自定义starter的依赖。确保groupId、artifactId和version与自定义starter中的完全一致。例如,是否有拼写错误或者版本不匹配的情况。 此外,IDE的缓存问题也可能导致此类错误。根据引用[1]和[5],使用IDEA时,可能需要执行mvn clean install后,重新导入Maven项目,或者手动刷新依赖。有时候,需要重启IDE并清理缓存(如使用File -> Invalidate Caches)。 还有,自定义starter的结构是否正确?根据引用[2]和[4],starter应该包含自动配置类,并且在META-INF/spring.factories中正确注册。虽然这可能不会导致“程序包不存在”的错误,但结构错误可能导致其他问题。不过当前问题更可能出在依赖管理上。 最后,检查自定义starter的pom.xml是否正确地打包为jar,并且没有将依赖设置为provided,否则引用项目可能缺少必要的传递依赖。 总结可能步骤: 1. 确认自定义starter已正确安装到本地仓库。 2. 检查引用项目的依赖配置是否正确。 3. 清理IDE缓存并重新导入项目。 4. 确保包路径和类名无误。</think>### 解决Spring Boot自定义Starter程序包不存在问题的步骤 #### 1. **确认自定义Starter已正确安装到本地Maven仓库** - 在自定义Starter项目的根目录执行以下命令: ```bash mvn clean install ``` - 检查本地仓库路径(默认在`~/.m2/repository`)中是否生成对应的目录,例如: ```bash ~/.m2/repository/com/ch/spring_boot_mystarters/1.0.0/ ``` - **注意**:如果版本号包含`-SNAPSHOT`,需在引用时添加`<version>1.0.0-SNAPSHOT</version>`,并运行`mvn -U clean install`强制更新快照版本[^1][^5]。 #### 2. **在引用项目中正确配置依赖** - 在目标项目的`pom.xml`中添加依赖声明,确保`groupId`、`artifactId`和`version`与自定义Starter完全一致: ```xml <dependency> <groupId>com.ch</groupId> <artifactId>spring_boot_mystarters</artifactId> <version>1.0.0</version> </dependency> ``` #### 3. **清理IDE缓存并重新加载项目** - **IntelliJ IDEA操作**: 1. 点击菜单栏 **File → Invalidate Caches / Restart**,选择清理缓存并重启。 2. 右键点击Maven面板中的项目,选择 **Reimport**。 - **Eclipse操作**: 1. 右键项目 → **Maven → Update Project**。 2. 勾选 **Force Update of Snapshots/Releases**。 #### 4. **验证Starter代码结构和包路径** - 确认自定义Starter的包路径为`com.ch.spring_boot_mystarters`,且编译后的`target`目录下存在对应结构的类文件。 - 检查是否有编译错误导致未生成`jar`包,例如: ```bash # 编译错误示例 [ERROR] /src/main/java/com/ch/spring_boot_mystarters/MyService.java:[5,8] 找不到符号 ``` #### 5. **检查依赖传递性(如使用第三方库)** - 如果自定义Starter依赖了其他库(如`slf4j`),需在Starter的`pom.xml`中声明为`<scope>compile</scope>`(默认),确保依赖能传递给主项目。避免使用`<scope>provided`[^4]。 #### 6. **最终验证** - 在目标项目中执行: ```bash mvn clean compile ``` - 若控制台无报错,且`target/classes`目录下存在来自Starter的类,则问题已解决。 --- ### 相关问题 1. **如何调试Spring Boot Starter的自动配置过程?** - 启用`debug`模式:在`application.properties`中添加`debug=true`,查看自动配置报告[^3]。 2. **自定义Starter如何实现条件化加载?** - 使用`@ConditionalOnClass`或`@ConditionalOnProperty`注解控制Bean的创建[^2][^4]。 3. **如何解决Starter依赖冲突?** - 通过`mvn dependency:tree`分析依赖树,使用`<exclusions>`排除重复依赖[^5]。 --- **引用标识说明** [^1]: 依赖安装问题可能导致程序包未找到 : Starter结构与Spring Boot标准规范相关 : Starter依赖传递性及自动配置机制 : 本地仓库清理与依赖更新方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值