自定義logger註解, 簡化log4j的配置

2021-08-24 19:55:00 字數 1310 閱讀 5395

上次在參加支付寶架構培訓的時候, 看到他們框架中有乙個不錯的對logger的註解來簡化定義, 具體用法如下:

@logger

private static log log;

當時覺得不錯, 也沒問他們怎麼實現的, 後來自己做了乙個, 基本原理如下:

通過自定義乙個beanpostprocessor, 在對所有bean初始化之前, 對每乙個bean的field進行檢查, 是否適用了logger註解, 如果有, 則呼叫logfactory建立乙個logger例項.

做法如下:

1.定義乙個logger註解:

@retention(retentionpolicy.runtime)

@target( )

public @inte***ce logger

2.建立乙個beanpostprocessor(這個是重點)

public class logbeanpostprocessor implements beanpostprocessor 

public object postprocessbeforeinitialization(object bean, string beanname) throws bean***ception

return bean;

}/**

* 取得指定bean的class以及所有父類的列表, 該列表排列順序為從父類到當前類

* @param bean

* @return

*/private list> getallclasses(object bean)

collections.reverse(clazzes);

return clazzes;

}/**

* 對logger變數進行初始化

* * @param bean

* @param clazz

*/private void initializelog(object bean, class<? extends object> clazz)

if (!field.gettype().isassignablefrom(log.class))

field.setaccessible(true);

try catch (exception e) }}

}

3.在spring beans配置檔案中加入如下配置:

不過這種做法也有乙個缺點, 就是這些log的類必須是受spring管理的bean, 否則log將無法被初始化.

自定義註解

target elementtype.field retention retentionpolicy.runtime public inte ce setvalue以上就是乙個自定義的註解,下面來進行說明。target elementtype.field 表示支援該註解的程式元素,field就是屬性...

自定義註解

三個重要元註解 target 即註解的作用域,用於說明註解的使用範圍 即註解可以用在什麼地方,比如類的註解,方法註解,成員變數註解等等 elemenettype.constructor 構造器宣告 elemenettype.field 域宣告 包括 enum 例項 elemenettype.loca...

自定義註解

三個重要元註解 target 即註解的作用域,用於說明註解的使用範圍 即註解可以用在什麼地方,比如類的註解,方法註解,成員變數註解等等 elemenettype.constructor 構造器宣告 elemenettype.field 域宣告 包括 enum 例項 elemenettype.loca...