spi

SpringApplication对象是如何构建的? SpringBoot源码(八)

試著忘記壹切 提交于 2020-04-07 12:20:45
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 本篇接 SpringBoot的启动流程是怎样的?SpringBoot源码(七) 1 温故而知新 温故而知新,我们来简单回顾一下上篇的内容,上一篇我们分析了 SpringBoot的启动流程 ,现将关键步骤再浓缩总结下: 构建 SpringApplication 对象,用于启动SpringBoot; 从 spring.factories 配置文件中加载 EventPublishingRunListener 对象用于在不同的启动阶段发射不同的生命周期事件; 准备环境变量,包括系统变量,环境变量,命令行参数及配置文件(比如 application.properties )等; 创建容器 ApplicationContext ; 为第4步创建的容器对象做一些初始化工作,准备一些容器属性值等,同时调用各个 ApplicationContextInitializer 的初始化方法来执行一些初始化逻辑等; 刷新容器,这一步至关重要,是重点中的重点,太多复杂逻辑在这里实现; 调用 ApplicationRunner 和 CommandLineRunner 的run方法,可以实现这两个接口在容器启动后来加载一些业务数据等; 在SpringBoot启动过程中,每个不同的启动阶段会分别发射不同的内置生命周期事件

MicroPython实例之TPYBoard开发板控制OLED显示中文

吃可爱长大的小学妹 提交于 2020-04-07 10:08:59
0x00 前言 之前看到一篇文章是关于TPYBoard v102控制OLED屏显示的,看到之后就想尝试一下使用OLED屏来显示中文。最近利用空余时间搞定了这个实验,特此将实验过程及源码分享出来,方便以后使用。 0x01 实验器材 TPYBoard v102 开发板 1块(某宝上可以买到,价格不贵) 0.96 寸OLED显示屏(ssd1306) 1块 杜邦线 若干 0x02 前期准备 1、首先我们先来看一下,之前参考的OLED显示字符的文章。 http://docs.tpyboard.com/zh/latest/tpyboard/tutorial/v10x/oled/?highlight=oled 文章中的源码文件都已上传到GitHub。地址: https://github.com/TPYBoard/developmentBoard/tree/master/TPYBoard-v10x-master 找到11.学习使用OLED显示屏]里面就是源程序。我就是在font.py和ssd1306.py基础上做的开发。 2、在font.py中增加中文字模。 font.py中已有英文、数字和符号的字符,我们需要做中文的字模添加到font.py中。 2.1首先下载字模提取工具。地址: http://tpyboard.com/download/tool/187.html 解压

SpringApplication对象是如何构建的? SpringBoot源码(八)

二次信任 提交于 2020-04-07 09:48:10
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 本篇接 SpringBoot的启动流程是怎样的?SpringBoot源码(七) 1 温故而知新 温故而知新,我们来简单回顾一下上篇的内容,上一篇我们分析了 SpringBoot的启动流程 ,现将关键步骤再浓缩总结下: 构建 SpringApplication 对象,用于启动SpringBoot; 从 spring.factories 配置文件中加载 EventPublishingRunListener 对象用于在不同的启动阶段发射不同的生命周期事件; 准备环境变量,包括系统变量,环境变量,命令行参数及配置文件(比如 application.properties )等; 创建容器 ApplicationContext ; 为第4步创建的容器对象做一些初始化工作,准备一些容器属性值等,同时调用各个 ApplicationContextInitializer 的初始化方法来执行一些初始化逻辑等; 刷新容器,这一步至关重要,是重点中的重点,太多复杂逻辑在这里实现; 调用 ApplicationRunner 和 CommandLineRunner 的run方法,可以实现这两个接口在容器启动后来加载一些业务数据等; 在SpringBoot启动过程中,每个不同的启动阶段会分别发射不同的内置生命周期事件

Java是如何实现自己的SPI机制的? JDK源码(一)

左心房为你撑大大i 提交于 2020-04-06 19:14:11
注:该源码分析对应JDK版本为1.8 1 引言 这是【源码笔记】的JDK源码解读的第一篇文章,本篇我们来探究Java的SPI机制的相关源码。 2 什么是SPI机制 那么,什么是SPI机制呢? SPI是Service Provider Interface 的简称,即 服务提供者接口 的意思。根据字面意思我们可能还有点困惑,SPI说白了就是一种扩展机制,我们在相应配置文件中定义好某个接口的实现类,然后再根据这个接口去这个配置文件中加载这个实例类并实例化,其实SPI就是这么一个东西。说到SPI机制,我们最常见的就是Java的SPI机制,此外,还有Dubbo和SpringBoot自定义的SPI机制。 有了SPI机制,那么就为一些框架的灵活扩展提供了可能,而不必将框架的一些实现类写死在代码里面。 那么,某些框架是如何利用SPI机制来做到灵活扩展的呢?下面举几个栗子来阐述下: JDBC驱动加载案例 :利用Java的SPI机制,我们可以根据不同的数据库厂商来引入不同的JDBC驱动包; SpringBoot的SPI机制 :我们可以在 spring.factories 中加上我们自定义的自动配置类,事件监听器或初始化器等; Dubbo的SPI机制 :Dubbo更是把SPI机制应用的 淋漓尽致 ,Dubbo基本上自身的每个功能点都提供了扩展点,比如提供了集群扩展

Dubbo 源码分析

风格不统一 提交于 2020-04-06 17:40:38
开篇 前面用了4 篇文章分析了 Dubbo SPI 的几种用法以及如何在 Dubbo 中应用的, Dubbo SPI 使用方法(一)- 扩展点自动包装 Dubbo SPI 使用方法(二)- 扩展点自适应 Dubbo SPI 使用方法(三)- 扩展点自动装配 Dubbo 源码分析 - Dubbo SPI 在 Protocol 层 的应用 本文通过调试 Dubbo2.7.x 源码分析 如何通过 getExtension(name) 获取一个扩展对象实例 。 正文 回顾一下 Dubbo SPI 的最基本的用法 public class App { public static void main( String[] args ) { // 第一步 ExtensionLoader<HelloService> extensionLoader = ExtensionLoader.getExtensionLoader(HelloService.class); // 第二步 HelloService helloService = extensionLoader.getExtension("helloService"); // 第三步 helloService.sayHello("xiaoming"); } } 我们直接从第二步 debug 进入 getExtension(name) 方法 1.

深入理解ServiceLoader类与SPI机制

会有一股神秘感。 提交于 2020-04-06 12:26:04
最近我们自己在重构项目,系统为了符合82原则(希望是80%的业务能通过穷举的方式固定下来,只有20%的允许特殊的定义),那么在固定一些标准流程以后,比如我们放大了原子服务的能力,当放大原子服务能力的时候,你就会发现,虽然抽象上看做的事情是一个意思,但是到实际去实现的时候发现还是各不相同。 在这里为了解决一个实现不同,但流程相同的问题,以及团队协作上的问题。我们引入的SPI (Service Provider Interface) 。 使用案例 通常情况下,使用ServiceLoader来实现SPI机制。 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制, 比如有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。 SPI机制可以归纳为如下的图: 如果大家看过源代码或者说看过一些博客文章大概都清楚,在一些开源项目中大量的使用了SPI的方式,比如: mysql-connector-java , dubbo 等。 我们大概看眼MySQL的一个SPI实现 JDBC中的接口即为: java.sql.Driver SPI机制的实现核心类为: java.util.ServiceLoader Provider则为: com.mysql.jdbc.Driver com.mysql.jdbc

Dubbo 源码分析

会有一股神秘感。 提交于 2020-04-06 11:38:29
开篇 前面通过三篇文章讲述了 Dubbo SPI 的其中三种用法: Dubbo SPI 使用方法(一)- 扩展点自动包装 Dubbo SPI 使用方法(二)- 扩展点自适应 Dubbo SPI 使用方法(三)- 扩展点自动装配 本文通过 Dubbo 的一个应用案例 - 获取 Protocol 扩展实例, 来看看 Dubbo SPI 在源码中的具体应用实现. 阅读本文之前,请结合上述文章 或者 官网 Dubbo SPI , 或者其他相关文章, 对 Dubbo SPI 有一定程度的了解. 正文 通过 Dubbo 官方文档-框架设计篇 , 可以看出 Dubbo 整体被分为 十 层, 其中 Service 和 Config 层为 API,其它各层均为 SPI, 也就是说其他各层都有对应的多个扩展实现. 比如协议层 Protocol 的已知扩展: org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol org.apache.dubbo.rpc.protocol.rmi.RmiProtocol org.apache.dubbo.rpc.protocol.http.HttpProtocol org.apache.dubbo.rpc.protocol

Dubbo SPI 使用方法(三)- 扩展点自动装配

北城余情 提交于 2020-04-06 07:43:47
开篇 前面已经讲到了: Dubbo SPI 使用方法(一)- 扩展点自动包装 Dubbo SPI 使用方法(二)- 扩展点自适应 本文来讲下 Dubbo SPI - 扩展点自动装配 , 即 Dubbo 实现的 IOC , 用一段简单代码来解释下: 当实例化 A 时, 发现 A 依赖了 B, 并且有对应的 set 注入方法, 那么 Dubbo 就会顺便把 B 也实例化, 并注入到 A 对象中. public class A { private B b; public void setB(B b) { this.b = b; } } 正文 1. 概念 上面简单的介绍了 IOC, 那么接下来看看 Dubbo SPI - 扩展点自动装配是如何做的. 引用官网的一段介绍 加载扩展点时,自动注入依赖的扩展点。 加载扩展点时,扩展点实现类的成员如果为其它扩展点类型,ExtensionLoader 在会自动注入依赖的扩展点。 ExtensionLoader 通过扫描扩展点实现类的所有 setter 方法来判定其成员。即 ExtensionLoader 会执行扩展点的拼装操作。 2. 使用 2.1 定义扩展接口 interface ServiceA { void sayA(); } 2.2 定义扩展接口实现类 // 实现类 public class ServiceAImpl implements

Dubbo源码解读 —— Dubbo扩展点加载机制

放肆的年华 提交于 2020-04-06 06:31:44
Dubbo源码解读 —— Dubbo扩展点加载机制 Dubbo源码解读 —— Dubbo扩展点加载机制 1、SPI介绍 2、Java SPI 实现 3、Dubbo Spi 实现 4、Dubbo 中扩展核心类源码解析 5、记录的知识点 1、SPI介绍 SPI : Service Provider Interface,种服务发现机制。 本质是将接口实现类的全路径名配置在文件中,由服务加载器读取配置文件,加载实现类。 可以在运行时,动态为接口替换实现类。 可以很容易的通过 SPI 机制为我们的程序提供拓展功能。 SPI 机制在第三方框架中也有所应用。 2、Java SPI 实现 定义一个接口及对应的方法 public interface IJavaSpiService { Object say(String param); } 实现接口定义的方法 public class JavaSpiServiceImpl implements IJavaSpiService { @Override public Object say(String param) { System.out.println("java spi impl "+param); return "java spi impl"; } } public class Java1SpiServiceImpl implements

Python实战:病毒困我于斗室,桌面带我去旅行

吃可爱长大的小学妹 提交于 2020-04-05 18:52:24
文章目录 1. 用Python设置Windows壁纸 2. 随机切换Windows壁纸 3. 定时切换Windows壁纸 近代史上,每一个庚子年都不寻常:1840年鸦片战争,1900年八国联军侵华,1960年大饥荒。2020年的这个春节,一场突如其来的新型冠状病毒疫情横扫东亚,大有席卷全球之势。这场无妄之灾,使得很多人放弃了聚会和旅行的计划,大家不得不蜗居于斗室。但是,病毒再猖狂,也无法阻止程序员对于美好的生活的向往。今天,我来教大家用Python做一个壁纸切换工具,展示以前旅行的照片,让桌面带我们去周游世界! 1. 用Python设置Windows壁纸 设置Windnows壁纸,需要修改Windows注册表,用Python操作Windows注册表,一般使用Pywin32模块。该模块包装了几乎所有的Windows API,可以方便地从Python直接调用。Pywin32允许你像VC一样的形式来使用Python开发win32应用,代码风格可以类似win32 sdk,也可以类似MFC,由你选择。安装Pywin32模块,可以使用如下命令直接安装,也可以从 Python模块仓库 下载whl文件在本地安装。 python -m pip install pywin32 用Python设置Windows壁纸,分为5步,核心代码只有5行: import win32api import