栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2、logback-spi机制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2、logback-spi机制

SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。他是一种服务发现机制。它通过在ClassPath路径下的meta-INF/services文件夹查找文件,自动加载文件里所定义的类。
主要是使用,java.util包下的ServiceLoader实现:

public static  ServiceLoader load(Class service, ClassLoader loader) {
 	return new ServiceLoader<>(service, loader); 
 }
使用spi机制配置logback 第一步:创建maven项目,添加依赖

	4.0.0
	com.example
	logging-test
	0.0.1-SNAPSHOT

	
		8
		8
	

	
		
			junit
			junit
			4.12
		

		
			ch.qos.logback
			logback-classic
			1.2.10
		

	

	
		
			
				org.apache.maven.plugins
				maven-compiler-plugin
				3.8.1
				
					${maven.compiler.source}
					${maven.compiler.target}
					UTF-8
				
			
		
	

第二步:创建MyConfiguration
package com.example.test;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.Configurator;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
import ch.qos.logback.core.spi.ContextAwarebase;

public class MyConfiguration extends ContextAwarebase implements Configurator {

	public MyConfiguration() {
	}

	public void configure(LoggerContext lc) {
		addInfo("Setting up default configuration.");

		ConsoleAppender ca = new ConsoleAppender();
		ca.setContext(lc);
		ca.setName("console");
		LayoutWrappingEncoder encoder = new LayoutWrappingEncoder();
		encoder.setContext(lc);

		// same as
		 PatternLayout layout = new PatternLayout();
		 layout.setPattern("logback %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
//		TTLLLayout layout = new TTLLLayout();

		layout.setContext(lc);
		layout.start();
		encoder.setLayout(layout);

		ca.setEncoder(encoder);
		ca.start();

		Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
		rootLogger.addAppender(ca);
	}
}

第三步:在resources下创建文件 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b16fee3d0e484ba1a8c8d8420986323b.png) ch.qos.logback.classic.spi.Configurator
com.example.test.MyConfiguration

其中在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模拟");
    }
}

第四步:创建文件 org.example.logback.Diver文件是接口的全限定名,因为这项目是具体的实现,需要知道规范的接口全限定名,然后在文件里写入实现类的全限定名。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2b1b323d43764dec9dc7bdb82b15430c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pCe6ZKx6Ieq5b6L,size_13,color_FFFFFF,t_70,g_se,x_16)

org.example.logback.Diver:

org.example.mysql.MySqlDiver
第五步:将项目打成jar包

点击ok

jar包位置,点击ok

然后我们会在项目中发现

在logging项目里 第二步:依赖模拟的mysql驱动

弹出你要加的依赖包的文件框

然后ok

第三步:创建测试代码
package org.example.logback;

import java.util.Iterator;
import java.util.ServiceLoader;

public class Spi {

    public static void main(String[] args) {
        ServiceLoader load = ServiceLoader.load(Diver.class);
        Iterator iterator = load.iterator();
        while (iterator.hasNext()){
            Diver diver = iterator.next();
            if (diver!=null){
                diver.getConnection();
            }
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号