@Slf4j这个注解,并不是Slf4j这个项目所提供的。而是由lombok这个项目提供的,这个项目的主要功能是实现了在java代码中使用注解的方式来减少代码量。
lombok这个项目使用最多的一个功能就是@Data注解。通过给一个类加上这个注解就能够自动生成getter,setter方法,而不需要自己写。以下面的java代码为例:
@Data
public class Entity{
private String name;
private String description;
private int value;
}
@Data这个注解就自动地为上述三个属性值。自动定义了getter,setter方法。
lombok这个项目代码注入的方式是通过字节码修改的方式实现的,并不像spring那样通过创建动态代理类的方法,而在编译期直接改变java的抽象语法数,实现目标代码的注入。看来是个邪恶的东西。
话说回来,@Slf4j这个注解也是具有类似的特性。它本质上代表了一段代码,但是不需要写,而是让lombok帮我们生成。@Slf4j其实就是代表了在对应的类中使用Slf4j中获取Logger对象的代码,它等价于在对应的类中插入下述代码:
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
其中LogExample是这个注解修饰的类,这样,不需要每次都使用上面的代码进行log对象的定义,加一个注解就可以使用以log命名的对象实现java Logger的功能。
这里还需要声明一点,由于lombok是在编译时才实现代码的注入,所以在编译前IDE是无法感知注解的信息的,同时也识别不了log这个对象,会产生编译错误告警。为了防止这种误报,这时就需要在IDE安装lombok的插件。以idea为例, 安装这个插件后重启IDE就能够解决log对象的无法识别的问题。