叙述问题
这个问题的意思就是,为什么加了@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的提示,
但其实并不影响程序运行,这应该可以合理解释
依赖和编译器是分开的两种东西^^