Springboot启动原理自动装配的声明看这一篇就够了-简洁易懂(持续更新中)

忧郁的双鱼座程序员

一、什么是SPI机制

SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。
这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。我们先通过一个很简单的例子来看下它是怎么用的 -》点击跳转百度百科讲解。

二、spring的spi机制

2.1代码实现

我们先来用代码体验一下 再去深究其原理问题,
项目结构
在这里插入图片描述

2.2 SPI 我们都要了解什么

首先我们要探知挖透 spi机制 我们要了解的技术点有 类加载机制 类加载器 双亲委派模型

定义接口层

package com.mb.javaspi;
/**
 * 调用 需要移步 text 模块
 */

public interface SpringSpiDemoService {

    void show();
}

定义两个实现类

package com.mb.javaspi;
package com.mb.javaspi.impl;

import com.mb.javaspi.SpringSpiDemoService;
/**
 * 实现类一
 */
public class SpringSpiDemoServiceImpl1 implements SpringSpiDemoService {
    @Override
    public void show() {
        System.out.println("this is SpringSpiDemoImpl【1】 instantiation class");
    }
}


package com.mb.javaspi.impl;

import com.mb.javaspi.SpringSpiDemoService;

/**
 * 实现类二
 */
public class SpringSpiDemoServiceImpl2 implements SpringSpiDemoService {
    @Override
    public void show() {
        System.out.println("this is SpringSpiDemoImpl【2】 instantiation class");
    }
}


WEB-INF下面建立services 文件夹 并且建立接口名字相同的文件 存放实现类的全类名
调用接口 实现api机制

package run;

import com.mb.javaspi.SpringSpiDemoService;
//import sun.misc.Service;
import java.util.Iterator;
import java.util.ServiceLoader;

public class Test {
    public static void main(String[] args) {
        //  Iterator<SpringSpiDemoService> providers = Service.providers(SpringSpiDemoService.class);
        ServiceLoader<SpringSpiDemoService> load = ServiceLoader.load(SpringSpiDemoService.class);

       /* while(providers.hasNext()) {
            SpringSpiDemoService ser = providers.next();
            ser.show();
        }*/
        System.out.println("--------------------------------");
        Iterator<SpringSpiDemoService> iterator = load.iterator();
        while(iterator.hasNext()) {
            SpringSpiDemoService ser = iterator.next();
            ser.show();
        }
    }
}

经上面我们就可以将 接口下面的实现类罗列出来

2.3 spring的spi机制(代码解读)

jdk 8 的 ServiceLoader

public final class ServiceLoader<S> implements Iterable<S>
    //配置文件的路径
    private static final String PREFIX = "META-INF/services/";
    //加载的服务类或接口
    private final Class<S> service;
    //已加载的服务类集合
    private LinkedHashMap<String,S> providers = new LinkedHashMap<>();
    //类加载器
    private final ClassLoader loader;
    //内部类,真正加载服务类
    private LazyIterator lookupIterator;
}

jdk 11 的 ServiceLoader


public final class ServiceLoader<S>
    implements Iterable<S>
{
    // //加载的服务类或接口
    private final Class<S> service;

    // 装载属性
    private final String serviceName;

    // The module layer used to locate providers; null when locating
    // providers using a class loader
    private final ModuleLayer layer;

    // The class loader used to locate, load, and instantiate providers;
    // null when locating provider using a module layer
    private final ClassLoader loader;

    // The access control context taken when the ServiceLoader is created
    private final AccessControlContext acc;

    // The lazy-lookup iterator for iterator operations
    private Iterator<Provider<S>> lookupIterator1;
    private final List<S> instantiatedProviders = new ArrayList<>();

    // The lazy-lookup iterator for stream operations
    private Iterator<Provider<S>> lookupIterator2;
    private final List<Provider<S>> loadedProviders = new ArrayList<>();
    private boolean loadedAllProviders; // true when all providers loaded

总共有三个 ServiceLoader 的构造方法 三个方法的作用
1、初始化此类的新实例以查找服务提供程序
2、@ServiceConfigurationError 如果{@code-svc}无法被{@codecaller}或调用方访问
3、@apiNote供ResourceBundle使用
这个方法 主要是 创建了一些属性,重要的是实例化了内部类,LazyIterator。

三、springboot的spi机制:

3.1 代码实现

SpringBoot-autoconfigure 也可以叫自动装配

3.2 代码解读

3.3 自动装配的实现原理

3.3.1 自动装配的原理

3.3.2 从springboot启动流程中寻找自动装配的原理

3.4 动手构建一个sart

springboot 启动流程

springboot 自动装配原理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值