标签分类
技术文章
当前位置:主页 > 计算机编程 > java > springboot写一个自己的starter源码

springboot写一个自己的starter源码实例详解

  • 发布时间:
  • 作者:码农之家原创
  • 点击:97

springboot写一个自己的starter源码

这篇文章主要知识点是关于springboot,starter,springboot写一个自己的starter源码,SpringBoot封装自己的Starter的实现方法 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Spring Boot+Vue全栈开发实战
  • 类型:Spring大小:196.3 MB格式:PDF出版:清华大学出版社作者:王松
立即下载

springboot的最强大的就是那些xxxAutoconfiguration,但是这些xxxAutoConfiguration又依赖那些starter,只有导入了这些场景启动器(starter),我们很多自动配置类才能有用,并且还会新增一些功能,这次就来一起写个简单的starter,来看看内部到底是什么原理!

脑中大概有个印象:我们要用一个场景(比如web),直接导入下图所示的依赖,但是在jar包里面去看这个,你会发现里面只有一些基本的配置文件,什么类都没有,就能够想到这个一类就类似一个公司前台的作用,通过这个公司前台,能够联系到公司内部。

springboot手写一个自己的starter源码

提前准备:必须要有IDEA模块化创建项目的基本操作,其他的随意。

温馨提醒:对于会用模块的小伙伴,其实这里就是创建一个空项目,里面新建一个maven模块,一个springboot模块,springboot坐标丢到maven的pom里面,再删除一些多余的文件和依赖。

1.创建一个空的项目

  springboot手写一个自己的starter源码

 

然后就会跳出下图这个页面

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

 

上面相当于前台创建好了,下面开始创建真正的东西了,继续创建模块

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

  

两个模块创建好了之后,将这两个模块联系起来(废话,公司前台肯定要有和上级的的通话方式啊)

springboot手写一个自己的starter源码

 

导入依赖之后就是这样的

springboot手写一个自己的starter源码

 

下一步就是在xxxautoconfiguration模块,删除一些没用的东西和依赖,但是一定要保留一个最基本的starter

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

到这里,基本的准备工作已经完成(其实会用模块式的直接能跳到这里来)

记住:xxxstarter是前台,只是起到一个联系作用(所以我们基本不配置这个),没有什么其他功能,但是那个xxxautoconfiguration才是内部有实权的老板

现在我们来做个老板出来,嘿嘿嘿!

下面看我的目录结构

springboot手写一个自己的starter源码

 从头到尾看一下这些类里面有什么

第一个:HelloProperties

springboot手写一个自己的starter源码

第二个:HelloWorld(记住,此时这个类和properties类还没什么关系,必须要让第三方传入properties)

springboot手写一个自己的starter源码

第三个HelloWorldAutoconfiguration

springboot手写一个自己的starter源码

第四个.spring.factories文件

springboot手写一个自己的starter源码

最后一步:把这两个安装到maven本地仓库(记得,先是xxautoconfiguration,然后再starter)

springboot手写一个自己的starter源码

另外一个starter一样的操作

到此为止,一个简单的HelloWorid的starter就做出来了,我们只需要在我们的项目中导入那个starter(也就是前台唯一的作用)的依赖,就可以了,看看我的starter的坐标(还要记住,properties文件配置的@ConfigurationProperties(prefix = "wyq.hello"),这个prefix是可以在我们项目里面配置文件配置属性的哦~~)

springboot手写一个自己的starter源码

 测试:

file------>new------->project,和以前用springboot一样,随便新建一个springboot应用(记住,一定要选择web模块,不然自动配置类作用,因为配置了@ConditionalOnWebApplication),导入上图的依赖

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

springboot手写一个自己的starter源码

随便写个controller测试一下

springboot手写一个自己的starter源码

测试成功

  springboot手写一个自己的starter源码

到此结束,是不是觉得starter也就这样啊,挺好玩的一个东西,而且最重要的是这种设计的模式有点厉害!通过这样的设计,居然能够实现自动配置,果然是学海无涯啊,要不断的学习别人前辈造就出来的成果,站在巨人的肩膀上学习,我们才能走得更远啊!

SpringBoot封装自己的Starter的实现方法

一.说明

我们在使用SpringBoot的时候常常要引入一些Starter,例如spring-boot-starter-web,官方为我们提供了几乎所有的默认配置,很好的降低了使用框架时的复杂度,所以在用xxx-starter的时候,可以不用费心去写一些繁琐的配置文件,即使必要的配置在application.properties或application.yml中配置就可以了,当你实现了一个Starter,可以在不同的项目中复用,非常方便,今天我们来编写自己的Starter以之前的短信业务为例。

Springboot短信业务调用: https://www.jb51.net/article/160092.htm

spring-boot-starter-xxx是官方提供Starter的命名规则,非官方Starter的命名规则官方建议为 xxx-spring-boot-starter

二.搭建项目

建立SpringBoot项目,清除resources下的文件和文件夹

SpringBoot封装自己的Starter的实现方法

Maven依赖如下:

<dependencies>
    <!--封装Starter核心依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.1.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
      <version>2.1.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <version>2.1.3.RELEASE</version>
    </dependency>
    <!-- lombok 插件 -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.6</version>
      <optional>true</optional>
    </dependency>
    <!-- 因为要使用RestTemplate和转换Json,所以引入这两个依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>2.1.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.45</version>
    </dependency>
  </dependencies>

二.编写项目基础类

创建SendSMSDTO传输类,用于参数传递

/**
 * SMSDTO参数类
 * @Author Sans
 * @CreateTime 2019/4/20 
 * @attention
 */
@Data
public class SendSMSDTO {
  /**
   * 模板ID
   */
  private String templateid;
  /**
   * 参数
   */
  private String param;
  /**
   * 手机号
   */
  private String mobile;
  /**
   * 用户穿透ID,可以为空
   */
  private String uid;
}

创建RestTemplateConfig配置类,用于调用短信接口

/**
 * RestTemplateConfig配置
 * @Author Sans
 * @CreateTime 2019/4/20 
 * @attention
 */
@Configuration
public class RestTemplateConfig {
  @Bean
  public RestTemplate restTemplate( ) {
    return new RestTemplate();
  }
}

创建短信接口枚举类,用于存放短信接口API地址

/**
 * 短信请求API枚举
 * @Author Sans
 * @CreateTime 2019/4/20 
 * @attention
 */
@Getter
public enum ENUM_SMSAPI_URL {
  SENDSMS("https://open.ucpaas.com/ol/sms/sendsms"),
  SENDBATCHSMS("https://open.ucpaas.com/ol/sms/sendsms_batch");
  private String url;
  ENUM_SMSAPI_URL(String url) {
    this.url = url;
  }
}

三.编写Starter自动配置类

创建SmsProperties配置属性类,该类主要用于读取yml/properties信息

/**
 * SMS配置属性类
 * @Author Sans
 * @CreateTime 2019/4/20 
 * @attention 使用ConfigurationProperties注解可将配置文件(yml/properties)中指定前缀的配置转为bean
 */
@Data
@ConfigurationProperties(prefix = "sms-config")
public class SmsProperties {
  private String appid;
  private String accountSid;
  private String authToken;
}

创建短信核心服务类

/**
 * 短信核心服务类
 * @Author Sans
 * @CreateTime 2019/4/20 
 * @attention
 */
public class SmsService {

  @Autowired
  private RestTemplate restTemplate;
  private String appid;
  private String accountSid;
  private String authToken;

  /**
   * 初始化
   */
  public SmsService(SmsProperties smsProperties) {
    this.appid = smsProperties.getAppid();
    this.accountSid = smsProperties.getAccountSid();
    this.authToken = smsProperties.getAuthToken();
  }

  /**
   * 单独发送
   */
  public String sendSMS(SendSMSDTO sendSMSDTO){
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("sid", accountSid);
    jsonObject.put("token", authToken);
    jsonObject.put("appid", appid);
    jsonObject.put("templateid", sendSMSDTO.getTemplateid());
    jsonObject.put("param", sendSMSDTO.getParam());
    jsonObject.put("mobile", sendSMSDTO.getMobile());
    if (sendSMSDTO.getUid()!=null){
      jsonObject.put("uid",sendSMSDTO.getUid());
    }else {
      jsonObject.put("uid","");
    }
    String json = JSONObject.toJSONString(jsonObject);
    //使用restTemplate进行访问远程Http服务
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
    HttpEntity<String> httpEntity = new HttpEntity<String>(json, headers);
    String result = restTemplate.postForObject(ENUM_SMSAPI_URL.SENDSMS.getUrl(), httpEntity, String.class);
    return result;
  }

  /**
   * 群体发送
   */
  public String sendBatchSMS(SendSMSDTO sendSMSDTO){
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("sid", accountSid);
    jsonObject.put("token", authToken);
    jsonObject.put("appid", appid);
    jsonObject.put("templateid", sendSMSDTO.getTemplateid());
    jsonObject.put("param", sendSMSDTO.getParam());
    jsonObject.put("mobile", sendSMSDTO.getMobile());
    if (sendSMSDTO.getUid()!=null){
      jsonObject.put("uid",sendSMSDTO.getUid());
    }else {
      jsonObject.put("uid","");
    }
    String json = JSONObject.toJSONString(jsonObject);
    //使用restTemplate进行访问远程Http服务
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
    HttpEntity<String> httpEntity = new HttpEntity<String>(json, headers);
    String result = restTemplate.postForObject(ENUM_SMSAPI_URL.SENDBATCHSMS.getUrl(), httpEntity, String.class);
    return result;
  }
}

创建SmsAutoConfiguration自动配置类,该类主要用于创建核心业务类实例

/**
 * 短信自动配置类
 * @Author Sans
 * @CreateTime 2019/4/20 
 * @attention
 */
@Configuration 
@EnableConfigurationProperties(SmsProperties.class)//使@ConfigurationProperties注解生效
public class SmsAutoConfiguration {
  @Bean
  public SmsService getBean(SmsProperties smsProperties){
    SmsService smsService = new SmsService(smsProperties);
    return smsService;
  }
}

四.创建spring.factories文件

spring.factories该文件用来定义需要自动配置的类,SpringBoot启动时会进行对象的实例化,会通过加载类SpringFactoriesLoader加载该配置文件,将文件中的配置类加载到spring容器

在src/main/resources新建META-INF文件夹,在META-INF文件夹下新建spring.factories文件.配置内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.sms.starter.config.SmsAutoConfiguration

五.打包和测试

使用Maven插件,将项目打包安装到本地仓库

SpringBoot封装自己的Starter的实现方法

新建测试项目,引入我们自己的Starter,Maven依赖如下:

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 添加我们自己的starter-->
    <dependency>
      <groupId>com.sms.starter</groupId>
      <artifactId>sms-spring-boot-starter</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

配置测试项目的application.yml

sms-config:
 account-sid: //这里填写平台获取的ID和KEY
 auth-token:  //这里填写平台获取的ID和KEY
 appid:    //这里填写平台获取的ID和KEY

参数填写自己的手机号和申请的模板以及对应的参数

/**
 * 测试短信DEMO
 * @Author Sans
 * @CreateTime 2019/4/20 
 * @attention
 */
@RestController
@RequestMapping("/sms")
public class TestController {
  @Autowired
  private SmsService smsService;
  /**
   * 短信测试
   * @Attention
   * @Author: Sans
   * @CreateTime: 2019/4/20 
   */
  @RequestMapping(value = "/sendsmsTest",method = RequestMethod.GET)
  public String sendsmsTest(){
    //创建传输类设置参数
    SendSMSDTO sendSMSDTO = new SendSMSDTO();
    sendSMSDTO.setMobile("");   //手机号
    sendSMSDTO.setTemplateid(""); //模板
    sendSMSDTO.setParam("");   //参数
    return smsService.sendSMS(sendSMSDTO);
  }
}

项目源码: https://gitee.com/liselotte/sms-spring-boot-starter

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

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到vue项目中使用md5加密以及、 儿童python编程入门书籍推、 解决axios.interceptors.respon、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:Springboot引用外部配置文件的实例方法

下一篇:javafx五子棋游戏开发过程

展开 +

收起 -

学习笔记
网友NO.219888

SpringBoot封装自己的Starter的实现方法

一.说明 我们在使用SpringBoot的时候常常要引入一些Starter,例如spring-boot-starter-web,官方为我们提供了几乎所有的默认配置,很好的降低了使用框架时的复杂度,所以在用xxx-starter的时候,可以不用费心去写一些繁琐的配置文件,即使必要的配置在application.properties或application.yml中配置就可以了,当你实现了一个Starter,可以在不同的项目中复用,非常方便,今天我们来编写自己的Starter以之前的短信业务为例。 Springboot短信业务调用: https://www.jb51.net/article/160092.htm spring-boot-starter-xxx是官方提供Starter的命名规则,非官方Starter的命名规则官方建议为 xxx-spring-boot-starter 二.搭建项目 建立SpringBoot项目,清除resources下的文件和文件夹 Maven依赖如下: dependencies !--封装Starter核心依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId version2.1.3.RELEASE/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-autoconfigure/artifactId version2.1.3.RELEASE/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-configuration-processor/artifactId version2.1.3.RELEASE/version /dependency !-- lombok 插件 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version1.18.6/version optionaltrue/optional /dependency !-- 因为要使用RestTemplate和转换Json,所以引……

网友NO.218789

spring boot starter actuator(健康监控)配置和使用教程

添加POM依赖: !-- spring-boot-监控--dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId/dependencydependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId/dependency application.yml中指定监控的HTTP端口(如果不指定,则使用和Server相同的端口);指定去掉某项的检查(比如不监控health.mail): server: port: 8083management: port: 8083 security: enabled: false # 监控和管理端点 端点名 描述 autoconfig 所有自动配置信息( positiveMatches :运行的, negativeMatches 未运行组件) auditevents 审计事件 beans 所有Bean的信息 configprops 所有配置属性 dump 线程状态信息 env 当前环境信息 health 应用健康状况 info 当前应用信息 metrics 应用的各项指标 mappings 应用@RequestMapping映射路径 shutdown 关闭当前应用(默认关闭) trace 追踪信息(最新的http请求) heapdump 下载内存快照 http://localhost:8083/info 读取配置文件application.properties的 info.*属性 在InfoProperties 读取 application.properties : info.app.version=v1.2.0info.app.name=abc 在GitProperties 获取git.properties 的信息 info.app.version=v1.2.0info.app.name=abc#远程关闭开启endpoints.shutdown.enabled=true #访问:http://localhost:8083/shutdown 关闭服务 metrics {mem: 573549, //内存大小mem.free: 388198, //内存剩余大小processors: 4, //处理器数量instance.uptime: 3……

网友NO.597653

深入浅析Spring-boot-starter常用依赖模块

Spring-boot的2大优点: 1.基于Spring框架的“约定优先于配置(COC)”理念以及最佳实践之路。 2.针对日常企业应用研发各种场景的Spring-boot-starter自动配置依赖模块,且“开箱即用”(约定spring-boot-starter- 作为命名前缀,都位于org.springframenwork.boot包或者命名空间下)。 应用日志和spring-boot-starter-logging 常见的日志系统大致有:java.util默认提供的日志支持,log4j,log4j2,commons logging,下面的spring-boot-starter-logging也是其中的一种。 maven依赖: dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-logging/artifactId /dependency springBoot将使用logback作为应用日志的框架,程序启动时,由org.springframework.boot.logging-Logging-Application-Lisetener根据情况初始化并使用。 如果要想改变springBoot提供的应用日志设定,可以通过一下原则: 遵循logback的约定,在classpath中使用自己定制的logback.xml配置文件。 在文件系统的任意一个位置提供自己的logback.xml配置文件,然后通过logging.config配置项指向这个配置文件然后引用它,例如在application.properties中指定如下的配置: logging.config=/{some.path.you.defined}/any-logfile-name-I-like.log} 快速web应用开发与spring-boot-starter-web maven依赖: dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency 在当下项目运行……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明