为什么加了@slf4j注解 就可以直接使用log了呢?

叙述问题

这个问题的意思就是,为什么加了@slf4j注解 就可以直接使用log了呢?
如果不使用注解,那我们使用log,需要这样定义:

    static Logger logger = LoggerFactory.getLogger("Update的日志");

这样定义还是很好理解的,之所以下面能使用,是因为开头我们声明了logger对象,所以可以用对象调用方法。
那为什么加@slf4j,注解可以用logger呢?

问题来由

其实用@slf4j这个注解也挺久了,但似乎从来没思考过为什么?
凡事我们都该多问个为什么,这可能就是我们与大神的差距吧qvq
之所以会有这个问题,是因为在使用了声明式的日志后,发现

    static Logger logger = LoggerFactory.getLogger("Update的日志");

这种和

@Slf4j
public class ClientAop {

这种的日志,其实用的是同一个api
可以使用的功能,打印的效果也是完全一样。
由此才产生了疑问:
声明式的都理解,注解是怎么做到的呢?

解答

首先明确一点,之所以注解能使用logger,这个logger其实和声明式的logger是一样的。只不过是有一股神秘力量帮我们写了这行声明对象的代码而已,而我们只需要加个

@slf4

(虽然其实也没少写几个字母)
为什么明确这点呢?看下idea编译后的类文件就知道了:
在这里插入图片描述
可以看到,和我们自己写的声明式的注解,完全一样的。这就解答了一点疑问,log从哪来

但其实还有一点疑问,这种帮助我们生成代码,编译后才能看到的操作,也不算罕见,就比如springboot,那么多的注解,其实都是在工程启动的时候,扫描这些注解,做了一些初始化操作的,比如把有@configuration的类塞到容器中。

但是这些对象都是程序启动后才有的呀,但是为什么我们的@slf4j直接还没编译,我们就能用log了呢?
不知道小伙伴们有没有看懂我的问题,如果没看懂
emm再看一遍
其实这个原因也简单,只不过可能我们没有自己实战过,没见过没亲手操作过所以觉得神奇。
其实如果纯用jar包里的代码的话,确实难以实现,这就得益于lombok插件了
这里贴出lombok插件的官网:
Lombok官网:https://projectlombok.org
其实这就是因为Lombok项目是一种自动接通你的编辑器和构建工具的一个Java库

可以理解为有了@slf4j,编辑器里就会给你加log的智能提示,但这并不代表log对象已生成。
这里其实还是挺抽象的,毕竟我们习惯于new对象后才能有提示的惯性思维。
但其实,new对象是new对象,智能提示是编译器的功劳,这俩并不强耦合。
比如你去用纯编译器写写代码,完全没有提示,只有当你编译的时候才会报错^^

把这两个分开,那log提示就可以理解了,其实得益于lombok插件。

举个小例子
加入log的依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
    <scope>provided</scope>
</dependency>

但是不安装lombok的插件,此时你写代码不会有log的提示,
在这里插入图片描述
但其实并不影响程序运行,这应该可以合理解释
依赖和编译器是分开的两种东西^^

  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值