前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java自定义注解实现和企业级应用

Java自定义注解实现和企业级应用

作者头像
林老师带你学编程
发布2019-05-26 00:00:36
6760
发布2019-05-26 00:00:36
举报
文章被收录于专栏:强仔仔

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1434215

现在Java越来越倾向于少配置多注解的模式了,今天给大家介绍一下在Java中如何实现自定义注解。然后再教大家怎么利用这个自定义注解来记录接口请求的日志信息。

下面我们首先来看一下自定义注解的实现过程,我以我们项目中的自定义注解举例子,我们先看一下下面这段的代码:

/**

* Created by wangjun on 2017/10/12.

* 自定义注解

*/

@Target({ElementType.PARAMETER, ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface SystemLog {

/**

代码语言:txt
复制
 _\* 操作模块_
代码语言:txt
复制
 _\*_ _**@return**_

*/

public String module() default "";

/**

代码语言:txt
复制
 _\* 操作内容,如:添加用户_
代码语言:txt
复制
 _\*_ _**@return**_

*/

public String operationDesc() default "";

}

大家可能看到头顶上的这些注解可能还是一脸懵逼,不知道各自有什么作用,下面和大家仔细说明一下这些注解的含义。

java.lang.annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):

@Documented –注解是否将包含在JavaDoc中

@Retention –什么时候使用该注解

@Target –注解用于什么地方

@Inherited – 是否允许子类继承该注解

1.)@Retention– 定义该注解的生命周期

● RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。

● RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式

● RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

2.)Target – 表示该注解用于什么地方。默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括

● ElementType.CONSTRUCTOR:用于描述构造器

● ElementType.FIELD:成员变量、对象、属性(包括enum实例)

● ElementType.LOCAL_VARIABLE:用于描述局部变量

● ElementType.METHOD:用于描述方法

● ElementType.PACKAGE:用于描述包

● ElementType.PARAMETER:用于描述参数

● ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明

3.)@Documented–一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。

4.)@Inherited – 定义该注释和子类的关系

代码语言:txt
复制
 @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

含义说明完了,接在来的问题就是我们要怎么把他用在项目中呢,具体的实现要怎么写。大家不用着急,容我徐徐道来。

在我们项目中这个自定义注解只用来做一件事情,就是做接口日志收集,将收集到的日志打印到ELK(日志系统)中去。所以我们需要在每一个接口上面都填加这个注解,然后在利用切面类来收集这些接口的日志,将日志信息全部打印到ELK(日志系统)中去。下面我们来看具体的实现:

关于这个切面类里面的注解我就不做过多的介绍了,这边我推荐大家两篇博客,大家一看就知道这些注解的含义了。

@AspectJ 切面注解中五种通知注解:https://blog.csdn.net/u010502101/article/details/78823056

@Pointcut的用法:https://blog.csdn.net/qq_15037231/article/details/78159456

还有些人可能还想要继续深入的了解一下,比如自定义注解他的实现原理是什么,那我这边在给大家在介绍一下自定义注解的实现过程:

注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。

关于注解的其它使用场景、注解本身的功能介绍我这边就不细说了,推荐大家一遍博客,里面的内容很全。博客地址:https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年07月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档