SpringBoot很熟?那手撕一下自定义启动器吧

news2024/11/24 8:05:47

一. 前言

哈喽,大家好,不知道你有没有想辉哥呢?我可是很想你们哟!最近金九银十,又有不少小伙伴私信辉哥,说自己在面试时被问到SpringBoot如何自定义启动器,结果自己不知道该怎么回答。那么今天辉哥就手把手地带着大家,去看看在SpringBoot中到底该怎么实现自定义启动器。

二. 什么是SpringBoot自动装配?

在进行代码实现之前,我们先来看看什么是SpringBoot的自动装配。与自动装配对应的是手动装配,比如我们以前使用xml配置文件,引入spring或者引入mybatis时需要配置数据源、配置mybatis扫描、配置数据库连接池等。

而在SpringBoot中,我们只需要引入对应的mybatis启动器、druid启动器和数据库驱动,配置文件就可以自动根据配置数据库地址、用户和密码等信息快速地完成框架的搭建。也就是说,我们只要引入启动器,再配置一些必要的初始化连接参数,就可以直接使用,而不需要再自己创建很多复杂的配置,就可完成Bean类之间的依赖。

这一切都依赖于SpringBoot的自动装配!而自动装配则离不开starter启动器这个核心!那么starter启动器是怎么实现的呢?为了让大家搞明白这个问题,辉哥就给大家手写一个自定义的启动器。

三. 自定义启动器

1.第一步:首先创建一个java-maven的父工程

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.qfedu</groupId>
    <artifactId>springboot-auto</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/>
    </parent>
</project>

2.第二步:创建一个子工程

3.引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-auto</artifactId>
        <groupId>com.qfedu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>demo</artifactId>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

4.第三步:创建另一个子模块 java2113-starter作为启动器

5.引入依赖

<dependencies>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
</dependencies>

6.第四步:编写代码

package com.qfedu.java2113;

public class HelloService {
    private String msg;
    public String sayHello(){
        return "hello" + msg;
    }
    
    public String getMsg() {
        return msg;
    }
    
    
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

7.编写配置文件:application.properties

hello.msg=byebye

8.HelloServiceProperties类中读取配置文件的配置数据hello.msg

package com.qfedu.java2113;

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

// 读取配置文件中 以 hello为前缀的值 设置到  msg
@ConfigurationProperties(prefix = "hello")
public class HelloServiceProperties {
    private static  final String MSG = "world";
    private String msg = MSG;
    public String getMsg() {
        return msg;
    }
    
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

9.完成自动配置的类HelloServiceAutoConfiguration.java

package com.qfedu.java2113;

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;

/***
 * hello-2009-starter 启动器 对应的配置 类 HelloServiceAutoConfiguration
 * 每一个启动器都有一个 这样的配置类
 * HelloServiceAutoConfiguration 的 作用是
 * 将HelloServiceProperties 加入到容器
 * 将 HelloService 加入到容器 并且和  HelloServiceProperties 进行装配
 * HelloServiceAutoConfiguration 就是自动装配的配置类
 * 完成了 HelloServiceProperties  和 HelloService 之间的装配
 */
@Configuration //标记当前类是配置类,加载 HelloServiceProperties.class配置到容器中
@EnableConfigurationProperties(HelloServiceProperties.class)  // 让配置类HelloServiceProperties bean加入到容器中
public class HelloServiceAutoConfiguration {
    @Autowired
    private HelloServiceProperties helloServiceProperties;
    @Bean// 将HelloService 加入到容器
//    @ConditionalOnMissingBean(HelloService.class) // 只有当容器中没有 bean HelloService ,加入到容器,如果有就不需要加入到容器了
    public HelloService helloService(){
        HelloService helloService = new HelloService();
        helloService.setMsg(helloServiceProperties.getMsg());
        return helloService;
    }
}

10.第五步:让自动装配类生效

在resources 创建 resources\META-INF\spring.factories

# Auto Configure  让自定义的 自动配置类生效
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.qfedu.java2113.HelloServiceAutoConfiguration

11.安装到本地maven仓库

执行 mvn install命令。

12.第六步:在demo中引入java2113-starter 启动器

13.第七步:编写代码,使用自定义启动器

13.1 配置文件初始化

13.2 使用

    @Autowired
    private HelloService helloService;
    
    @RequestMapping("/getHellMsg")
    public String getHellMsg(){
        return  "获取msg:"+ helloService.getMsg();
    }

14.第八步:测试看效果

四. 总结

哈,现在你跟着写出来了吗?这样我们就通过自定义启动器,很好地理解了SpringBoot的运行原理,特别是SpringBoot的自动装配原理。大家可以跟着辉哥上面的实现步骤,一步步地来,只要效果出来了,再逆向反推实现过程。你就会发现,原来很多所谓的实现原理也并不难

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

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

相关文章

maltose-BSA 麦芽糖-牛血清白蛋白 BSA-PEG-maltose,牛血清白蛋白-PEG-麦芽糖

maltose-BSA 麦芽糖-牛血清白蛋白 BSA-PEG-maltose,牛血清白蛋白-PEG-麦芽糖 中文名称&#xff1a;麦芽糖-牛血清白蛋白 英文名称&#xff1a;maltose-BSA 纯度&#xff1a;95% 别称&#xff1a;牛血清白蛋白修饰麦芽糖&#xff0c;BSA-麦芽糖 麦芽糖-聚乙二醇-牛血清白…

设计模式日常学习(七)

6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一种状态改变&#xff0c;都有可能要根据其他状态来更新处理。例如&#xff0c;如果电梯门现在处于运行时状态…

什么是副业思维,副业应该怎么做,用创业思维分析副业的可行性

副业其实也算是创业的一种&#xff0c;他考量的不仅仅是自身的知识储备&#xff0c;还有你对市场的看法&#xff0c;再加上一定的做副业的技巧&#xff0c;下面分享七个做好副业的技巧​。 1.循序渐进投入 不要大量投资。首先&#xff0c;使用相对较轻的方法来验证创业理念是否…

教程六 在Go中使用Energy创建跨平台GUI - 应用下载事件

教程-示例-文档 介绍 Energy应用下载文件时触发的下载事件和使用 我们在页面上下载文件时&#xff0c;可以对文件下载时的处理&#xff0c;例如&#xff1a;保存路径&#xff0c;下载取消&#xff0c;开始、暂停。 下面将用代码和注释&#xff0c;和简要的说明来演示 Go代码…

GUI编程--PyQt5--布局管理

文章目录布局管理布局步骤QHBoxLayout & QVBoxLayoutQFormLayoutQGridLayout布局管理 布局&#xff0c;按照一定规则&#xff0c;将子控件放入父控件 手动布局&#xff1b;绝对布局move & resize & resizeEvent布局管理器&#xff0c;实现快速布局&#xff0c;是…

08 SQL优化

上一篇文章记录了索引的创建、使用、设计&#xff0c;除了索引方面还需要注意平日对于SQL的使用&#xff0c;对SQL进行优化&#xff1b;SQL的优化是建立在索引使用的基础上 这篇笔记将从以下7个方面对SQL进行优化。 1. 插入数据 使用批量插入,避免循环单条插入 注意批量插入不…

贤鱼的刷题日常(数据结构栈学习)--P1175 表达式的转换--题目详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解P1175 表达式的转换 ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&#xff0c;欢…

ServletConfig 和 ServletContext

1 ServletConfig 1.1 ServletConfig 介绍 ServletConfig 是 Servlet 的配置参数对象&#xff0c;在 Servlet 的规范中&#xff0c;允许为每一个 Servlet 都提供一些初始化的配置。所以&#xff0c;每个 Servlet 都有一个自己的 ServletConfig。作用&#xff1a;在 Servlet 的…

静息态fMRI中的非线性功能网络连接

在这项工作中&#xff0c;我们关注功能网络中的显式非线性关系。我们介绍了一种使用归一化互信息(NMI)计算不同大脑区域之间非线性关系的技术。我们使用模拟数据演示了我们提出的方法&#xff0c;然后将其应用到Damaraju等人先前研究过的数据集。静息状态fMRI数据包括151名精神…

玩转高并发,17年开发经验架构师,历时三年编写Java高并发三部曲

前言 5G&#xff0c;IO&#xff0c;多屏合一&#xff0c;方物互联时代来了&#xff01;太分n式、高并发、微服务架构己经成为Java后端应用的主流架构。但是对Java高并发&#xff0c;springcloudRPC底层原理、Nginx底层原理等核心知识&#xff0c;广大的Java开发同学们相对欠缺…

【踩坑汇总】CLion开启QT编程

一下全部内容全都是大佬lht的经验&#xff0c;我只是记录一下给大家。 问题&#xff1a;Qt5Config.cmake找不到 解决办法&#xff1a; set(CMAKE_PREFIX_PATH "E:/Qt/Qt5.12.11/5.12.11/mingw73_64/lib/cmake/Qt5") 找到Qt5Config.cmake路径&#xff0c;添加上面这…

东南亚LazadaShopee文具类目好做吗?一文带你了解各国热销及需求品类

在东南亚&#xff0c;消费者刚刚经历完双11独有的“速度与激情”——11月11日00&#xff1a;11&#xff0c;开售11分钟&#xff0c;Lazada平台的销售额相比日销暴涨124倍&#xff1b;早上8&#xff1a;17&#xff0c;第一单跨越重洋的中国跨境商品就已成功送达签收。 东南亚&a…

Listen,Attend,and Spell(LAS)——李宏毅人类语言处理学习笔记3

Listen Encoder目标&#xff1a; 去掉noises&#xff0c;提取出相关信息 encoder有很多做法&#xff1a; CNN见文章&#xff1a;CNN-卷积神经网络 self-attention见文章self-attention Pyramid RNN将两个结合&#xff0c;然后送到下一层。Pooling over time则是两个中取一…

代谢组学文献分享:地中海饮食、血浆代谢组和心血管疾病风险

​全球三分之一的死亡由心血管疾病造成&#xff0c;2015-2020年美国膳食指南建议&#xff0c;地中海饮食是预防心血管疾病的一项重要且具有成本效益的战略措施。代谢组学文献分享&#xff0c;发表在期刊European Heart Journ-al&#xff08;IF 22.637&#xff09;上题目为“Th…

网络协议

网络通信协议&#xff1a;计算机网络中实现通信必须有一些约定&#xff0c;即通信协议&#xff0c;对速率、传输代码、代 码结构、传输控制步骤、出错控制等制定标准。 问题&#xff1a;网络协议太复杂&#xff1a;计算机网络通信涉及内容很多&#xff0c;比如指定源地址和目标…

【多标签, 极限的多标签算法】评价指标梳理

具体研究多标签和极限多标签 (XML) 的时候, 合理使用评价指标是关键. 最近在研究极限多标签算法的时候发现了它和传统多标签算法的评价指标是有异的, 而且我曾经积累的传统多标签评价指标也没有一个系统的体系 (很混乱). 于是写下本文用于自我总结. 查询目录<想看什么直接通…

语音识别翻译怎么做?这些方法值得收藏

随着网络的不断发展&#xff0c;我们可以通过网络与世界各地的网友进行聊天。小伙伴们平时会和外国人交流吗&#xff1f;如果是文字聊天&#xff0c;我们看不懂的时候&#xff0c;还可以直接复制文字进行翻译。那如果外国网友发了段语音&#xff0c;结果我们大部分内容听不懂的…

电力行业人员定位管理解决方案之智能巡检

智能巡检引入大数据分析理念&#xff0c;通过数字化技术实现对生产现场各关键要素的全面感知和实时互联&#xff0c;形成项目现场“数据一个库、监管一张网、管理一条线“。 在信息技术高速发展的今天&#xff0c;传统人工巡视、手工纸介质记录的工作方式已经无法满足电力设备巡…

第7章 博客文章的前端渲染显示

说实话本人通过Vue页面实现前端对后端数据的渲染显示也是初学咋练&#xff0c;但后端实现本人却是老鸟&#xff0c;对于后端开发者来说如果&#xff0c;渲染显示的软件是浏览器&#xff0c;除非团队中有Vue方面的大拿&#xff0c;不管是PC浏览器还是移动PC浏览器&#xff0c;Ra…

元宇宙初体验

14天学习训练营导师课程&#xff1a; 张子良《 元宇宙体系结构、关键技术和实践探索》 前言 最近这段时间加入勤学会的学习中&#xff0c;我加入的是元宇宙相关的学习组&#xff0c;为什么我选择元宇宙&#xff0c;不仅因为元宇宙是应用场景和生活方式的未来&#xff0c;而且元…