自定义Spring Boot Starter

news2024/11/20 10:41:08

Spring Boot starter

我们知道Spring Boot大大简化了项目初始搭建以及开发过程,而这些都是通过Spring Boot提供的starter来完成的。在实际项目中一些基础模块其本质就是starter,所以我们需要对Spring Boot的starter有一个全面深入的了解,这是我们的必备知识。

starter介绍

spring boot 在配置上相比spring要简单许多, 其核心在于spring-boot-starter, 在使用spring boot来搭建一个项目时, 只需要引入官方提供的starter, 就可以直接使用, 免去了各种配置。starter简单来讲就是引入了一些相关依赖和一些初始化的配置。

Spring官方提供了很多starter,第三方也可以定义starter。为了加以区分,starter从名称上进行了如下规范:

  • Spring官方提供的starter名称为:spring-boot-starter-xxx

    例如Spring官方提供的spring-boot-starter-web

  • 第三方提供的starter名称为:xxx-spring-boot-starter

    例如由mybatis提供的mybatis-spring-boot-starter

starter原理

Spring Boot之所以能够帮我们简化项目的搭建和开发过程,主要是基于它提供的起步依赖和自动配置。

起步依赖

起步依赖,其实就是将具备某种功能的坐标打包到一起,可以简化依赖导入的过程。例如,我们导入spring-boot-starter-web这个starter,则和web开发相关的jar包都一起导入到项目中了。如下图所示:

在这里插入图片描述

自动配置

自动配置,就是无须手动配置xml,自动配置并管理bean,可以简化开发过程。那么Spring Boot是如何完成自动配置的呢?

自动配置涉及到如下几个关键步骤,我们可以将自动配置的关键几步以及相应的注解总结如下:

1、@Configuration与@Bean:基于Java代码的bean配置

2、@Conditional:设置自动配置条件依赖

3、@EnableConfigurationProperties与@ConfigurationProperties:读取配置文件转换为bean

4、@EnableAutoConfiguration与@Import:实现bean发现与加载

关键注解解释

@Configuration和@Bean这两个注解一起使用就可以创建一个基于java代码的配置类,可以用来替代传统的xml配置文件。

@Configuration 注解的类可以看作是能生产让Spring IoC容器管理的Bean实例的工厂。

@Bean 注解的方法返回的对象可以被注册到spring容器中。

@ConfigurationProperties注解,这个注解的作用就是把yml或者properties配置文件中的配置参数信息封装到ConfigurationProperties注解标注的bean的相应属性上。

@EnableConfigurationProperties注解的作用是使@ConfigurationProperties注解生效。

@SpringBootConfiguration:标注这个类是一个配置类; 它只是@Configuration注解的派生注解; 它与@Configuration注解的功能一致; 只不过@SpringBootConfiguration是springboot的注解,而@Configuration是spring的注解。

@ComponentScan:作用就是自动扫描并加载符合条件的组件,最终将这些bean加载到spring容器中

@EnableAutoConfiguration :这个注解很重要,借助@Import的支持,收集和注册依赖包中相关的bean定义

这些注解是spring boot特有的,常见的条件依赖注解有:

注解功能说明
@ConditionalOnBean仅在当前上下文中存在某个bean时,才会实例化这个Bean
@ConditionalOnClass某个class位于类路径上,才会实例化这个Bean
@ConditionalOnExpression当表达式为true的时候,才会实例化这个Bean
@ConditionalOnMissingBean仅在当前上下文中不存在某个bean时,才会实例化这个Bean
@ConditionalOnMissingClass某个class在类路径上不存在的时候,才会实例化这个Bean
@ConditionalOnNotWebApplication不是web应用时才会实例化这个Bean
@AutoConfigureAfter在某个bean完成自动配置后实例化这个bean
@AutoConfigureBefore在某个bean完成自动配置前实例化这个bean

自定义 Starter 起步依赖

假设我们需要开发一个框架,配置需要用户在 properties 文件中自己定义 url 、port、username、password 四个字段,如下所示:

hello: 
  url: 10.38.233.22
  port: 8868
  username: 刘培强
  password: 123456789

这和我们自定义数据库的配置文件类似,当用户使用我们的依赖时只需要导入坐标依赖和配置如上属性即可;

我们参考starter的原理可以分为四步来实现自定义的starter依赖:

  • 创建配置属性类
  • 创建服务类
  • 创建自动配置类
  • 在resources目录下指定需要开启的自动配置类

以上四个步骤对应的模块如下面红色矩形框起来的,下面将详细讲解四个模块!
在这里插入图片描述
开始之前需要导入spring的起步依赖:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>hello-spring-boot-starter</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>Archetype - hello-spring-boot-starter</name>
  <url>http://maven.apache.org</url>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
    <relativePath/>
  </parent>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

创建配置属性类(HelloProperties)

有四个字段,和普通的实体类一样,设置get和set方法;唯一不一样的地方需要特别注意,@ConfigurationProperties(prefix = “hello”),表示这个类是配置属性类,作用是读取用户配置中的hello属性下的字段包装成一个属性类,特别注意回头看上面配置中的hello。只需要将配置中的属性字段与类中的属性一一对应即可。

package com.example.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
    private String url;
    private String port;
    private String username;
    private String password;

    public void setUrl(String url) {
        this.url = url;
    }

    public void setPort(String port) {
        this.port = port;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUrl() {
        return url;
    }

    public String getPort() {
        return port;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}

创建服务类(HelloService)

这个类是真正实现业务逻辑的类,它需要依赖上一步属性类HelloProperties获得的用户配置,然后实现一些功能!

package com.example.service;
public class HelloService {
    private String url;
    private String port;
    private String username;
    private String password;
    public HelloService(String url, String port, String username, String password) {
        this.url = url;
        this.port = port;
        this.username = username;
        this.password = password;
    }
    public String ConnectSystem() throws InterruptedException {
        /**
         * do something.......
         */
        System.out.println("连接中>>> "+url+":"+port);
        Thread.sleep(1000);
        System.out.println("认证中>>> "+username);
        Thread.sleep(1000);
        System.out.println("连接成功>>>"+ username +"中校您好!您已成功连接到国防系统");
        return "链接地址:"+url+":"+port+","+"访问者:"+username+"中校";
    }
}

创建自动配置类(HelloServiceAutoConfiguration)

这个类的作用就是将第一步的属性类HelloProperties的数据传给第二步的服务类HelloService的对象,并在容器中实例化该此类。需要将其指定为@Configuration 用来指明为配置类 并且用@EnableConfigurationProperties(HelloProperties.class) 开启自动配置。

package com.example.config;
import com.example.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * 配置类,基于Java代码的bean配置
 * 作用:将properties的配置文件的字段自动加载到HelloProperties类中
 */
@Configuration //指明配置类
@EnableConfigurationProperties(HelloProperties.class) //开启自动配置
public class HelloServiceAutoConfiguration {
    @Autowired
    private HelloProperties helloProperties;
    //实例化HelloService并载入Spring IoC容器
    @Bean
    @ConditionalOnMissingBean //条件:容器中没有Bean才创建
    public HelloService helloService(){
        return new HelloService(helloProperties.getUrl(),helloProperties.getPort(),helloProperties.getUsername(),helloProperties.getPassword());
    }
}

在resources目录下创建META-INF/spring.factories

上一步中我们只是指定了HelloServiceAutoConfiguration为配置类,但是没有加载此类,因此我们需要告诉Spring容器去加载此配置类,在resources目录下创建META-INF/spring.factories并指定自动加载的配置类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.config.HelloServiceAutoConfiguration

最后使用maven将我们的自定义starter依赖进行安装,如果不会请百度!

使用自定义依赖

创建maven工程myapp并配置pom.xml文件

<!--导入自定义starter-->
<dependency>
    <groupId>cn.itcast</groupId>
    <artifactId>hello-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

创建application.yml文件

package com.example.controller;
import com.example.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/connectSystem")
public class HelloController {
    @Autowired
    private HelloService helloService;
    @GetMapping("/hello")
    public String hello() throws InterruptedException {
        return helloService.ConnectSystem();
    }
}

创建启动类HelloApplication

package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class,args);
    }
}

访问链接:loaclhost:8080/connectSystem/hello
代码下载:https://download.csdn.net/download/cj151525/87944694

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codesys单轴控制实现多段速控制功能

b一、序言 在设备加工行业&#xff0c;很多工艺要用到多段速控制&#xff0c;比如切割&#xff0c;打孔&#xff0c;攻丝等&#xff0c;刀具未碰到工件时可以快速行走&#xff0c;刀具碰到工件时需要慢速加工&#xff0c;而有些工艺在加工时随着刀具越走越深&#xff0c;其进刀…

掌握Python的X篇_4_开发工具ipython与vscode的安装使用,作业

本篇将会介绍两个工具的安装及使用来提高Python的编程效率。 ipython&#xff1a;比python更好用的交互式开发环境vscode&#xff1a;本身是文本编辑器&#xff0c;通过安装相关的插件vscode可以作为python集中开发环境使用 掌握Python的X篇_4_开发工具ipython与vscode的安装使…

GIT保存记录原理之commit对象

GIT 中提交对象非常的重要&#xff0c;我们通过它记录代码提交过程、进行文件保存、回退等操作&#xff0c;那么它是怎样帮助我们记录这些信息的呢&#xff1f;其实就是都保存在项目根目录的 .git 文件夹中。 新建空项目 gitDemo使用 git init初始化&#xff0c;在文件夹根目录…

57 KVM工具使用指南-制作 LibcarePlus 热补丁

文章目录 57 KVM工具使用指南-制作 LibcarePlus 热补丁57.1 概述57.2 手动制作57.3 通过脚本制作 57 KVM工具使用指南-制作 LibcarePlus 热补丁 57.1 概述 LibcarePlus 支持如下方式制作热补丁&#xff1a; 手动制作通过脚本制作 手动制作热补丁的过程繁琐&#xff0c;对于…

java——反射与注解

文章目录 Java反射基础1. 概念详解2. 示例代码 Java反射进阶1. 框架设计2. 动态代理3. 模板方法 Java注解基础1. 概念2. 基本语法3. 自定义注解4. 反射获取注解信息 Java注解进阶1. 应用场景2. 内置注解3. 第三方注解库4. 总结 Java反射与注解实战1. 实战场景2. 代码实现 Java反…

AutoSAR系列讲解(入门篇)2.3-Ports的类型

Ports的类型 一、接口的类型 二、S/R接口 三、C/S接口 一、接口的类型 Ports是SWC和SWC做接口&#xff08;Interface&#xff09;通信使用&#xff0c;或者SWC通过RTE和BSW做接口&#xff08;Interface&#xff09;通信使用。 Ports主要分为5种类型&#xff0c;列在下面的图…

【UEFI实战】UEFI图形显示(显示驱动)

显示驱动 OVMF BIOS使用了这个作为显卡驱动&#xff0c;具体图形显示的底层实现不是重点&#xff0c;所以这里只是简单介绍。 QemuVideoDxe是一个UEFI Driver Model&#xff0c;对应的EFI_DRIVER_BINDING_PROTOCOL&#xff1a; EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriv…

【数据库】事务、事务并发问题、并发事务隔离级别、及sql演示

文章目录 一、事务1.1 事务简介 及 sql 操作1.2 事务的特性 二、事务并发问题三、事务隔离级别四、sql 演示4.1 脏读4.2 不可重复读4.3 幻读 五、演示代码 一、事务 1.1 事务简介 及 sql 操作 事务&#xff1a;数据库执行的一系列操作&#xff0c;这些操作要么全部执行&#x…

【Java技术专题】「入门到精通系列教程」深入探索Java特性中并发编程体系的原理和实战开发指南(内存模型技术专题)

深入探索Java特性中并发编程体系的原理和实战开发指南&#xff08; 线程进阶技术专题&#xff09; 前言介绍JVM内存模型运行时数据区域堆内存栈内存 内存访问规则原子性对象类型基本类型 可见性有序性&#xff08;Happen Before法则&#xff09;系统内存&#xff08;MESI协议&a…

【OS】【期末选择题】【2023春】【仅供参考】

文章目录 题型一、选择第一章(10)第二章(19)第三章(23)第四章(32)第五章(15)第六章(15) 二、填空题三、简答题1.信号量2.调度算法3.页面置换4.虚拟地址到物理地址的映射 Reference 题型 题型题量分值选择10%填空25%10%10%解答题210’大题215’ 一、选择 第一章(10) 操作系统…

HuggingFace-RL-Unit2-Part1——Q-learning算法介绍

Q-learning算法介绍 文章目录 Q-learning算法介绍回顾: 什么是RL? 两种基于价值的方法状态价值函数动作价值函数 贝尔曼方程&#xff1a;简化价值计算蒙特卡罗 VS 时序差分学习蒙特卡洛&#xff1a;在一个回合结束后进行学习时序差分算法&#xff1a;在每一步进行学习 学习进展…

定时器的实现原理

文章目录 1.定时器的作用?2.数据结构要求3.时间轮4.分级时间轮5.业界实现方案参考文献 1.定时器的作用? 定时器的主要用途是执行定时任务。 定时任务在很多场景都需要用到&#xff0c;比如游戏的 Buff 实现&#xff0c;Redis 中的过期任务&#xff0c;Linux 中的定时任务&a…

java——多线程

文章目录 Java 的并发基础知识1. 创建线程2. 同步方法和同步代码块3. 线程安全的容器4. volatile 关键字5. Lock 和 Condition 接口 Java 多线程编程的基本框架1. 创建和启动线程2. 线程的状态转换3. 线程安全4. 死锁 Java 并发编程的高级技术1. 线程池2. 并发集合3. 原子类4. …

测试:进阶篇

在本篇章开始之前&#xff0c;先对之前的内容进行一个简单的总结回顾一下&#xff1a; 基于需求设计测试用例&#xff0c;这里有个测试用例的万能公式&#xff1a; 功能&#xff08;如果是软件&#xff0c;需要参考依据需求规格说明书&#xff1b;如果是物体&#xff0c;这个…

2023年7月电脑选择

文章目录 一、笔记本1.1 确定需求1.2 确定预算1.3 性能指标1.4 其他 二、台式电脑 最近有朋友让我推荐一下能做3D建模的笔记本电脑&#xff0c;本文就讲一下台式机和笔记本怎么选择。 一、笔记本 1.1 确定需求 当我们在选择笔记本时&#xff0c;首先需要确定自己的需求&#x…

CSS基础学习--24 表单

一、一个表单案例&#xff0c;我们使用 CSS 来渲染 HTML 的表单元素 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>CSS基础学习-表单</title> </head> <style> input[typetext], select {width:…

计算机基础--->数据结构(3)【堆(超详细)】

文章目录 堆堆的时间复杂度堆的分类堆的存储堆的操作插入元素删除堆顶元素 堆排序建堆排序 所有操作代码 堆 堆一般分为两种类型&#xff1a;最大堆和最小堆。在最大堆中&#xff0c;父节点的值总是大于或等于子节点的值&#xff0c;而在最小堆中&#xff0c;父节点的值总是小于…

计算机自我介绍500字范文(合集)

计算机自我介绍500字范文1 本人是___大学计算机系统维护专业的学生。大学四年的学习&#xff0c;积累了丰富的专业知识&#xff0c;广泛的人际关系&#xff0c;培养我成为一个敢于承担责任&#xff0c;对待生活乐观积极&#xff0c;吃苦耐劳的青年。在专业方面我的主攻方向是计…

Ffmpeg6.0版本源码解读第一期!

前言&#xff1a; 大家好&#xff0c;最近一直在直播讲解Ffmpeg6.0版本的源码解析&#xff0c;这里要明白学习源码能给我们带来什么好处&#xff1f;我相信很多小伙伴已经用过Ffmpeg去开发&#xff0c;不知道大家有没有在开发的过程&#xff0c;调用接口的时候&#xff0c;是否…