創建一個新的@Log
註釋。
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {}
現在實行BeanPostProcessor
這使我們postProcessBeforeInitialization
方法,它使我們能夠初始化之前管理的bean。我們搜索@Log
註釋並注入LoggerFactory
的實現。
@Component
public class LoggerPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
ReflectionUtils.doWithFields(bean.getClass(), new ReflectionUtils.FieldCallback() {
public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
Logger log = LoggerFactory.getLogger(bean.getClass());
ReflectionUtils.makeAccessible(field);
field.set(bean, log);
}
}, new ReflectionUtils.FieldFilter() {
@Override
public boolean matches(Field field) {
return field.isAnnotationPresent(Log.class);
}
});
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
,並使用@Log
標註在現場級來形容,我們要注入的記錄器。
@Log
private Logger logger;
看看https://stackoverflow.com/questions/3923971/why-calling-loggerfactory-getlogger-every-time-is-not-recommended! –
不,但我創建了一個ILoggable接口,我創建了一個與鏈接中提到的方式相同的日誌對象。創建了一個Log類並實現了ILoggable。當我在Log類中使用日誌對象時,輸出表明日誌屬於ILoggable而不是Log類。輸出是類似這樣的「cccservice.ILoggable:test」而不是「cccservice.Log:test」 – Reza
你有2個選擇:要麼使用私有靜態最終記錄器LOG = LoggerFactory.getLogger(MethodHandles.lookup()。lookupClass ())'作爲你的日誌定義,你可以在IntelliJ Idea(Eclipse有類似的東西)中聲明爲活動模板,並且在輸入模板詞時,IDE將用propper代碼替換這個詞,或者使用項目Lombok並定義簡單['@ Log','@ Slf4j',...](https://projectlombok.org/features/Log.html)關於課程級別的註釋 –