欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot如何实现starter原理详解

程序员文章站 2022-05-30 14:43:24
1、mybatis 自定义配置的分析在我们自定义starter之前我们写了解一下mybatis 是如何实现starter在springboot 引入的依赖如下: ...

1、mybatis 自定义配置的分析

在我们自定义starter之前我们写了解一下mybatis 是如何实现starter

在springboot 引入的依赖如下:

  <dependency>
    <groupid>org.mybatis.spring.boot</groupid>
    <artifactid>mybatis-spring-boot-starter</artifactid>
    <version>2.1.2</version>
  </dependency>

mybatis的maven 依赖,主要涉及到的内容,spring.factories、mybatisautoconfiguration、mybatisproperties

SpringBoot如何实现starter原理详解

我们来看一下 meta-inf/spring.factories文件,这个文件是以map 形式存放的。key是enableautoconfiguration类的全类名,

value是一个mybatisautoconfiguration,这就是当项目启动自动配置的类。

org.springframework.boot.autoconfigure.enableautoconfiguration=\
org.mybatis.spring.boot.autoconfigure.mybatisautoconfiguration

mybatisautoconfiguration

SpringBoot如何实现starter原理详解

@configuration //标示是一个配置类

@conditionalonclass({sqlsessionfactory.class, sqlsessionfactorybean.class}) //表示当sqlsessionfactory,sqlsessionfactorybean存在这个配置类才生效。

@enableconfigurationproperties({mybatisproperties.class}):就是把 mybatisproperties加入到 ioc 容器中。

mybatisproperties

SpringBoot如何实现starter原理详解

对于@configurationproperties注解它的作用就是把全局配置文件中的值绑定到实体类javabean上面(将配置文件中的值与mybatisproperties绑定起来),而@enableconfigurationproperties主要是把以绑定值javabean加入到spring容器中。

分析完这些规则后,我们再来看看mybatis自定义的starter 的项目结构,主要是分为两个项目(一个是空项目(mtbatis-spring-boot-starter),一个是具体的实现自定义配置的项目(mybatis-spring-boot-autoconfigure)),空项目只是引入自定义配置项目的依赖,而实现映入的时候我们只需要映入空项(mtbatis-spring-boot-starter)即可。

到此我们已经分析完mybatis 自定义的starter,下面我们自己来实现一个自定义的starter。

2、自定义starter的实现

项目结构展示:

SpringBoot如何实现starter原理详解

首先我们先定义一个 zfauto-spring-boot-autoconfigure 工程

编写属性类:添加 @configurationproperties注解和前缀 zf.auto。之后我们就可以在 application.properties或application.yml 中 使用 zf.auto=指定参数了,由于篇幅的原因省略setter getter方法,实际是需要的,不然无法注入;

@configurationproperties(prefix = "zf.auto")
public class helloproperties {
  private string prefix;
  private string suffix;
}

编写配置类:加入@configuration注解,@conditionalonwebapplication是web 应用配置类才起作用,以及 @enableconfigurationproperties(helloproperties.class) 注解,将属性注入到 ioc 容器中。

@configuration
@conditionalonwebapplication
@enableconfigurationproperties(helloproperties.class)
public class helloserviceautoconfiguration {
  @autowired
  helloproperties helloproperties;
  @bean
  public helloservice helloservice(){
    helloservice helloservice=new helloservice();
    helloservice.sethelloproperties(helloproperties);
    return helloservice;
  }

}

编写 spring.factories 文件:在resources路径下面创建meta-inf,文件夹,然后创建spring.factories文件

org.springframework.boot.autoconfigure.enableautoconfiguration=\
com.zfauto.starter.helloserviceautoconfiguration

然后我们在创建一个空项目(zfauto-spring-boot-starter),在这个项目中我们引入zfauto-spring-boot-autoconfigure依赖

<dependency>
    <groupid>com.zfauto.starter</groupid>
    <artifactid>zfauto-spring-boot-autoconfigure</artifactid>
    <version>0.0.1-snapshot</version>
</dependency>

helloservice 实现的功能,省略setter,getter的方法(实际需要)

public class helloservice {
  helloproperties helloproperties;
  public string sayhello(string name){
    return helloproperties.getprefix()+ ","+name+","+helloproperties.getsuffix();
  }
}

最后我们 分别将项目打包,由于zfauto-spring-boot-starter是依赖于zfauto-spring-boot-autoconfigure,所以我们先对zfauto-spring-boot-autoconfigure进行打包,然后通过 mvn install 打到本地仓库(如何打包见下图)。

SpringBoot如何实现starter原理详解

到此我们自定义的类实现。那我们来测试一下,这个和我们引入其他的starter一样了。

创建项目zfauto-spring-boot-starter-test ,引入自定义starter的依赖。

 <dependency>
     <groupid>com.zfauto.starter</groupid>
     <artifactid>zfauto-spring-boot-starter</artifactid>
     <version>0.0.1-snapshot</version>
</dependency>

application.properties中的配置如下

zf.auto.prefix=hello

zf.auto.suffix=123

具体的测试类

@restcontroller
public class hellocontroller {
  @autowired
  helloservice helloservice;
  @requestmapping("/sayhello")
  public string sayhello(){
    return helloservice.sayhello("小福子");
  }
}

项目访问路径:http://localhost:8080/sayhello

SpringBoot如何实现starter原理详解

好了 ,本文就说到这里,本文相关案例我已经上传到 码云 ,小伙伴们可以自行下载:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。