其中在meta-INF/services文件夹下的ch.qos.logback.classic.spi.Configurator文件并不是随便建的,是参考logback源码里的autoconfig方法的Configurator c = EnvUtil.loadFromServiceLoader(Configurator.class);该行代码的Configurator类的全限定名,因为spi的大致原理是当执行到EnvUtil.loadFromServiceLoader(Configurator.class)这行代码时,他会去meta-INF/services目录下找到Configurator的全限定名的文件,获取该文件里的内容,该文件里的内容基本上是一个该Configurator的实现类,然后取出来的实现类的全限定名,进行反射得到实例,然后进行其他的操作。
第四步:测试代码
package com.example.test;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestLogback {
private static final Logger logger = LoggerFactory.getLogger(TestLogback.class);
@Test
public void testLogback() {
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
}
}
spi机制模拟mysql spi机制也应用在mysql
在logging项目里
第一步:创建接口
package org.example.logback;
public interface Diver {
void getConnection();
}
在mysql-connection项目中
第一步:创建java项目
第二步:创建接口
package org.example.logback;
public interface Diver {
void getConnection();
}
第三步:创建实现类
package org.example.mysql;
import org.example.logback.Diver;
public class MySqlDiver implements Diver {
@Override
public void getConnection() {
System.out.println("mysql connection模拟");
}
}