Java:深入自定义注解(Annotation)
在网上找了很多资料也有写的比较好的,但是总有有一点半点的细节没有写出来,在这里自己总结下使用。
使用Java的自定义注解,首先个人需要了解下Java为我们提供的元注解和相关定义注解的语法。(这个我在网上选择了一篇详细的介绍链接在文章最底层)
1、首先自定义我们需要的注解
package com.plat;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /*
* @Retention(RetentionPolicy.SOURCE)
* 这个注解的意思是让MyAnnotation注解只在java源文件中存在,编译成.class文件后注解就不存在了
* @Retention(RetentionPolicy.CLASS)
* 这个注解的意思是让MyAnnotation注解在java源文件(.java文件)中存在,编译成.class文件后注解也还存在,
* 被MyAnnotation注解类标识的类被类加载器加载到内存中后MyAnnotation注解就不存在了
*/
/*
* 这里是在注解类MyAnnotation上使用另一个注解类,这里的Retention称为元注解。
* Retention注解括号中的"RetentionPolicy.RUNTIME"意思是让MyAnnotation这个注解的生命周期一直程序运行时都存在
*/
//Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分
/**
* @author jwkang
*是否需要判断权限,默认为true需要判断权限,设定为false的情况下不判断权限
*/
@Documented
@Inherited
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PlatPermission { boolean validate() default true;
}
2、将自定义注解标识在不需要判断权限的方法上
@PlatPermission(validate=false)
@RequestMapping(value = "/getSelect", method = {RequestMethod.POST})
@ResponseBody
public BaseOutModel GetSelect(String selectType) {
BaseOutModel result = new BaseOutModel();
LinkedHashMap<String, String> data = new LinkedHashMap<String, String>();
try { if(!TypeOfEnum.contains(selectType))
{
result.setResult(false);
result.setErrorMessage("未找到对应信息");
return result;
}
TypeOfEnum typeOfEnum = TypeOfEnum.get(selectType);
data = EnumHelp.getZEnumDesList(typeOfEnum.getType());
result.setResult(true);
result.setResponse(data);
} catch (Exception e) {
e.printStackTrace();
logger.error("operateEmail err", e.toString());
result.setResult(false);
result.setErrorMessage("系统异常!请重试...");
return result;
}
return result;
}
3、进行权限的管控
jar包的引用:
import org.springframework.web.method.HandlerMethod;
权限的控制,注解读取
public class PlatHandlerInterceptorAdapter extends HandlerInterceptorAdapter {
private static final ILog logger = LogManager.getLogger(PlatHandlerInterceptorAdapter.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//处理Permission Annotation,实现方法级权限控制
//HandlerMethod 需要对应Jar包的位置,否则会一直为false
if (handler.getClass().isAssignableFrom(HandlerMethod.class)) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
/*
* 1、确认当前的controller是否需要进行权限判定,如果需要则进行验证。
* 2、当controller不需要验证,则验证当前的方法是否需要权限验证,需要则进行验证,不需要则跳出
* */
//获取controller注解, controller检查是否需要验证权限控制
PlatPermission permission = handlerMethod.getMethod().getDeclaringClass().getAnnotation(PlatPermission.class);
if (permission != null && !permission.validate()) //不需要验证权限
{
return super.preHandle(request, response, handler);
}
//获取方法注解,方法检查是否需要验证权限控制
permission = handlerMethod.getMethod().getAnnotation(PlatPermission.class);
if (permission != null && !permission.validate()) //不需要验证权限
{
return super.preHandle(request, response, handler);
}
// 权限判断,没有权限则跳转至无权限页面,有权限则走正常流程
xxxx
}
return super.preHandle(request, response, handler);
}
}
4、完成,整个一套的注解使用
深入Java注解(非常推荐):http://www.cnblogs.com/digdeep/p/4525567.html
Java:深入自定义注解(Annotation)的更多相关文章
- Java实现自定义注解开发
Java实现自定义注解开发 一直都对注解开发挺好奇的,最近终于有时间自己实践了一把,记录一下 万一后期会用到呢 哈哈哈 首先我们了解一下自定义注解的标准示例,注解类使用 @interface 关键字修 ...
- Java自定义注解Annotation详解
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去 ...
- JAVA自定义注解 ------ Annotation
日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...
- Java自定义注解Annotation的使用
从 jdk5开始,Java增加了对元数据的支持,也就是Annotation,Annotation其实就是对代码的一种特殊标记,这些标记可以在编译,类加载和运行时被读取,并执行相应的处理.当然刚刚说了, ...
- Java学习之注解Annotation实现原理
前言: 最近学习了EventBus.BufferKinfe.GreenDao.Retrofit 等优秀开源框架,它们新版本无一另外的都使用到了注解的方式,我们使用在使用的时候也尝到不少好处,基于这种想 ...
- java中的注解(Annotation)
转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到 ...
- Java利用自定义注解、反射实现简单BaseDao
在常见的ORM框架中,大都提供了使用注解方式来实现entity与数据库的映射,这里简单地使用自定义注解与反射来生成可执行的sql语句. 这是整体的目录结构,本来是为复习注解建立的项目^.^ 好的,首先 ...
- Java基于自定义注解的面向切面的实现
目的:实现在任何想要切的地方添加一个注解就能实现面向切面编程 自定义注解类 @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retentio ...
- java/springboot自定义注解实现AOP
java注解 即是注释了,百度解释:也叫元数据.一种代码级别的说明. 个人理解:就是内容可以被代码理解的注释,一般是一个类. 元数据 也叫元注解,是放在被定义的一个注解类的前面 ,是对注解一种限制. ...
- Android 自定义注解(Annotation)
现在市面上很多框架都有使用到注解,比如butterknife库.EventBus库.Retrofit库等等.也是一直好奇他们都是怎么做到的,注解的工作原理是啥.咱们能不能自己去实现一个简单的注解呢. ...
随机推荐
- scala 变量定义,基本操作符
scala是jvm语言,它将面向对象与函数风格结合的很好,它可以访问任何java类库并很好的结合使用. 它可以使程序更简单,同时可利用并发的威力. scala基本语法: package com.tes ...
- 本地mongochef连接其他计算机上的数据库认证失败解决方法
关闭防火墙或者在信任程序列表添加运行目录下的mongod.exe即可
- Android sensor 系统框架 (一)
这几天深入学习了Android sensor框架,以此博客记录和分享分析过程,其中难免会有错误的地方,欢迎指出! 这里主要分析KERNEL->HAL->JNI这3层的流程.主要从以下几方面 ...
- 在VirtualBox上安装Solaris 10全教程(包括下载)
您可以在博文的最下方留下评价, 也可以点击左边的 关注 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐 来支持一下喔 如果您对博文有任何疑问, 可以通过评论或发邮件的 ...
- 9、scala面向对象编程之继承
1. extends 2.override 和super 3.override field 4.isInstanceOf和asInstanceOf 5.getClass和classOf 6.使用模式 ...
- 在Windows下安装Elasticsearch5.0
1.准备工作 安装和配置Java环境 2.下载 地址:https://www.elastic.co/downloads/elasticsearch 老版本:https://www.elastic.co ...
- [源码阅读]RocketMQ-策略篇
一:为什么要阅读rocketmq的源码? 1 可以了解mq的底层实现逻辑. 二:打算怎么读,行动路径是哪儿些? 1: 本地启动 2 分步调试 3 fork项目,添加中文注释,提交到自己的代码库.并改 ...
- 扩增子图表解读1箱线图:Alpha多样性
箱线图 箱形图(Box-plot)又称为盒须图.盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图.因形状如箱子而得名.在宏基因组领域,常用于展示样品组中各样品Alpha多样性的分布 第一种情 ...
- Dynamics 365 CRM Connected Field Service 自动发送command
上期降到了怎样部署connected field service(CFS) 我们假设现在IoT 设备是温度监控器, 当温度触发我们之前预设的温度值, IoT会通过IoT Hub 发送IoT Alert ...
- ubuntu14.04远程软件VNC的安装、设置方法
ubuntu中VNCX11開機啟動保持靜默狀態方法: 1首先安裝vncx11. 2.設置vnc密碼,會自動保存在/home/test/.vnc/passwd中 3.將密碼複製到/etc中 4.在/et ...