| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【自定义Spring-Boot-Starter及原理详解】 -> 正文阅读 |
|
[Java知识库]【自定义Spring-Boot-Starter及原理详解】 |
定义首先阐述一下Spring-Boot-Starter的概念:
简单来说,就是指Starter是一组依赖的组合,类似于插件。 作用在传统的项目中,我们想使用MyBatis依赖,则必然要引入依赖、编写xml配置文件等等操作。在你开下一个项目时还是需要这样操作,尤其是复杂的xml。 而在引入Starter后,这些操作都可以舍弃,由Starter自主完成。当我们引入 mybatis-spring-boot-starter 依赖时,我们也只需要在配置文件中编写对应的配置,不需要什么其他操作,都由Starter完成。 简而言之,Starter是一个SpringBoot项目,里面集成了我们所需要的功能及依赖,很多操作在这个项目中已经完成,所以我们不需要自己实现功能,并且也可以解决依赖版本的问题,我们不需要关心每个依赖,全部统一进行管理。 并且,在Starter中,通常会通过@ConfigurationProperties注解使所有的配置属性集中到全局配置文件 application.yml 中,这样就使我们告别了各种各样的xml配置。 命名规范如果我们要自定义Starter,那么要遵循一定的规范,Spring为Starter制定了一些命名方面的规范(详情请看Spring-Boot-Starter命名规范)。 官方Starter命名为:
自定义Starter命名为:
当然想自定义Starter,则了解SpringBoot自动配置原理必不可少。 自动配置原理首先,在启动类中的 @SpringBootApplication 注解中,存在着一个 @EnableAutoConfiguration 注解,而在这个注解里,又有一个 @Import(AutoConfigurationImportSelector.class) 注解,该注解表示将这个类引入进Spring容器中,原理就在这个类中。 在这个类中,有一个 getCandidateConfigurations() 方法,用来获取所有的候选配置,其实就是扫描所有自动配置类,返回的是配置类全限定名的集合。 点进 SpringFactoriesLoader.loadFactoryNames()方法,我们接着往下看: 在方法中的描述,我们可以看出,它负责从 META-INF/spring.factories 文件中加载自动配置类的全限定名。 而具体的实现却在 loadSpringFactories() 方法中: 看,这不就相当于SPI机制吗,在Starter(服务提供者)引入进来后,SpringBoot(服务发现者)自动对其 META-INF/spring.factories 文件中的内容进行扫描,并根据全限定名进行加载。 而在将自动配置类加载进容器时,很多Starter通常会进行校验及Bean加载的先后顺序,也就是条件注解 @Condition,我们简单看一下MyBatis的:
???MybatisProperties.class: ???全局配置文件: 只要通过前缀,即可声明其配置,而配置文件类可以将属性绑定到该类中,但是必须要通过 @EnableConfigurationProperties 启用才能生效。
既然已经讲清楚了这些,就来说说如何实现Spring-Boot-Starter。 实现
接下来,就可以在项目中引用 DemoHandler类进行执行了。
配置(可以看到,该配置是使用的 DemoProperties 类,包括注释也有提示): 结果(确实是将DemoHandler类注入进容器中,并且将我们的配置也读取出来了): 回到刚刚说的一个问题:spring-boot-configuration-processor依赖是什么? 其实,我们在配置文件中,定义配置时,如果没有这个依赖,配置是不会有提示功能的。 这个功能归功于这个文件,它属于META-INF\spring-configuration-metadata.json,拥有这个文件,才能出现配置文件中的提示功能,在这个文件中约定了配置的类型、名称、描述以及所属的类,而我们如果自定义该文件,未免太过麻烦。因为如果你有很多配置,那么你就要写很多东西了,而这个依赖可以帮助我们生成该文件,避免我们手写。 问题:
总结每个Starter都描述一种或多种功能,它会将所有用到的依赖包含进来,首先避免了开发者手动导入依赖的情况。同时,我们可以在Starter中使用Spring的各种功能,例如切面,事件等,因为Starter严格来说就是一个SpringBoot项目。并且我们不需要再指定xml了,在Starter中,已经帮助我们自动做完了这些工作,我们只需要提供配置即可,同时,也不需要关心其如何实现。只需要像插件一样安装上去即可运行。easy~ 另外,可以看看我简单实现的一个canal-spring-boot-starter,基于Canal原生API实现,借鉴了一些开源项目的思路,也比较简单,希望对你有所帮助。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/10 18:23:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |