java注解浅析,java自定义注解并结合aop实现权限控制

java注解浅析,java自定义注解并结合aop实现权限控制(一)

本篇文章记录了自己对java注解的一些浅薄理解和自定义注解的简单用法,结合aop实现权限控制戳这里
java自定义注解结合aop实现权限控制
关于注解:

其实我觉得对很多刚入门java的同学来讲,注解是很神秘的东西,因为点进去什么逻辑都看不见,但是他却能实现很多很神奇的功能,spring里面提供的各种注解使用可能都够学习一阵子。带着神秘感的东西学起来肯定不爽,我们先来看一段代码

package com.yinyuecheng.jioencryption.DiyIntegerface;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Forbid {
    int age() default 18;
    String sex() default "1";
}

以上就是一个完整定义的注解,不要怀疑,就是完整的。

官方的说法,注解是一种元数据,文绉绉的,不好理解。我的理解,注解其实就是一个标记,他可以携带一部分信息(数据)。标记是个很死的东西,也就是说注解本身是不会去触发什么逻辑的,只有当有人(代码)看到了(识别)到了这个标记(注解),然后去针对这个标记去做做对应的逻辑。

打个比方,你每天都开车走二环上班,突然有一天走到一半,路上出现了一个前方施工请绕行的牌子(注解),你就知道要换路了,至于怎么换,取决于开车的人(代码逻辑)。

下面我们解读一下上图的代码
@Target 这个是元注解,jdk提供的注解的注解,作用是申明注解的适用范围(CLASS: 类,METHOD:方法,PARAMETER:参数),这三个是比较常用的,另外还有package啥的,这里不一一赘述。

@Retention 这个也是元注解,表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:
SOURCE:注解仅在编译时生效(比如@override)
CLASS:注解在class文件中可用,但会被JVM丢弃
RUNTIME:JVM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。我们自定义注解一般都用这个

另外还有两个元注解
@Document表示将注解包含在Javadoc中
@Inherited 允许子类继承父类中的注解

然后就是注解里面的属性,这是注解可以携带的信息,目前只支持基本数据类型(不是包装类),String还有enum,注解可以完全不带参数,带上的好处是可以多携带一些信息方便逻辑处理,带参数的注解使用起来是这样的,

  	@Override
    @Forbid(age = 16,sex="2")
    @RoleValid(role=RoleValidEnum.SVIP)
    public List queryProfessionInfo(PageInfo pageInfo,String test) {
        logger.info("queryProfessionInfo begin,param:{}",pageInfo);
        if(null == pageInfo){
            pageInfo = new PageInfo();
            pageInfo.setLimit(30);
            pageInfo.setOffset(0);
        }
        List pos = xuanwoGroupDao.queryProfessionInfo(pageInfo);
        return pos;
    }

可以自定义一些属性来初始化这个注解,之后可以读取这个注解的属性,做什么就看实际需求了,当然也可以不定义参数,那么这个注解的属性就是默认值age=18 sex=”1”

此时的注解是没有任何实际作用的,因为我们没有定义他的注解处理器,注解处理器简单来讲,就是先通过反射获取方法(类,属性)上的注解信息,然后读取注解的属性,再根据这些属性做一些逻辑处理。即:识别到注解-------解析注解信息--------根据注解携带信息做逻辑处理,上代码

public class ForbidResolve {
    public static UserPower parseForbid(Class forbidClass, String methodName) throws Exception{//传入被监控(注解)的class对象,方法名,用于获取Method对象,可以使用任意方法,最终目的是获取method对象,因为我们的注解是作用于方法的,其余场景可以类推
        Method method = forbidClass.getMethod(methodName, new Class[]{PageInfo.class,String.class});
        UserPower userPower =new UserPower();
        if(method.isAnnotationPresent(Forbid.class)){//判断是否包含某注解
            Forbid forbid = method.getAnnotation(Forbid.class);//获取某注解
            String sex = forbid.sex();
            int age = forbid.age();
            userPower.setAge(age);
            userPower.setSex(sex);
            System.out.println("~~~~~~~~~~~~~~age~~~~~~~~~~~~"+age);
            System.out.println("~~~~~~~~~~~~~~sex~~~~~~~~~~~~"+sex);
        }
        return userPower;
    }

测试代码

    public static void main(String[] args) throws Exception {
        ForbidResolve.parseForbid(BasicInfoServiceImpl.class,"queryProfessionInfo");
    }

以上就是对注解的一些简单说明和解析。看起来是不是没啥用,没关系,当结合过滤器或者aop的时候,这个注解的作用绝对会让你眼前一亮。

写在后面的废话:入坑java也有数年了,也过了心安理得百度google别人现成的知识的阶段,感谢一路走来各路大神无私的分享你们的经验和知识,没有你们,我肯定是吃不了这碗饭的。也希望我的这些东西能给别人带来一些帮助(没人看就当个人笔记了),由于个人能力有限,有些地方有错误的麻烦各路大神及时批评指正,随便喷,但是希望能给出正确的结论,毕竟要是误导了别人就真是罪过了。

你可能感兴趣的:(java,java注解,自定义注解,aop,权限系统)