annotation java log_使用java注释来注入logger依赖关系

您可以使用BeanPostProcessor接口,该接口由ApplicationContext为所有创建的bean调用,因此您有机会填充相应的属性。

我创建了一个简单的实现,这样做:

import java.lang.reflect.Field;

import java.util.List;

import net.vidageek.mirror.dsl.Mirror;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.config.BeanPostProcessor;

import org.springframework.stereotype.Component;

@Component

public class LoggerPostProcessor implements BeanPostProcessor {

@Override

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

List fields = new Mirror().on(bean.getClass()).reflectAll().fields();

for (Field field : fields) {

if (Logger.class.isAssignableFrom(field.getType()) && new Mirror().on(field).reflect().annotation(InjectLogger.class) != null) {

new Mirror().on(bean).set().field(field).withValue(LoggerFactory.getLogger(bean.getClass()));

}

}

return bean;

}

@Override

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

return bean;

}

}

您不必执行任何复杂的注册步骤,因为ApplicationContext能够识别BeanPostProcessor实例并自动注册它们。

@InjectLogger注释是:

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)

public @interface InjectLogger {

}

然后你可以轻松地使用注释:

public static @InjectLogger Logger LOGGER;

...

LOGGER.info("Testing message");

我使用Mirror库找到注释的字段,但显然你可能会执行一个手动查找,以避免这种额外的依赖。

避免重复的代码,甚至是从其他类复制和粘贴Logger定义的小问题,实际上是一个好主意,比如当我们忘记更改类参数时,会导致错误的日志。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值