自定义Spring Boot Starter

自定义Spring Boot Starter

目录

  1. 简介
  2. 实施步骤 2.1. 创建项目 spring-boot-jdbc-starter 2.2. 添加启动器相关依赖 2.3. 创建属性配置类 2.4. 创建自动配置类 2.5. 编写自动配置文件 (spring.factories) 2.6. 使用自定义的启动器
  3. 代码实现 3.1. 引入依赖 3.2. 创建属性配置类 3.3. 创建自动配置类 3.4. 编写自动配置属性文件
  4. 使用自定义启动器 4.1. 确定使用的项目和启动器所安装的包 4.2. 在项目的 POM 文件中引入自定义启动器 4.3. 在项目中验证 spring-boot-jdbc-starter
  5. 总结

简介:定义一个连接池启动器,当用户引入了连接池启动依赖之后,项目中就已经自动配置了连接池,通过样例学习如何自定一个Starter。

实施步骤

  1. 穿件启动器项目
  2. 添加启动器相关依赖
  3. 创建属性配置类
  4. 创建自动配置类
  5. 编写自动配置文件(srping.factories)
  6. 使用自定义的启动器

代码实现

创建项目spring-boot-jdbc-starter

引入依赖

xml 复制代码
        <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>2.7.8</version>
        </parent>
        
        <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
          <java.version>1.8</java.version>
        </properties>
        
        <dependencies>
              <!-- 引入spring-boot-starter:所有starter的基本配置 -->
              <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
              </dependency>
              
              <!-- 数据库连接池 -->
              <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.12</version>
              </dependency>
              
              <dependency>
                <groupId>com.mchange</groupId>
                <artifactId>c3p0</artifactId>
                <version>0.9.1.2</version>
              </dependency>
              
              <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional> 
              </dependency>
         </dependencies>

创建属性配置类

typescript 复制代码
package com.practice.autoconfig;


import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

//@Service使用相似,用来做语义的表示
//@Getter和@Setter注解,以便自动生成属性的getter和setter方法。不再需要手动编写这些方法。
//@Component //自动创建DataSourceProperties这个bean然后提供给其他文件@Autowired注入使用
//@EnableConfigurationProperties(value = {DataSourceProperties.class})//代表是会先创建Value等于的class文件 但是用了EnableConfigurationProperties注解,那么被引入的class的@Component注解就不能用了。因为
//因为调用方方会使用@EnableConfigurationProperties这个注解
@ToString
@Getter
@Setter
//需要配置spring-boot-configuration-processor依赖,用于生成metadata,否则会警告。
//@ConfigurationProperties
@ConfigurationProperties(prefix = "spring.jdbc.datasource")//属性由使用启动器的人提供
public class DataSourceProperties {
//采用@ConfigurationProperties注解批量注入属性值,设置属性的前缀即可,属性名称要一致
    private String driveClassName;
    private String url;
    private String username;
    private String password;
}

创建自动配置类

kotlin 复制代码
package com.practice.autoconfig;


import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;
//javax.sql.DataSource 是 Java 标准库中的一个接口,它定义了一组方法,用于获取数据库连接。javax.sql.DataSource 接口通常用于在Java应用程序中管理数据库连接池,以提高数据库连接的性能和可用性。
/**
 * 配置类:用于创建数据源对象
 */

@SpringBootConfiguration //声明配置类,等价于@Configuration
@EnableConfigurationProperties(value = {DataSourceProperties.class})//代表是会先创建Value等于的class文件 但是用了EnableConfigurationProperties注解,那么被引入的class的@Component注解就不能用了。因为
public class DataSourceAutoConfiguration {

    @Autowired
    DataSourceProperties dataSourceProperties;
    /**
     * 声明Bean对象,相当于之前在spring-dao.xml配置文件中声明的数据源对象。
     * 创建Druid数据源Bean
     * @return Druid数据源
     */
    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        // 设置数据库驱动类全限定名
        dataSource.setDriverClassName(dataSourceProperties.getDriveClassName());
        // 设置数据库URL
        dataSource.setUrl(dataSourceProperties.getUrl());
        // 设置数据库用户名
        dataSource.setUsername(dataSourceProperties.getUsername());
        // 设置数据库密码
        dataSource.setPassword(dataSourceProperties.getPassword());
        return dataSource;
    }

}

编写自动配置属性文件

在resources文件下面新建META-INF/spring.factories

ini 复制代码
#Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.practice.autoconfig.DataSourceAutoConfiguration

做完之后注意执行install,安装项目idea->Maven->LIfecycle->install

csharp 复制代码
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-boot-jdbc-starter 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ spring-boot-jdbc-starter ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 0 resource
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ spring-boot-jdbc-starter ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /Users/wujiahao/JAVA/springbootjdbcstarter/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ spring-boot-jdbc-starter ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory /Users/wujiahao/JAVA/springbootjdbcstarter/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ spring-boot-jdbc-starter ---
[INFO] Changes detected - recompiling the module!
[INFO] 
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ spring-boot-jdbc-starter ---
[INFO] 
[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ spring-boot-jdbc-starter ---
[INFO] Building jar: /Users/wujiahao/JAVA/springbootjdbcstarter/target/spring-boot-jdbc-starter-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ spring-boot-jdbc-starter ---
[INFO] Installing /Users/wujiahao/JAVA/springbootjdbcstarter/target/spring-boot-jdbc-starter-1.0-SNAPSHOT.jar to /Users/wujiahao/.m2/repository/com/practice/spring-boot-jdbc-starter/1.0-SNAPSHOT/spring-boot-jdbc-starter-1.0-SNAPSHOT.jar
[INFO] Installing /Users/wujiahao/JAVA/springbootjdbcstarter/pom.xml to /Users/wujiahao/.m2/repository/com/practice/spring-boot-jdbc-starter/1.0-SNAPSHOT/spring-boot-jdbc-starter-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.874 s
[INFO] Finished at: 2023-09-14T21:19:23+08:00
[INFO] Final Memory: 29M/319M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

这里我们可以找到安装到的Maven仓库中已经安装好的starter

/Users/wujiahao/.m2/repository/com/practice/spring-boot-jdbc-starter/1.0-SNAPSHOT/

找到spring-bospring-boot-jdbc-starter-1.0-SNAPSHOT.pom文件

找到

xml 复制代码
    <groupId>com.practice</groupId>
    <artifactId>spring-boot-jdbc-starter</artifactId>
    <version>1.0-SNAPSHOT</version>

使用自定义启动器

  • 确定使用的项目和启动器所安装的包是同一个Maven仓库

  • 在项目的POM文件中引入

    xml 复制代码
    <groupId>com.practice</groupId>
    <artifactId>spring-boot-jdbc-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
  • 在项目中验证spring-boot-jdbc-starter

  • 在 IntelliJ IDEA 中通过 Maven 创建 Spring Boot 项目的步骤如下:

    1. 打开 IntelliJ IDEA: 启动 IntelliJ IDEA 并确保已经安装 Maven 插件。

    2. 创建新项目: 选择 "File" > "New" > "Project..." 或者直接点击 "Create New Project"。

    3. 选择 Maven: 在 "New Project" 窗口中选择 "Maven" 作为项目类型。

    4. 选择 Spring Initializr: 在 "New Project" 窗口中选择 "Spring Initializr" 作为项目模板。

    5. 配置项目: 在接下来的窗口中,填写项目的 Group、Artifact、Name、Description 等信息,然后点击 "Next"。

    6. 选择 Spring Boot 版本和依赖: 在 "Next" 窗口中,选择 Spring Boot 的版本,然后选择你需要的依赖。你可以选择 Web、JPA、Security 等常用依赖,也可以在后续进行添加。

    7. 指定项目存放位置: 在 "Next" 窗口中,指定项目的存放位置,然后点击 "Finish"。

    8. 等待项目创建: IntelliJ IDEA 将会下载依赖、创建项目结构等,稍等片刻直到项目创建完成。

    9. 项目创建完成: 项目创建完成后,你可以在 IntelliJ IDEA 中进行代码编写、运行等操作了。

    10. 再resources下创建application.yml,这是我们在自定义Starter中依赖的配置参数

      yaml 复制代码
      spring:
        jdbc:
          datasource:
            driverClassName: com.mysql.jdbc.Driver
            url: jdbc:mysql://localhost:3306/springboot_01
            username: dev
            password: dev
    11. 编写一个简单的Controller

    kotlin 复制代码
    package com.XXXXXXX.controller;
    
    
    import com.practice.bean.DataSourceProperties;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import javax.sql.DataSource;
    
    @RestController
    public class HelloController {
        @Autowired
        DataSource DataSource;
    
        @RequestMapping("/hello")
        public String sayHello(){
            System.out.println("DATA starter"+DataSource.getClass());
            return "hello spring boot!";
        }
    }

运行应用程序,访问http://localhost:8080/hello应该能看到"Hello, World!"的输出。

这样,你就成功创建并运行了一个简单的Spring Boot应用程序,使用了自定义的Spring Boot Starter来简化配置和依赖管理。

总结

通过自定义 Spring Boot Starter,我们成功地封装了常用功能和配置,为项目开发带来了巨大便利。这种优雅而强大的技术手段,让我们能够专注于业务逻辑的实现,而不必过多关注底层技术细节和繁琐的配置。

自定义 Starter 不仅简化了项目的配置和初始化过程,更提高了代码的复用性和可维护性。通过标准化配置和降低学习成本,我们能够更高效地开展团队协作,加速项目的开发周期,为业务的快速迭代提供了有力支持。

在日益复杂和快速变化的开发环境中,我们应积极探索并应用这样的创新技术,不断优化项目的架构,以适应未来的发展需求。自定义 Spring Boot Starter 是我们实现这一目标的重要一步,它不仅让我们的项目更具竞争力,也使我们的开发体验更加愉悦。

让我们共同享受这种技术带来的便利,共同推动软件开发领域的进步!

相关推荐
暗黑起源喵5 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong9 分钟前
Java反射
java·开发语言·反射
九圣残炎43 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge1 小时前
Netty篇(入门编程)
java·linux·服务器
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航2 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
confiself2 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言