前言:今天介绍一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. Cmder安装与使用

    越来越多人使用Cmder代替Windows的cmd(毕竟其界面太Lower了),但是每次用Cmder都要回到安装目录查找之后才能使用,真的很麻烦,有木有可以像Git一样右键就是可以用的方法呢?答案当然 ...

  2. int32 无符号范围 -2147483648~2147483647

    int32 无符号范围 -2147483648~2147483647

  3. python 可变参数示例

    练习1:请使用**kw的方式,把可变的所有参数, # 算一字典的value乘积 def fun(**kw): product =1 for k ,v in kw.items(): if isinsta ...

  4. 什么是激励函数 (Activation Function)

    relu sigmoid tanh 激励函数. 可以创立自己的激励函数解决自己的问题,只要保证这些激励函数是可以微分的. 只有两三层的神经网络,随便使用哪个激励函数都可以. 多层的不能随便选择,涉及梯 ...

  5. P3225 [HNOI2012]矿场搭建 题解

    这道题挺难的,可以加深对割点的理解,还有,排列组合好重要了,分连通块,然后乘法原理(加法原理计数什么的) 传送门   https://www.luogu.org/problem/P3225 省选oi题 ...

  6. 013 CephFS文件系统

    一.Ceph文件系统简介 CephFS提供兼容POSIX的文件系统,将其数据和与那数据作为对象那个存储在Ceph中 CephFS依靠MDS节点来协调RADOS集群的访问 元数据服务器 MDS管理元数据 ...

  7. 软RAID和硬RAID的区别

    要实现RAID可以分为硬件实现和软件实现两种.所谓硬RAID就是指通过硬件实现,同理软件实现就作为软RAID.   硬RAID 就是用专门的RAID控制器将硬盘和电脑连接起来,RAID控制器负责将所有 ...

  8. cocos2dx Vec2

    //SE是坐标重叠部分 // returns true if segment A-B intersects with segment C-D. S->E is the overlap part ...

  9. vux中x-input在安卓手机输入框的删除按钮(@on-click-clear-icon)点击没反应

    首先看你自己的的版本好,如果在2.6.9以上,我是在git上找到的解决办法,记录一下,希望可以帮到有需要的小伙伴. 在项目中找 node_modules > vux > x-input & ...

  10. 侠说java8-行为参数化(开山篇)

    啥是行为参数化 行为参数化的本质是不执行复杂的代码块,让逻辑清晰可用. 相信使用过js的你肯定知道,js是可以传递函数的,而在 java中也有类似的特性,那就是匿名函数. 理解:行为参数化是一种方法, ...