文章目录

  • 什么是SPI:
  • 为什么要用:
  • 怎么用:
  • 有没有例子:


什么是SPI:

全称是Service Provider Interface,是Java提供的服务发现接口

为什么要用:

体现面向接口编程,用于松耦合设计

怎么用:

关键词ServiceLoader.load

有没有例子:

JDBC驱动自动发现机制就使用的SPI原理。请看DriverManager

步骤:
1、启动类加载器(bootstrapClassLoader)加载DriverManager类
2、在静态方法中执行loadInitialDrivers方法
3、加载注册驱动

private static void loadInitialDrivers() {
        String drivers;
        try {
            // 1、首先加载属性【jdbc.drivers】指定的驱动
            drivers = AccessController.doPrivileged(new PrivilegedAction<String>() {
                public String run() {
                    return System.getProperty("jdbc.drivers");
                }
            });
        } catch (Exception ex) {
            drivers = null;
        }

        AccessController.doPrivileged(new PrivilegedAction<Void>() {
            public Void run() {
				// 2、使用SPI机制加载Driver.class接口的实现类定义的驱动
                ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
                Iterator<Driver> driversIterator = loadedDrivers.iterator();
                try{
                    while(driversIterator.hasNext()) {
                        driversIterator.next();
                    }
                } catch(Throwable t) {
                // Do nothing
                }
                return null;
            }
        });

传送门:保姆式Spring5源码解析

欢迎与作者一起交流技术和工作生活