前言:今天介绍一SpringBoot的Starter,并手写一个自己的Starter,在SpringBoot项目中,有各种的Starter提供给开发者使用,Starter则提供各种API,这样使开发SpringBoot项目变得简单。实际上Starter简单来说就是Spring+SpringMVC开发的。话不多说开始撸代码

1.创建项目

首先在idea中创建SpringBoot项目,并首先创建一个BeautyProperties类,代码代码如下:

package com.mystarter;

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

@ConfigurationProperties(prefix = "beauty")public class BeautyProperties {    private String name;    private Integer age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }}
  • @ConfigurationProperties(prefix = "beauty")注解表示,在resource目录下的application.properties文件中定义的变量的以beauty前缀的变量值映射到这个类中,给这个对象赋值
  • 其中这个XXProperties类,若是由阅读过SpringBoot源码的程序员都知道,在SpringBooot的源码中Starter有各种的XXProperties类与.properties文件相对应
  • 如图所示所有的自动配置相关的都在spring-boot-autoconfigure这个jar包下。其中就列举了两个RabbitProperties、BatchProperties等的配置类
    在这里插入图片描述
  • 点进RabbitProperties这个类中去看,代码如下,只粘贴一部分,这个类中也是使用@ConfigurationProperties注解将配置文件中的值与此类中的属性值相映射,目的就是为了给这些属性赋值
  • 这里留一个问题,大佬们就自己去寻找答案吧?就是那些与这些类相映射的文件在哪里呢?自行百度哈
@ConfigurationProperties(    prefix = "spring.rabbitmq")public class RabbitProperties {    private String host = "localhost";    private int port = 5672;    private String username = "guest";    private String password = "guest";    private final RabbitProperties.Ssl ssl = new RabbitProperties.Ssl();    private String virtualHost;    private String addresses;
  • 然后再创建一个ActionService类,这个类没什么好说的了,代码如下:
package com.mystarter;

public class ActionService {

    private String name;

    private Integer age;

    public String sayHello() {        return "my name is "+ name +",I am "+ age +" years old";    }

    public Integer getAge() {        return age;    }

    public void setAge(Integer age) {        this.age = age;    }

    public String getName() {        return name;    }

    public void setName(String name) {        this.name = name;    }}
  • 最后再创建一个类ActionServiceAutoConfiguration,这个类是重点,代码如下:
  • @Configuration注解表明这是一个配置类
  • @EnableConfigurationProperties(BeautyProperties.class)表明开启@ConfigurationProperties这个注解,使这个注解生效
  • @ConditionalOnClass(ActionService.class)条件判断注解,表明有这个类ActionService,条件才生效,即配置才生效。
  • 通过@Autowired将BeautyProperties 类自动注入IOC容器中
  • @Bean将返回的值注入到容器中
package com.mystarter;

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;

@Configuration@EnableConfigurationProperties(BeautyProperties.class)@ConditionalOnClass(ActionService.class)public class ActionServiceAutoConfiguration {

    @Autowired    BeautyProperties beautyProperties;

    @Bean    ActionService helloService() {        ActionService helloService = new ActionService();        helloService.setName(beautyProperties.getName());        helloService.setAge(beautyProperties.getAge());        return helloService;    }}
  • 然后再resources文件夹下的application.properties文件中,加入如下配置,作为使用这个Starter时候,没有设置相关值的时候作为默认值注入到配置类中
beauty.name=李依依默认beauty.age=18
  • 最后再resources中新建一个META-INF文件夹,然后在新建一个文件spring.factories,这个名字和文件夹的名字不能改,加入配置如下,这个表明指定自动配置的类的全路径,自动配置的时候就找到这个全路径,实例化这个对象到容器中
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.mystarter.ActionServiceAutoConfiguration
  • 最后一步点击install,出现Build Success说明这个Starter已经安装到本地maven仓库中,可以被别人引用

在这里插入图片描述

2.测试Starter

新建一个SpringBoot工程,在application.properties的文件中加入如下配置:

beauty.name=李依依beauty.age=24

在pom文件中引入依赖,如下:

<dependency>    <groupId>com.org.ldc</groupId>    <artifactId>mystarter</artifactId>    <version>1.0-SNAPSHOT</version></dependency>

然后测试,如下代码

package com.org.ldc.mystarter;

import com.mystarter.HelloService;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTestclass TestmystarterApplicationTests {

    @Autowired    HelloService helloService;

    @Test    public void contextLoads() {        System.out.println(helloService.sayHello());    }

}

执行测试,出现如下,说明创建成功

在这里插入图片描述

更多的教程请关注:非科班的科班,路过有空的大佬们点个赞,谢谢大家

最后分享一波java的资源,资源包括java从入门到开发的全套视频,以及java的26个项目,资源比较大,大小大概是290g左右,链接容易失效,获取的方式是关注公众号:非科班的科班,让后回复:java项目即可获得,祝大家学习愉快

手撸一个SpringBoot的Starter,简单易上手的更多相关文章

  1. 手撸一个SpringBoot-Starter

    1. 简介 通过了解SpringBoot的原理后,我们可以手撸一个spring-boot-starter来加深理解. 1.1 什么是starter spring官网解释 starters是一组方便的依 ...

  2. 看了 Spring 官网脚手架真香,也撸一个 SpringBoot DDD 微服务的脚手架!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么我们要去造轮子? 造轮子的核心目的,是为了解决通用共性问题的凝练和复用. 虽然 ...

  3. 手撸一个springsecurity,了解一下security原理

    手撸一个springsecurity,了解一下security原理 转载自:www.javaman.cn 手撸一个springsecurity,了解一下security原理 今天手撸一个简易版本的sp ...

  4. 使用Java Socket手撸一个http服务器

    原文连接:使用Java Socket手撸一个http服务器 作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomc ...

  5. 通过 Netty、ZooKeeper 手撸一个 RPC 服务

    说明 项目链接 微服务框架都包括什么? 如何实现 RPC 远程调用? 开源 RPC 框架 限定语言 跨语言 RPC 框架 本地 Docker 搭建 ZooKeeper 下载镜像 启动容器 查看容器日志 ...

  6. C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架

    C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...

  7. 五分钟,手撸一个Spring容器!

    大家好,我是老三,Spring是我们最常用的开源框架,经过多年发展,Spring已经发展成枝繁叶茂的大树,让我们难以窥其全貌. 这节,我们回归Spring的本质,五分钟手撸一个Spring容器,揭开S ...

  8. Golang:手撸一个支持六种级别的日志库

    Golang标准日志库提供的日志输出方法有Print.Fatal.Panic等,没有常见的Debug.Info.Error等日志级别,用起来不太顺手.这篇文章就来手撸一个自己的日志库,可以记录不同级别 ...

  9. 【手撸一个ORM】MyOrm的使用说明

    [手撸一个ORM]第一步.约定和实体描述 [手撸一个ORM]第二步.封装实体描述和实体属性描述 [手撸一个ORM]第三步.SQL语句构造器和SqlParameter封装 [手撸一个ORM]第四步.Ex ...

随机推荐

  1. 怎么安装GUI

    python安装easygui的过程中,下载的是0.97.安装的时候提示setuptools模块不存在.然后又去安装setuptools等等, 真麻烦.也没有成功.后来又下载了0.96的.才成功.下面 ...

  2. 【软件】Gimp内容识别填充开启工具1.0

    *源文件起初存于Gimp-Registry,后因服务器维护成本问题,Gimp将原服务器中所有文件迁移至GimpGithub *博主只是将原插件中的内容识别填充功能进行打包处理,方便大家一键启用. 下载 ...

  3. Kafka学习笔记4--Kafka消费者的客户端(PHP)开发

    一.准备工作 虽然 Kafka 是用 Java/Scala 语言编写的,但这不妨碍它对多语言的支持.可以在 Kafka 官网的 CLIENTS 查看 Kafka 支持的语言,其中包括 C/C++.Py ...

  4. ES6学习之二

    本文的学习来自技术胖大神的教程:https://jspang.com/ 1扩展运算符和rest运算符 扩展运算符和rest运算符,它们都是…(三个点). 它们有很多相似之处,甚至很多时候不用特意去区分 ...

  5. $[NOIp2017]$ 逛公园 $dp$/记搜

    \(Des\) 给定一个有向图,起点为\(1\),终点为\(n\),求和最短路相差不超过\(k\)的路径数量.有\(0\)边.如果有无数条,则输出\(-1\). \(n\leq 10^5,k\leq ...

  6. JVM性能监测工具——VisualVM

    Java本身自带了有好几个jvm监测工具,其中jconsole和jvisualvm这两个工具具有图形化界面,可以监测到cpu.类.线程.堆等一些参数,而且具有远程监控的能力. 启动:打开cmd命令窗口 ...

  7. day3(if和for)

    if if <条件判断 1>: <执行 1>elif <条件判断 2>: <执行 2>elif <条件判断 3>: <执行 3> ...

  8. Java程序员必备基础:内部类解析

    前言 整理了一下内部类的相关知识,算是比较全,比较基础的,希望大家一起学习进步. 一.什么是内部类? 在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类.内部类本身就是类的一个属性 ...

  9. AcWing 213. 古代猪文 数学知识

    传送门 题目描述: 给定整数n,q,计算 $q^{\sum_{d|n} C_{n}^{d}}$ mod 999911659. 输入格式 输入包括一行,包含两个整数n,q,用一个空格隔开. 输出格式 输 ...

  10. ConcurrentHashMap源码解析 JDK8

    一.简介 上篇文章详细介绍了HashMap的源码及原理,本文趁热打铁继续分析ConcurrentHashMap的原理. 首先在看本文之前,希望对HashMap有一个详细的了解.不然看直接看Concur ...