Java SpringBoot自定义starter详解

当我们使用SpringBoot时,很多时候我们需要在项目中引入许多常用的依赖,这些依赖之间可能会存在依赖关系,我们需要维护它们的版本,非常麻烦。为了解决这个问题,SpringBoot提供了Starter的机制,它可以封装依赖的版本等信息,方便我们统一使用。

在本文中,我将详细介绍Java SpringBoot自定义Starter的过程,让你可以轻松创建自己的Starter。

一、什么是SpringBoot Starter

SpringBoot Starter是用来简化SpringBoot应用的依赖引用的一种方式,通常一个SpringBoot Starter都包含了一组关于某个功能的依赖,如SpringBoot Starter Web是一个提供了常用Web依赖的Starter。

除了依赖管理之外,自定义Starter还可以提供一些自定义的配置,简化业务开发。

二、创建SpringBoot Starter的步骤

1. 创建一个空的Maven工程

在Maven工程中,创建一个空的module,命名为xxx-spring-boot-starter,其中xxx为自定义Starter的名称,比如mybatis

2. 引入相关依赖

在pom.xml中引入以下的依赖:

<dependencies>
    <!-- SpringBoot依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>${springboot.version}</version>
    </dependency>

    <!-- 自定义Starter的依赖,这里以mybatis为例 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.version}</version>
    </dependency>
</dependencies>

在上面的依赖中,spring-boot-autoconfigure是必须要引入的,这个依赖提供了自动配置机制的基本实现。

3. 创建自动配置类

在src/main/java目录下创建一个自动配置类,命名为XxxAutoConfiguration,其中Xxx为自定义Starter的名称,比如Mybatis

@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@EnableConfigurationProperties(MapperProperties.class)
public class MybatisAutoConfiguration {

    private final MapperProperties mapperProperties;

    public MybatisAutoConfiguration(MapperProperties mapperProperties) {
        this.mapperProperties = mapperProperties;
    }

    @Bean
    @ConditionalOnMissingBean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        if (StringUtils.hasText(this.mapperProperties.getConfigLocation())) {
            factory.setConfigLocation(new DefaultResourceLoader().getResource(
                    this.mapperProperties.getConfigLocation()));
        }
        return factory.getObject();
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer configurer = new MapperScannerConfigurer();
        configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        configurer.setBasePackage(this.mapperProperties.getBasePackage());
        return configurer;
    }

}

在上面的配置类中,我们使用了SpringBoot自动配置机制提供的注解:

  • @Configuration:表明这个类是一个配置类。
  • @ConditionalOnClass:表示只有当classpath下存在指定的类时,才会创建这个配置类。
  • @EnableConfigurationProperties:激活@ConfigurationProperties的作用。

4. 创建Starter配置类

在src/main/java目录下,创建一个配置类,命名为XxxProperties,其中Xxx为自定义Starter的名称,比如Mybatis

@ConfigurationProperties(prefix = "mybatis")
public class MybatisProperties {

    private static final String DEFAULT_CONFIG_LOCATION = "classpath:mybatis-config.xml";

    /**
     * Mybatis配置文件的路径,默认为classpath:mybatis-config.xml
     */
    private String configLocation = DEFAULT_CONFIG_LOCATION;

    /**
     * Mybatis映射文件的路径,多个使用逗号分隔
     */
    private String mapperLocations;


    /**
     * Mapper接口所在包,多个使用逗号分隔
     */
    private String basePackage;


    /**
     * Configuration custom.
     */
    private Configuration configuration;
}

这个配置类用来指定自定义Starter的一些配置。其中@ConfigurationProperties注解指定了这个配置类的前缀为mybatis,也就是说在application.yml中如下配置就会映射到这个配置类中:

mybatis:
  config-location: classpath:mybatis-config.xml
  mapper-locations: classpath*:mappers/**/*.xml
  base-package: com.xxx.mapper

5. 创建Starter类

在src/main/java目录下,创建一个Starter类,命名为XxxStarter,其中Xxx为自定义Starter的名称,比如Mybatis

@Configuration
@EnableConfigurationProperties(MybatisProperties.class)
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisStarter {

    @Bean
    public MybatisAutoConfiguration mybatisAutoConfiguration(MybatisProperties mybatisProperties) {
        return new MybatisAutoConfiguration(mybatisProperties);
    }

}

在上面的Starter类中,我们使用了SpringBoot自动配置机制提供的注解:

  • @Configuration:表明这个类是一个配置类。
  • @EnableConfigurationProperties:激活@ConfigurationProperties的作用。
  • @ConditionalOnClass:表示只有当classpath下存在指定的类时,才会创建这个Starter类。
  • @AutoConfigureAfter:表示在某个配置类之后再进行自动配置。

6. 打包并安装

完成以上五个步骤之后,通过mvn clean install 命令将自定义的Starter打包并安装到本地Maven仓库。

三、使用自定义Starter

完成自定义Starter的创建之后,就可以在项目中直接使用了。只需要在项目的pom.xml中引入自定义Starter的依赖即可,在以mybatis为例的项目中,只需在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>com.xxx</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

这里的com.xxx为自定义Starter打包时的groupId。

使用自定义Starter启动的时候,可以在application.yml文件中进行配置:

mybatis:
  config-location: classpath:mybatis-config.xml
  mapper-locations: classpath*:mappers/**/*.xml
  base-package: com.xxx.mapper

四、自定义Starter的示例

1. Mybatis Starter

Mybatis Starter是一个提供了常用Mybatis依赖的Starter,在使用的时候,只需要引入以下依赖,就可以方便的使用Mybatis了:

<dependency>
    <groupId>com.xxx</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

同时,在application.yml文件中可以进行Mybatis的配置:

mybatis:
  config-location: classpath:mybatis-config.xml
  mapper-locations: classpath*:mappers/**/*.xml
  base-package: com.xxx.mapper

2. Redis Starter

Redis Starter是一个提供了常用Redis依赖的Starter,在使用的时候,只需要引入以下依赖,就可以方便的使用Redis了:

<dependency>
    <groupId>com.xxx</groupId>
    <artifactId>redis-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

同时,在application.yml文件中可以进行Redis的配置:

spring:
  redis:
    host: localhost
    port: 6379
    database: 0

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java SpringBoot自定义starter详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java面试题冲刺第五天–基础篇2

    Java面试题冲刺第五天–基础篇2 一、问题1:数组的长度、容量和元素个数有什么区别? 答案 数组的长度(length):数组长度是确定且不可改变的,是数组定义的时候就确定好的,可以通过引用名称加.length获得。 数组的容量:数组容量和数组长度没有什么关系,当数组被初始化后,容量一旦被确定就无法更改。数组容量大小是指JVM为了让数组能够并发访问而在内存…

    Java 2023年5月26日
    00
  • 举例详解用Java实现web分页功能的方法

    我来详细讲解一下“举例详解用Java实现web分页功能的方法”的完整攻略。下面我将按照步骤一一说明,包含两条示例。 1. 在Java Web应用中实现分页 在Java Web应用中实现分页的基本思路是:查询需要分页的数据,然后根据页面大小和当前页码将数据切分成多个子集,最后将某个子集的数据展示在页面上。整个过程可以通过以下步骤实现: 1.1 定义分页查询参数…

    Java 2023年5月20日
    00
  • java -length的三种用法说明

    下面是关于“java -length的三种用法说明”的完整攻略: 1. 用法一:获取数组长度 在Java中,我们可以通过 .length 获取一个数组的长度,但是在一些情况下,使用 java -length 命令同样可以用于获取数组的长度。具体实现如下: java -cp . ClassName -length 其中,ClassName 是你的Java程序中…

    Java 2023年5月27日
    00
  • 01-三层架构之查询数据库数据

    一、后台操作流程 1.创建数据库 CREATE DATABASE wyy_music; USE wyy_music; DROP TABLE IF EXISTS `tb_music`; CREATE TABLE `tb_music` ( `music_id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, — 歌曲I…

    Java 2023年5月8日
    00
  • Struts2 ActionContext 中的数据详解

    下面我将详细讲解一下“Struts2 ActionContext 中的数据详解”的完整攻略。 1. 什么是ActionContext ActionContext 是 Struts2 框架中的一个重要的类,它是一个 Map 对象,用于存储与请求执行过程有关的上下文信息。在 Struts2 中,每个请求都对应着一个请求上下文(ActionContext 对象),…

    Java 2023年5月20日
    00
  • 在java中由类名和方法名字符串实现其调用方式

    在Java中,可以通过类名和方法名字符串来实现对方法的调用。这通常用于在运行时动态执行代码,从而实现更加灵活的程序设计。 以下是实现该过程的完整攻略: 获取类名对应的Class对象 首先需要获取类名对应的Class对象,这可以通过Class.forName()方法来实现,该方法的参数为类的全名字符串,例如: Class<?> clazz = Cl…

    Java 2023年5月27日
    00
  • JavaSpringBoot报错“UnsatisfiedDependencyException”的原因和处理方法

    原因 “UnsatisfiedDependencyException” 错误通常是以下原因引起的: 依赖项未找到:如果您的代码中存在依赖项未找到的问题,则可能会出现此错误。在这种情况下,您需要检查您的代码并确保它们正确。 多个 Bean 匹配:如果您的代码中存在多个 Bean 匹配的问题,则可能会出现此错误。在这种情况下,您需要检查您的代码并确保它们正确。 …

    Java 2023年5月4日
    00
  • java实现超大文件的读写功能

    Java实现超大文件的读写功能攻略 在Java开发中,读写大文件是非常常见的需求。但是在读写超大文件时,会遇到内存溢出或效率低下等问题,因此需要特别注意。 下面是Java实现超大文件的读写功能的攻略: 1. 分片读取和写入 要处理超大文件,一种有效的方法是将文件拆分成若干份,逐个读取或写入,再组合在一起即可完成整个文件的处理。可以使用RandomAccess…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部