美文网首页
自定义spring-boot的starter

自定义spring-boot的starter

作者: 牙齿不帅 | 来源:发表于2020-06-11 09:12 被阅读0次

spring boot有各种starter的依赖jar包,如:

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
  <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
          <version>2.1.3</version>
   </dependency>

这些starter的依赖是干什么用的呢?是spring集成启动第三方用的,如spring要调用redis那么就要将redis集成到spring工程中,有一点需要说明的是如spring-boot-starter-data-redis是以spring-boot开头的,这表面是spring主动集成的redis,而mybatis-spring-boot-starter以mybatis第三方开头的,是mybatis主动集成的spring,也就是说starter是mybatis编写的。
通过starter包的配置集成,使spring在运行的时候可以很好的调用与其集成的第三方包。
接下来,我们完成自定义的starter:
首先,工程结构如下,之后是每个文件的内容。

image.png
//java\com\cong\application\MySpringBootApplication.java
package com.cong.application;

import com.cong.auto.CongProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String args[]){
        ConfigurableApplicationContext context = SpringApplication.run(MySpringBootApplication.class,args);
        CongPropertiesApp cp =  context.getBean(CongPropertiesApp.class);
        System.out.println(cp.name);
        CongProperties cp2 =  context.getBean(CongProperties.class);
        System.out.println(cp2.name);
    }
}

如果CongPropertiesApp和MySpringBootApplication不在同一个目录是无法配置成功的,就像CongProperties。

//java\com\cong\application\CongPropertiesApp.java
package com.cong.auto;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Configuration //注意必须有这个注解才能加载配置成功
@ConfigurationProperties(prefix = "cong")
@Data
public class CongPropertiesApp{//由于和SpringBootApplication是一个包下,所以才能配置成功
    public String name;
}
//java\com\cong\auto\CongProperties.java
package com.cong.auto;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "cong")
@Data
public class CongProperties {
    public String name;
}
//resources/application.yml
cong:
  name: zhenzhen
//resources/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.cong.auto.CongProperties

CongProperties 需要依靠spring.factories才能配置成功,所以需要在spring.factories添加CongProperties 的路径。通过spring内部的载机制,最终将CongProperties进行实例化和配置文件的加载。

//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.12.RELEASE</version>

    </parent>
    <groupId>cong</groupId>
    <version>1.0-SNAPSHOT</version>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cong-spring-starter</artifactId>

    <dependencies>

<!--spring自动配置依赖的jar包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>

<!--确保能读取到application.yml-->
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
        </dependency>

<!--自动生成setter getter方法的jar,注意:没有getter,settter方法属性是加载不成功的-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.0</version>
            <scope>provided</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <!--<dependency>-->
            <!--<groupId>org.mybatis.spring.boot</groupId>-->
            <!--<artifactId>mybatis-spring-boot-starter</artifactId>-->
            <!--<version>2.1.3</version>-->
        <!--</dependency>-->


    </dependencies>

</project>

以上,pom是我们的spring最少依赖,最终,两个name都会加载成功。

starter的目的,无非就是做一些加载配置和实例化初始化的操作,实例的初始化主要交给spring容器来做。

@Configuration注解的作用即是加载配置,但是@Configuration注解的类必须和SpringBootApplication启动类在同一个包下才能加载成功,但是我们集成各种starter的时候,都是在各自的包下,所以最后我们依赖spring.factories完成了配置。

这样你就可将自己的工程封装成像mybatis-starter这样的依赖,供其他的工程调用了。

相关文章

网友评论

      本文标题:自定义spring-boot的starter

      本文链接:https://www.haomeiwen.com/subject/bcuptktx.html