自定义starter的常规组成分析

本文介绍了如何使用SpringBoot框架创建和理解Starter,包括配置依赖、配置类、服务类的编写,以及如何通过`@ConfigurationProperties`和`@EnableConfigurationProperties`注解处理配置信息。此外,还展示了如何通过`@Bean`注册服务类并创建`spring.factories`文件以实现服务的暴露和使用。

springBoot框架通过简化配置的方式实现spring应用的快速搭建;同时可以一定程度上解决包依赖冲突;提升开发效率的同时也减少系统搭建难度。

为了方便理解和自己编写一些starter,就需要熟悉starter的内部结构。

  • 依赖的包
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <!-- 禁止传递依赖 -->
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>
  • 配置类
    不管是官方提供的starter还是自定义的starter,使用的时候都需要在配置文件中进行相关的配置,那么这些配置信息在starter中最终会映射到一个类中,因此我们需要首先定义这个类,需要使用到@ConfigurationProperties注解。其中最重要的一个属性是preffix,该值对应的是我们在配置文件中设置的配置信息的前缀,即需要通过此前缀来进行相关信息的配置,然后类中定义需要配置的属性,则前缀+属性名就是我们需要在使用starter项目配置文件中配置的信息了,本例定义如下:具体有关如何与yml、properties文件如何对应,请自行查看相应资料。
@Data
@ConfigurationProperties(prefix = "payne.mybatis-plus")
public class MybatisPlusProperties {

    private Boolean tenantMode = true;
    private Boolean sqlLog = true;
    private List<String> sqlLogExclude = new ArrayList();
    private Boolean optimizeJoin = false;

    /**
     * 分页最大数
     */
    private Long pageLimit = 500L;

    /**
     * 溢出总页数后是否进行处理
     */
    protected Boolean overflow = false;
}
  • 服务类
    服务类,也就是我们定义这个starter需要注入的bean。也就是最终被调用执行具体功能的类,该类和定义普通类没有任何差别。
public class PayneSqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = new ArrayList();
        methodList.add(new InsertIgnore());
        methodList.add(new Replace());
        methodList.add(new InsertBatchSomeColumn((i) -> {
            return i.getFieldFill() != FieldFill.UPDATE;
        }));
        methodList.addAll(super.getMethodList(mapperClass));
        return Collections.unmodifiableList(methodList);
    }
}
  • 服务注册
    通过bean configuration的方式来注册服务,因为需要使用到用户的配置信息所以需要通过@EnableConfigurationProperties注解来启用配置,并将配置类注入,这里是MyFirstConfigurationProperties,最后最终要的就是通过@Bean注解来注册服务类到容器中,这里就是FirstStarterService,最终代码如下:
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(MybatisPlusProperties.class)
public class MybatisPlusConfiguration implements WebMvcConfigurer {

 @Bean
    @ConditionalOnMissingBean({ISqlInjector.class})
    public ISqlInjector sqlInjector() {
        return new PayneSqlInjector();
    }
 }
  • 暴露服务
    在项目代码的resources目录下创建META-INF/spring.factories文件,并将创建的bean configuration类的全限定名定义在里面,示例这里是com.payne.auto.core.mp.config.MybatisPlusConfiguration,注意每个人不一样,记得更换为自己的。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.payne.auto.core.mp.config.MybatisPlusConfiguration

后续打包后就可以使用了。打包过程这些没有特别需要说明的。

### Spring Boot 项目结构详解 Spring Boot 的项目结构设计旨在提高代码的可读性、可维护性和扩展性。以下是典型的 Spring Boot 项目结构及其组成部分的功能分析: #### 1. **src/main/java** 这是 Java 源码的主要目录,所有的业务逻辑和配置类都放置在此处。按照惯例,该目录下的包名通常以项目的根命名空间开头。例如,在 `com.example.demo` 中,所有控制器、服务层、实体类等都会按功能模块划分到子包中[^3]。 - **Controller**: 负责处理 HTTP 请求并返回响应数据。 - **Service**: 实现核心业务逻辑,调用 DAO 层或其他外部接口完成具体操作。 - **Repository/DAO**: 数据访问对象,用于与数据库交互。 - **Entity/Model**: 定义领域模型或持久化对象。 - **Configuration**: 自定义配置类,替代 XML 文件实现 Bean 注册和其他高级设置。 #### 2. **src/main/resources** 资源文件夹主要用于存储静态文件、模板以及其他非编译型资产。常见的内容包括但不限于以下几项[^4]: - **application.properties/application.yml**: 这是应用程序的核心配置文件,包含了诸如端口号、数据库连接字符串等全局参数。 - **static/**: 存放前端所需的 CSS、JavaScript 和图片等静态资源。 - **templates/**: 如果使用 Thymeleaf 或其他服务器端渲染引擎,则此路径下会保存 HTML 页面模板。 - **banner.txt**: 可选文件,当应用启动时会在控制台打印自定义 ASCII art logo。 #### 3. **src/test/java** 测试源码所在位置,默认情况下 Maven 构建工具会识别这个目录作为单元测试和集成测试的基础路径。推荐采用 JUnit 结合 Mockito 来验证各个层次的行为是否符合预期。 --- ### 各部分功能分析 - **Application Starter Class (入口类)** 位于 src/main/java 下面的一个单独 package 内部,一般命名为 Application.java 或 DemoApplication.java 。此类仅需标注 @SpringBootApplication 即可通过 main 方法触发整个上下文初始化流程[^1]。 ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` - **Bootstrap Configuration** 如果涉及分布式微服务体系架构或者安全敏感信息管理需求的话,那么就需要额外引入 bootstrap.properties/bootstrap.yml ,优先于常规 application.* 加载执行[^4]。 --- ### 总结 合理规划好以上提到的关键节点有助于打造更加稳健高效的现代化软件解决方案。通过分层设计理念配合自动化装配机制极大降低了传统 Spring 开发过程中繁杂的手动干预成本,真正意义上实现了敏捷交付目标[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值