slf4j

MyBatis 为什么可以兼容所有日志框架?

人走茶凉 提交于 2020-11-21 11:09:30
点击上方蓝色字体, 选择“标星公众号” 优质文章,第一时间送达 关注公众号后台回复 pay 或 mall 获取实战项目资料+视频 作者:可乐 来源:blog.csdn.net/zwx900102/article/details/109025846 前言 日志,在我们开发中是一个非常重要的话题,良好的日志打印可以帮助我们快速的定位问题,可能现在我们开发用到最多的日志框架就是slf4j了,但是日志还有其他很多优秀的框架,比如:Apache Common Log,Log4j,java.util.logging等。 MyBatis作为一款优秀的ORM框架,定义了一套统一的日志接口供应用层调用,而底层却利用适配器模式兼容了我们上面所列出来的常用日志框架。 MyBatis日志分类 在介绍MyBatis的全局配置文件的时候,我们提到setting内有一个属性logImpl,可以配置的选项有:SLF4J,LOG4J,LOG4J2,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING。 这就说明MyBatis支持六种日志类型(NO_LOGGING是不打印日志)。我们看一下MyBatis的日志模块也可以很明显的看出六种日志类型: 它们的对应关系为: PS:需要注意的是,SLF4J并不是一个具体的日志框架

MyBatis 是如何兼容所有日志框架的?

情到浓时终转凉″ 提交于 2020-11-21 10:29:33
点击上方 一个优秀的废人 , 选择 设为星标 优质文章,及时送达 巨人的肩膀: blog.csdn.net/zwx900102/article/details/109025846 前言 日志,在我们开发中是一个非常重要的话题,良好的日志打印可以帮助我们快速的定位问题,可能现在我们开发用到最多的日志框架就是 slf4j 了,但是日志还有其他很多优秀的框架,比如:Apache Common Log,Log4j,java.util.logging 等。 MyBatis 作为一款优秀的 ORM 框架,定义了一套统一的日志接口供应用层调用,而底层却利用适配器模式兼容了我们上面所列出来的常用日志框架。 MyBatis 日志分类 在介绍 MyBatis 的全局配置文件的时候,我们提到 setting 内有一个属性 logImpl,可以配置的选项有:SLF4J,LOG4J,LOG4J2,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING。 这就说明 MyBatis 支持六种日志类型 (NO_LOGGING 是不打印日志)。我们看一下 MyBatis 的日志模块也可以很明显的看出六种日志类型: 日志类型 它们的对应关系为: PS: 需要注意的是,SLF4J 并不是一个具体的日志框架,也就是我们不能单独只配置 SLF4J

Activiti6.0教程 Service用途剖析 (二)

流过昼夜 提交于 2020-11-21 06:55:30
这节我们学习下Activiti的7大对象,首先我们从ProcessEngine接口开始看。 /* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package

JAVA实现延时过期MAP 支持自定义过期触发事件

旧巷老猫 提交于 2020-11-21 04:10:45
如题,直接上代码: 1 import java.util.Iterator; 2 import java.util.concurrent.ConcurrentHashMap; 3 import java.util.concurrent.TimeUnit; 4 5 import org.slf4j.Logger; 6 import org.slf4j.LoggerFactory; 7 8 /** 9 * 实现延时过期MAP集合 支持自定义过期触发事件 10 * 11 * @ClassName: BaseExpireMap 12 * @Description: TODO 13 * @author : wangs 14 * @date: 2017-12-25 上午9:59:04 15 * @param <K> 16 * @param <V> 17 */ 18 public abstract class BaseExpireMap<K, V> { 19 protected static final Logger logger = LoggerFactory.getLogger(BaseExpireMap. class ); 20 private long expTime = 0L ; 21 private TimeUnit unit = null ; 22 /** 23 *

Netty如何实现同一个端口接收TCP和HTTP请求

百般思念 提交于 2020-11-19 14:05:24
前言 在java的网络编程世界里,Netty的地位可谓是举足轻重,说到基于NIO的网络编程,Netty几乎成为企业的首选,本文不会过多介绍Netty的基本使用等知识,本文着重介绍在Netty中如何实现同一个端口,既能接收TCP请求,也能接收Http请求。 由于一些特殊的原因,我要实现一款消息中间件,暂时称为“企业消息总线”吧。简单描述一下场景,对如果有相同或者类似场景的小伙伴可能有帮助。在企业内部,特别是制造业企业,往往会存在生产管理系统和生产控制系统。管理类系统我们都很熟悉了,但是控制类系统更多的是控制,比如控制机器的运行,接收机器的传感器传递上来的数据,然而管理系统如果要收集生产现场的数据,一般都是通过控制系统上传到管理系统,如果管理系统想要控制机器,则需要下发一些数据到控制系统,因此就存在一个管理系统到控制系统之间的通讯需求。一般的控制系统和管理系统之间都是使用TCP进行通讯,当然现在也有支持使用HTTP直接通信的,具体可以参考如下简图 今天只讨论使用TCP进行通讯的模式 需求提出 上面简单介绍了管理系统和控制系统之间的通讯模式,我们都知道,在网络编程里面,比较关注的两点就是 通讯协议 和 序列化协议 。通讯协议一般就是指传输层协议TCP/UDP或者应用层协议HTTP等协议。而序列化的就多了,常见的有protocol buffer,json或者自定义的某协议。

日志打印的正确姿势!

拈花ヽ惹草 提交于 2020-11-19 05:18:01
点击上方 "IT牧场" ,选择 "设为星标" 技术干货每日送达! 来源:http://t.cn/E9BkD7a 使用slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 实现方式统一使用: Logback框架 打日志的正确方式 什么时候应该打日志 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。 当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支 经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程 基本格式 必须使用参数化信息的方式: logger .debug (" Processing trade with id : [{}] and symbol : [{}] ", id , symbol ); 对于debug日志,必须判断是否为debug级别后,才进行使用: if (logger.isDebugEnabled()) { logger.debug( "Processing trade with id: " + id + " symbol: " + symbol); } 不要进行字符串拼接,那样会产生很多String对象,占用空间,影响性能。 反例(不要这么做): logger.debug(

干掉 try catch!

 ̄綄美尐妖づ 提交于 2020-11-15 07:47:44
软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种异常情况,所以代码中就会出现大量的 try {...} catch {...} finally {...} 代码块,不仅有大量的冗余代码,而且还影响代码的可读性。 比较下面两张图,看看您现在编写的代码属于哪一种风格?然后哪种编码风格您更喜欢? 丑陋的 try catch 代码块 优雅的Controller 上面的示例,还只是在 Controller 层,如果是在 Service 层,可能会有更多的 try catch 代码块。这将会严重影响代码的可读性、“美观性”。 所以如果是我的话,我肯定偏向于第二种,我可以把更多的精力放在业务代码的开发,同时代码也会变得更加简洁。 既然业务代码不显式地对异常进行捕获、处理,而异常肯定还是处理的,不然系统岂不是动不动就崩溃了,所以必须得有其他地方捕获并处理这些异常。 那么问题来了,如何优雅的处理各种异常? 什么是统一异常处理 Spring 在3.2版本增加了一个注解 @ControllerAdvice ,可以与 @ExceptionHandler 、 @InitBinder 、 @ModelAttribute 等注解注解配套使用,对于这几个注解的作用,这里不做过多赘述,若有不了解的,可以参考Spring3.2新注解@ControllerAdvice

GitHub爆火Java核心知识笔记,入门进阶涨薪如探囊取物

会有一股神秘感。 提交于 2020-11-13 13:12:17
前言 Github 是目前全球最大的男性同性交友平台~最近在GitHub上爆火的一份Java核心知识笔记让大家趋之若鹜,我费尽心思拿到整理后只感觉:Java技术可谓博大精深,知识体系非常丰富并且也极其复杂,因此想要学习好Java其实并不是一件非常轻松的事。当然,刚跨入编程行业的小白也无需担心,这份 Java核心知识笔记 你学完一半基本就可以找个非常不错的开发工作了,如果想要高薪,那就默默地全部学完吧! 目录 内容 本书中的章节大部分是相互独立的。你可以研究自己最感兴趣的主题,并可以按照任意顺序阅读这些章节。 JVM JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 Java集合 集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。 Java多线程并发 Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。 Java基础 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。 Spring 原理 它是一个全面的