如何 自定义starter?

1. 前言

在看这篇文章之前呢,我希望大伙应该了解SpringBoot的自动装配的原理,如果这个不清楚的话,这篇文章或许看起来就有些困难了。

这个SpringBoot的自动装配原理其实很简单,没有什么特别难理解的地方。来回那么回事儿,想想也知道。比如:之前在用spring 的时候,集成一个别的技术,需要配置这个,配置那个的。比如你在这个项目A中要使用Mybatis,所以你需要把其整合到Spring中来,需要“这么”配置,那么在这个项目B中也要集成Mybatis,你的配置是否与项目A中的配置类似(或许只是参数不同)?是不是这些个配置出现重复了?那么SpringBoot的自动装配原理就来了,那么既然基本的配置都这么配置 那干脆我直接给你提供这个配置得了,你直接给我配置里面需要的参数即可了(在application.yml 中配置的就是参数了)。那么在SpringBoot启动的时候,就会去扫描这些个自动配置的类,如果其符合要求,就给他加到spring的容器中使其生效。然后就用起来非常的爽,就给几个参数,就可以整合一个技术。

需要的可以看一下我的SpringBoot自动装配原理的文章: 点击跳转

2. 什么是starter?

那么话说回来,啥是starter 呢?比如我们SpringBoot 需要 web 的话 需要的坐标:

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

整合Mybatis 的话,需要的坐标:

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

整合Jpa 的话,需要的坐标:

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

上面的就是starter,或许也就是看着名字像,那他的具体作用是什么呢?还是没有体现出来。

2.1 下面以SpringDataJpa举例

如果直接使用Spring 整合SpringDataJpa的话,需要如下坐标:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
</dependency>
<!-- hibernate beg -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>${hibernate.version}</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>${hibernate.version}</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.1.Final</version>
</dependency>
<!-- hibernate end -->
.....................
.....................
.....................

然后在做spring Data Jpa 的配置:

<!--配置entityManagerFactory-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!--配置要扫描的包(entity的包)-->
    <property name="packagesToScan" value="com.lzy.pojo"/>
    <!--配置jpa实现的厂家-->
    <property name="persistenceProvider">
        <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
    </property>
    <!--jpa供应商的适配器-->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL"/>
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
            <!--配置是否 自动创建数据库表-->
            <property name="generateDdl" value="false"/>
            <property name="showSql" value="true"/>
        </bean>
    </property>

    <!-- 注入jpa原生的配置 -->
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>

</bean>


<!--sping 整合jpa-->
<jpa:repositories
                  base-package="com.lzy.dao"
                  transaction-manager-ref="transactionManager"
                  entity-manager-factory-ref="entityManagerFactory">
</jpa:repositories>


如果SpringBoot 的话引入坐标的话:

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

application.yml中配置:

spring:
  application:
    name: boot-research
  jpa:
    database: mysql
    show-sql: true
    generate-ddl: false
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
    database-platform: org.hibernate.dialect.MySQLDialect

发现没有,SpringBoot 默认的情况下 我们根本就没有写配置文件。

2.2 说明的问题

从2.1 可以看出, SpringBoot 中Starter的作用:

  • 依赖jar包
  • 提供默认的配置

从2.1 的例子就能看出来, Spring 中整合jpa 是不是写了一堆坐标?而在SpringBoot 中就依赖了一个jpa starter 。那么结果显然是starter 中已经依赖了jpa需要的坐标,我们只需要依赖jpa的starter ,那些特别难记的坐标,就自动引入了。

还有就是,我们在依赖的starter 之后,并没有写配置文件,那么显然在starter中也是提供了默认的配置类,我们只需要配置参数即可。(需要说明的是:jpa的配置类并不是jpa的starter提供的。其他的非spring的技术在写自己的starter的时候,是需要自己提供的,因为spring 肯定没有提供。)

3. 定义自己的 starter

从上面的阐述我们知道了starter 是什么,下面我以自定义Swagger2的starter 为例来定义自己的starter。

3.1 正常的swagger2的整合

3.1.1 pom

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>${swagger.version}</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>${swagger.version}</version>
</dependency>

3.1.2 config


@Configuration
@EnableSwagger2
public class SwaggerConfig {
    
    

    @Bean
    public Docket webApiConfig(){
    
    
        return new Docket(DocumentationType.SWAGGER_2)
            .groupName("groupNamexxx")
            .apiInfo(webApiInfo())
            .select()
            .paths(PathSelectors.any())
            .build();
    }

    private ApiInfo webApiInfo(){
    
    
        return new ApiInfoBuilder()
            .title("xxx")
            .description("xxxx")
            .version("1.0")
            .contact(new Contact("Immort", "http://www.xxx.com", "[email protected]"))
            .build();
    }
}

3.1.3 使用

直接打注解使用即可

3.2 自定义starter

3.2.1 创建项目

在这里插入图片描述

3.2.2 pom

在这里插入图片描述

3.2.3 config

定义porperties类用来存储yml中的配置
在这里插入图片描述

定义默认配置类(其中几个注解的作用可以看我上篇文章,或者查阅相关资料):

在这里插入图片描述

定义spring.factories文件(至于为什么,请看我上篇文章,或者查阅相关资料)

在这里插入图片描述
在这里插入图片描述

additional-spring-configuration-metadata.json文件的编写,这个文件可写可不写,如果写了的话,在我们在填写application.yml 的时候会有相应的提示,至于该文件的书写规范请:点击跳转

在这里插入图片描述

3.2.4 打包

使用maven 打包即可,如果你使用gradle 也是一样的。

3.3 自定义starter 的使用

3.3.1 随便找个其他的项目

在这里插入图片描述

3.3.2 引入我们自定义的starter

在这里插入图片描述

3.3.3 application.yml 中配置

在这里插入图片描述

3.3.4 使用-好好滴

在这里插入图片描述

4. 总结

没有什么好说的。

猜你喜欢

转载自blog.csdn.net/weixin_42041788/article/details/109299122