Xudong's Blog

让MDC在各种线程间穿梭自如

在Java应用中,Logback或Log4j的MDC可以帮我们实现在记录日志时携带当前上下文之外的信息。一个典型的应用场景是,当一个HTTP请求进入Spring应用后,在拦截器中向MDC写入为当前请求生成trace id / transaction id,后续业务类中打印的log都可以携带id,方便日志的定位。

MDC的实现方式

由于我们经常使用Slf4j之类的log facade,在使用时只需要关心类似org.slf4j.MDC的类提供的接口就可以。但是在具体日志库实现时,通常会实现一个MDCAdapter接口以便门面MDC类调用。不论是Logback还是Log4j,实现MDC的方式都是通过ThreadLocal来存储我们写入MDC的数据。

控制反转与依赖注入

什么是控制反转

控制反转(Inversion of Control, 缩写IoC),是一种面向对象的设计原则。从字面上理解,就是让控制权从类本身移交给其他类。那么是哪些控制权被反转了?答案是:“依赖对象的创建”这个控制权被移交了。移交给谁了?答案是:IoC容器。

这样做带来的好处就是降低代码之间的耦合度,业务代码的对于底层类的依赖被降低后,底层实现就可以更容易地改变,业务代码也更容易被复用。

Java中的equals和hashCode方法

equals()

java中处处是对象。所有类都继承自Object基类,Object基类拥有一个equals()方法。所以无论是继承自Object,还是override了基类的,所有类都拥有equals()方法。

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}
Java中对象域的初始化

正确的初始化很重要

java中,一个类的域(或者说类的属性,类的数据成员)可以是基本数据类型,也可以是对象的引用。对象域如果没有被初始化,会被置为null,如果在置为null的引用上调用方法,我们就会得到一个运行时错误。
在恰当的时间,恰当的位置,正确地初始化对象域是很重要的。

初始化的位置

Java中的基本类型和自动装拆箱

基本数据类型及包装类

Java中的基本数据类型有byte、short、int、long、float、double、boolean、char。这几个类型都有其对应的包装类,表格中清晰展示了它们对应的包装类:

简单类型 二进制位数 封装类
boolean 1 Boolean
byte 8 Byte
char 16 Character
short 16 Short
int 32 Integer
long 64 Long
float 32 Float
doubel 64 Double
void Void