首页 > 其他分享 >自定义注解实现日志打印

自定义注解实现日志打印

时间:2023-08-27 12:31:43浏览次数:36  
标签:Loggable 自定义 切面 注解 日志 public

首先什么是自定义注解?

自定义注解是Java语言提供的一种机制,允许程序员定义自己的注解类型。注解是源代码级别的元数据,可以提供额外的信息给编译器、解析工具和运行时环境。

下面是创建自定义注解的一般步骤:

  1. 使用@interface关键字定义注解类型,注解类型名通常以@作为前缀,如@MyAnnotation
  2. 在注解类型中定义成员(属性),成员可以是任意有效的数据类型,并可以设置默认值。
  3. 在需要使用注解的地方,使用注解类型加上@符号来标记。
  4. 在代码中通过反射来获取和解析注解的信息。

常见的应用场景包括:

  • 通过注解来配置和定制框架、库或工具的行为。
  • 在测试框架中使用注解标识测试用例。
  • 在日志框架中使用注解来标记日志级别、输出格式等。
  • 在Web开发中使用注解定义路由、权限控制等。

下面使用子自定义注解进行一个简单的日志打印操作案例:

  1. 定义一个自定义注解,例如@Loggable,用于标记需要打印日志的方法或类:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Loggable {
}

上面的注解使用了@Retention@Target注解来指定注解的保留策略和作用目标。在这个例子中,我们将注解的保留策略设置为运行时(RetentionPolicy.RUNTIME),以便在运行时可以通过反射获取注解信息。注解的作用目标包括方法和类(ElementType.METHODElementType.TYPE)。

  1. 在需要打印日志的方法或类上使用自定义注解:

@Loggable
public class MyClass {
    @Loggable
    public void myMethod() {
        // 方法逻辑
    }
}
  1. 创建一个切面(Aspect)来处理带有@Loggable注解的方法,并在这些方法执行前后进行日志记录:

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;


@Aspect
public class LogAspect {
    @Before("@annotation(Loggable)")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before executing method: " + joinPoint.getSignature().getName());
    }


    @After("@annotation(Loggable)")
    public void logAfter(JoinPoint joinPoint) {
        System.out.println("After executing method: " + joinPoint.getSignature().getName());
    }
}

切面类使用了@Aspect注解来标识它是一个切面类。@Before@After注解用于指定切点表达式(@annotation(Loggable)),表示在带有@Loggable注解的方法执行前后执行切面逻辑。在这个例子中,我们简单地打印了方法名。

  1. 在应用程序的配置中启用切面:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // 配置其他Bean和设置
}

上面的配置类启用了AspectJ自动代理(@EnableAspectJAutoProxy注解)来开启对切面的支持。

  1. 使用Spring或其他容器来管理和配置应用程序。确保上述切面类和配置类被正确扫描并加入到应用程序的上下文中。当您运行带有@Loggable注解的方法时,切面将在方法执行前后打印日志。请注意,上述示例使用了Spring的AOP框架来实现切面。如果您不使用Spring等容器,您可能需要使用其他的AOP框架或手动实现切面逻辑。

自定义注解实现日志打印_打印日志

标签:Loggable,自定义,切面,注解,日志,public
From: https://blog.51cto.com/u_16226278/7252650

相关文章

  • Struts2的自定义类型转换和简单的输入校验
    这里关键是对自定义类型的理解,它和8个基本数据类型的地位是一样的,只不过这个是你自己定义的类型。那么在Struts2中什么时候要用到数据类型转换呢?其实,我们一直在用,只是我们没有感觉到而已,Struts2对8个基本数据类型以及Date、String等常见类型,会自动的用内建的类型转换器进行转换,这个......
  • 标题:在Godot中使用Node2D创建自定义的Label
    在Godot游戏引擎中,我们经常需要在游戏中显示文本信息。通常,我们可以使用Label节点来实现这一点。但是,在某些情况下,你可能希望更灵活地控制文本的显示和样式。在本篇博客中,我们将学习如何通过使用Node2D节点来创建一个自定义的Label,从而能够更好地控制文本的呈现方式。效果图步......
  • Java日志框架的依赖设置备查(SLF4J, Log4j, Logback)
    前言最近在看代码的过程中,发现身边的许多人在使用Java日志框架时,对于应该引入何种依赖不甚了解,搜索网络上的文章,常常也是互不一致。这篇文章可以看着是Java日志框架的入门使用和实践建议,重点介绍不同组合方式下的依赖设置及其背后的逻辑,一方面给自己备查,另外也希望对小伙伴们......
  • 使用filebeat监听异常日志发送redis
    使用场景:自定义监听日志关键字符,第一时间发现生产问题,实测从服务打出异常日志到redis监听到日志延迟在5s左右适用于:服务机器数有限的情况,目前全部采用手动部署的方式,一、在目标机器上部署filebeat官网下载filebeathttps://artifacts.elastic.co/downloads/beats/filebeat/......
  • Prism对话框之自定义DialogWindow
    Prism对话框之自定义DialogWindow1.自定义DialogWindow窗体样式(1)定义DialogWindow窗体类,注意要实现IDialogWindow///<summary>///CustomDialogWindow.xaml的交互逻辑///</summary>publicpartialclassCustomDialogWindow:Window,IDialogWindow{publicIDi......
  • 使用哪种注解处理后台Map参数类型,探究前端发送请求URL限制
    如何处理接口参数是Map类型探究URL限制法1:前端发送Get请求需求:为了得到分页结果,我将分页时需要的参数封装到Map中进行传递@GetMapping("/page")publicRqueryPage(@RequestParamMap<String,Object>params){}//1.测试GEThttp://localhost:8080/product/categorybrandrel......
  • linux 查询日志
    1定位错误日志所在的行数cat-ntest.log|grep"查找的错误关键字"2得到错误关键字所在行号(假设为第500行),查询错误关键字前后100行数据    cat-ntest.log|tail-n+400|head-n2003  查看日志中出现关键字 "错误的关键信息提示"的前后10行内容 cat-n......
  • Feign的自定义配置
           ......
  • Spring 常用注解
    今天给大家介绍一下Spring中的常用注解,同时这些注解也是Spring中经常用到的注解,下面我们就一起来看看都有哪些注解吧。1.@Controller在控制层使用,标识该类是SpringMVCcontroller处理器,用来创建处理http请求的对象。2.@Service在业务逻辑层使用,用于标注业务层组件。......
  • django配置swagger自动生成接口文档以及自定义参数设置
    首先安装swagger所用的包pipinstalldrf-yasg然后再settings.py中注册app     接口采用的token认证,在settings.py配置认证方式SWAGGER_SETTINGS={'USE_SESSION_AUTH':False,'SECURITY_DEFINITIONS':{......