SpringBoot——自定义start

优质博文:IT-BLOG-CN

一、Mybatis 实现 start 的原理

首先在写一个自定义的start之前,我们先参考下Mybatis是如何整合SpringBoot:mybatis-spring-boot-autoconfigure依赖包:

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version>
</dependency>

mybatis依赖包展示: 重要文件:spring.factoriesMybatisAutoConfigurationMybatisProperties

:::tip
starters 命名:Spring Boot 官方的启动器都是以 spring-boot-starter-命名的,代表了一个特定的应用类型。第三方的启动器不能以 spring-boot开头命名,它们都被 Spring Boot官方保留。一般第三方应该这样命名,像 mybatis 的 mybatis-spring-boot-starter。
:::

【1】查看spring.factories文件: 配置自动配置类MybatisAutoConfigurationspring.factories会引导springboot哪个是自动配置类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

【2】进入MybatisAutoConfiguration.class类:下面@EnableConfigurationProperties(MybatisProperties.class)引入了配置文件MybatisProperties.class。之后就可以利用这个配置文件里的参数实例化一个对象完成整个mybatis的创建。

在 Spring开发过程中我们常使用到 @ConfigurationProperties注解,通常是用来将 properties和 yml配置文件属性转化为 Bean对象使用和修改。在获取这些 Bean之前,首先需要使用 @EnableConfigurationProperties({ConfigBean.class}) 注解的作用是开启 @ConfigurationProperties注解,当满足 Condition 条件的时候才执行。

@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnBean({DataSource.class})
/*** @ConfigurationProperties注解主要用来把properties配置文件转化为bean来使用的,* 而@EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。* 如果只配置@ConfigurationProperties注解,在IOC容器中是获取不到properties配置文件转化的bean的。*/
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisAutoConfiguration {private static final Logger logger = LoggerFactory.getLogger(MybatisAutoConfiguration.class);private final MybatisProperties properties;private final Interceptor[] interceptors;private final ResourceLoader resourceLoader;private final DatabaseIdProvider databaseIdProvider;private final List<ConfigurationCustomizer> configurationCustomizers;public MybatisAutoConfiguration(MybatisProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider, ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider, ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) {this.properties = properties;this.interceptors = (Interceptor[])interceptorsProvider.getIfAvailable();this.resourceLoader = resourceLoader;this.databaseIdProvider = (DatabaseIdProvider)databaseIdProvider.getIfAvailable();this.configurationCustomizers = (List)configurationCustomizersProvider.getIfAvailable();}
//......
}

【3】进入 MybatisProperties: 这里所有的属性,就是之后我们在properties配置文件中配置的项,而@ConfigurationProperties(prefix = "mybatis")定义了前缀。举个栗子:我们一般会在application.yml或者application.propertiesxml映射文件的路径:mybatis.mapperLocations=classpath:mapping/*.xml就是以mybatis作为前缀的。

mybatis正是这个MybatisProperties@ConfigurationProperties配置的前缀而mapperLocations就是我们这个MybatisProperties.class的其中一个成员变量 !

@ConfigurationProperties(prefix = "mybatis"
)
public class MybatisProperties {public static final String MYBATIS_PREFIX = "mybatis";private String configLocation;private String[] mapperLocations;private String typeAliasesPackage;private String typeHandlersPackage;private boolean checkConfigLocation = false;private ExecutorType executorType;private Properties configurationProperties;@NestedConfigurationPropertyprivate Configuration configuration;public MybatisProperties() {}
//......
}

【4】现在来看最后一个问题:spring.factories文件什么时候加载,我们定位到我们的启动类,进入@SpringBootApplication注解,点进去之后是一个@EnableAutoConfiguration注解,再点进去可以看到一个叫做AutoConfigurationImportSelector.class的类,就是这里了再点进去,在这个类的源码里搜索spring.factories

原来springboot会去META-INF目录下找到这个spring.factories文件,到现在为止我们已经理清楚了整个start加载的流程:
【1】去META-INF目录下找到这个spring.factories文件;
【2】通过文件内指定的类路径,找到配置类;
【3】配置类加载进属性类;
【4】配置类通过属性类的参数构建一个新的Bean

二、用户自定义 start

就按照这个Mybatis的格式,自己写一个redisstart由于spring.factories是指定入口的我们可以放在最后写。下面创建一个普通的springboot工程。

【1】编写属性类: 添加@ConfigurationProperties注解和前缀redis。之后我们就可以在propertiesyml中 使用redis.port=指定参数了;

@ConfigurationProperties(prefix = "redis")
public class RedisProperties {private Integer port;private String host;private String password;private int index;//省略了get set 方法
}

【2】编写配置类: 添加配置类注解 @Configuration 和加载条件,以及 @EnableConfigurationProperties(RedisProperties.class) 引入属性类,注入到 IOC 容器中。

@Configuration
//只有当Jedis 存在的时候 才执行,就是说一定要引入了Jedis的依赖才会执行这个配置
@ConditionalOnClass(Jedis.class)
//引入属性类
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {@Bean//当这个bean不存在的时候才执行,防止重复加载bean@ConditionalOnMissingBeanpublic Jedis jedis(RedisProperties redisProperties) {Jedis jedis = new Jedis(redisProperties.getHost(), redisProperties.getPort());jedis.auth(redisProperties.getPassword());jedis.select(redisProperties.getIndex());return jedis;}
}

【3】编写spring.factories文件:resources目录下创建入口文件,编写内容:指定配置文件的全路径。随后通过mvn install打到本地仓库。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.yintong.myjedis.RedisAutoConfiguration 

【4】测试: 然后我们新建一个springboot项目,在pom中加入依赖:

<dependency><groupId>com.yintong</groupId><artifactId>redis-start</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

【5】测试类: @Resource的作用相当于@Autowired,只不过@AutowiredbyType自动注入,而@Resource默认按byName自动注入罢了。下面如果你能成功输出就成功了!

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestStartApplicationTests {@Resourceprivate Jedis jedis;@Testpublic void contextLoads() {jedis.set("test","测试成功");String test = jedis.get("test");System.out.println(test);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国移动联合中国华电完成基于ZETA物联网技术的风电机组主辅智能控制系统试点应用

2023年11月17日&#xff0c;中国移动联合中国华电研发的“基于ZETA物联网技术的风电机组主辅智能控制系统与风电机组叶片巡检系统”在甘肃省酒泉华电黑崖子风电场成功投运。中移物联网有限公司相关人员主导参与了本次试点。 ZETA技术是一种基于UNB的低功耗广域网&#xff08;LP…

JVM的小知识总结

加载时jvm做了这三件事&#xff1a; 1&#xff09;通过一个类的全限定名来获取该类的二进制字节流 什么是全限定类名&#xff1f; 就是类名全称&#xff0c;带包路径的用点隔开&#xff0c;例如: java.lang.String。 即全限定名 包名类型 非限定类名也叫短名&#xff0c;就…

近期知识点随笔

菜单查询&#xff08;编写权限时的细节&#xff09; 菜单查询list为了侧边框展示更完整&#xff08;不报空指针&#xff09; 登录时&#xff08;用户名&#xff09;查询出多个结果&#xff08;保证用户名唯一&#xff09; 文件上传 前端 对权限与菜单绑定的修改&#xff08;实…

【数据结构】树的概念以及二叉树

目录 1 树概念及结构 1.1 树的概念 1.3 树的存储 2 二叉树的概念及结构 2.1 概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 1 树概念及结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组…

04 # 第一个 TypeScript 程序

初始化项目以及安装依赖 新建 ts_in_action 文件夾 npm init -y安装好 typescript&#xff0c;就可以执行下面命令查看帮助信息 npm i typescript -g tsc -h创建配置文件&#xff0c;执行下面命令就会生成一个 tsconfig.json 文件 tsc --init使用 tsc 编译一个 js 文件 新…

解决:AttributeError: ‘NoneType’ object has no attribute ‘shape’

解决&#xff1a;AttributeError: ‘NoneType’ object has no attribute ‘shape’ 文章目录 解决&#xff1a;AttributeError: NoneType object has no attribute shape背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&…

Vue3集成ThreeJS实现3D效果,threejs+Vite+Vue3+TypeScript 实战课程【一篇文章精通系列】

Vue3集成ThreeJS实现3D效果&#xff0c;threejsViteVue3TypeScript 实战课程【一篇文章精通系列】 项目简介一、项目初始化1、添加一些依赖项 二、创建3D【基础搭建】1、绘制板子&#xff0c;立方体&#xff0c;球体2、材质和光照3、材质和光照和动画4、性能监控5、交互控制6、…

pathlib --- 面向对象的文件系统路径

目录 基础使用 纯路径 通用性质 运算符 访问个别部分 方法和特征属性 具体路径 方法 对应的 os 模块的工具 3.4 新版功能. 源代码 Lib/pathlib.py 该模块提供表示文件系统路径的类&#xff0c;其语义适用于不同的操作系统。路径类被分为提供纯计算操作而没有 I/O 的 …

在Spring Boot中隔离@Async异步任务的线程池

在异步任务执行的时候&#xff0c;我们知道其背后都有一个线程池来执行任务&#xff0c;但是为了控制异步任务的并发不影响到应用的正常运作&#xff0c;我们需要对线程池做好相关的配置&#xff0c;以防资源过度使用。这个时候我们就考虑将线程池进行隔离了。 那么我们为啥要…

FIORI /N/UI2/FLP 始终在IE浏览器中打开 无法在缺省浏览器中打开

在使用/N/UI2/FLP 打开fiori 启动面板的时候&#xff0c;总是会在IE浏览器中打开&#xff0c;无法在缺省浏览器打开 并且URL中包含myssocntl 无法正常打开 启动面板 这种情况可以取消激活ICF节点/sap/public/myssocntl

SpringBoot项目打成jar包后,上传的静态资源(图片等)如何存储和访问

1.问题描述&#xff1a; 使用springboot开发一个项目&#xff0c;开发文件上传的时候&#xff0c;通常会将上传的文件存储到资源目录下的static里面&#xff0c;然后在本地测试上传文件功能没有问题&#xff0c;但是将项目打成jar包放到服务器上运行的时候就会报错&#xff0c…

IDC MarketScape2023年分布式数据库报告:OceanBase位列“领导者”类别,产品能力突出

12 月 1 日&#xff0c;全球领先的IT市场研究和咨询公司 IDC 发布《IDC MarketScape:中国分布式关系型数据库2023年厂商评估》&#xff08;Document number:# CHC50734323&#xff09;。报告认为&#xff0c;头部厂商的优势正在扩大&#xff0c;OceanBase 位列“领导者”类别。…

STM32 定时器TIM

单片机学习 目录 文章目录 前言 一、TIM简介 二、STM32的三种定时器 2.1基本定时器 2.1.1定时中断功能 1. 时钟源 2. 预分频器 3. 计数器 4. 自动重装寄存器 5.更新中断和更新事件 2.1.2主模式触发DAC功能 2.2 计数模式 2.2通用定时器 2.2.1 时钟源 外部时钟模式2 外部时钟模式…

Java中的异常你了解多少?

目录 一.认识异常二.异常分类三.异常的分类1.编译时异常2.运行时异常 四.异常的处理1.LYBL&#xff1a;事前防御型2.EAFP&#xff1a;事后认错型 五.异常的抛出Throw注意事项 六.异常的捕获1.异常的捕获2.异常声明throws3.try-catch捕获并处理 七.自定义异常 一.认识异常 在Jav…

一文带你了解网络安全简史

网络安全简史 1. 上古时代1.1 计算机病毒的理论原型1.2 早期计算机病毒1.3 主要特点 2. 黑客时代2.1 计算机病毒的大流行2.2 知名计算机病毒2.3 主要特点 3. 黑产时代3.1 网络威胁持续升级3.2 代表性事件3.3 主要特点 4 高级威胁时代4.1 高级威胁时代到来4.2 著名的APT组织4.3 …

基于A*的网格地图最短路径问题求解

基于A*的网格地图最短路径问题求解 一、A*算法介绍、原理及步骤二、Dijkstra算法和A*的区别三、A*算法应用场景四、启发函数五、距离六、基于A*的网格地图最短路径问题求解实例分析完整代码 七、A*算法的改进思路 一、A*算法介绍、原理及步骤 A*搜索算法&#xff08;A star al…

Echarts大屏可视化_03 定制柱状图

柱状图模块引入 1.找到合适的图表 在echarts中寻找与目标样式相近的图表 Examples - Apache ECharts 2. 引入柱状图 使用立即执行函数构建&#xff0c;防止变量全局污染 实例化对象 将官网中提供的option复制到代码中&#xff0c;并且构建图表 // 柱状图模块1 (function () {/…

WEB渗透—反序列化(十)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…

【Linux】vim-多模式的文本编辑器

本篇文章内容和干货较多&#xff0c;希望对大家有所帮助&#x1f44d; 目录 一、vim的介绍 1.1 vi 与 vim的概念1.2 Vim 和 Vi 的一些对比 二、vim 模式之间的切换 2.1 进入vim2.2 [正常模式]切换到[插入模式]2.3 [插入模式]切换至[正常模式]2.4 [正常模式]切换至[底行模式…

C/C++---------------LeetCode第876. 链表的中间结点

链表的中间结点 题目及要求双指针在main内使用 题目及要求 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 示例 2&#xff1a; 双指针 思路&#xff1a;分别定义快慢指针…