文档章节

JAVA自定义注解SpringAOP

王念博客
 王念博客
发布于 2016/12/07 11:48
字数 716
阅读 252
收藏 2

 前言:Annotation(注解)是JDK5.0及以后版本引入的,它的作用就是负责注解其他注解。现在开发过程中大家都已经放弃了传统的XML配置的方式改为注解的方式,既简单又简洁,方便管理和维护。目前引用第三方jar包的注解都是解决技术上的问题,然而我们在工作中也需要通过注解解决业务上的一些问题,所以就得用到自定义注解。

1.自定义一个注解

创建一个 @interface的文件,则表示这是一个注解类

/*
 * 自定义注解
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SecureValid {
    String desc() default "身份和安全验证开始...";
}

2.注解的属性描述

2.1 @Target 

用于描述注解的使用范围(即:被描述的注解可以用在什么地方),其取值有:

ElementType.CONSTRUCTOR                用于描述构造器。
ElementType.FIELD                                用于描述域。
ElementType.LOCAL_VARIABLE             用于描述局部变量
ElementType.METHOD                          用于描述方法
ElementType.PACKAGE                         用于描述包
ElementType.PARAMETER                     用于描述参数
ElementType.TYPE                                 用于描述类或接口

2.2 @Retention

用于描述注解的生命周期(即:被描述的注解在什么范围内有效),其取值有:
RetentionPolicy.SOURCE                        在源文件中有效(即源文件保留)。
RetentionPolicy.CLASS                           在 class 文件中有效(即 class 保留)
RetentionPolicy.RUNTIME                      在运行时有效(即运行时保留)

2.3 @Documented

在默认的情况下javadoc命令不会将我们的annotation生成再doc中去的,所以使用该标记就是告诉jdk让它也将annotation生成到doc中去

2.4 @Inherited

 比如有一个类A,在他上面有一个标记annotation,那么A的子类B是否不用再次标记annotation就可以继承得到

3.Annotation属性值

有以下三种: 基本类型、数组类型、枚举类型

3.1 基本串类型 

public @interface UserdefinedAnnotation {  
    intvalue();  
    String name() default "zhangsan";  
    String address();  
}
使用:
@UserdefinedAnnotation(value=123,name="wangwenjun",address="火星")  
    public static void main(String[] args) {  
        System.out.println("hello");  
    }  
}

3.2 数组

public @interface UserdefinedAnnotation {  
    int[] value();  
}  
使用:  
public class UseAnnotation {  
      
    @UserdefinedAnnotation({123})  
    public static void main(String[] args) {  
        System.out.println("hello");  
    }  
} 

3.3 枚举类型

public enum DateEnum {  
    Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday  
}  
然后在定义一个annotation  
package com.wangwenjun.annatation.userdefined;  
  
public @interface UserdefinedAnnotation {  
    DateEnum week();  
}  
使用: 
public class UseAnnotation {  
    @UserdefinedAnnotation(week=DateEnum.Sunday)  
    public static void main(String[] args) {  
        System.out.println("hello");  
    }  
}

4.使用SpringAOP来增强

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;


@Aspect
@Component
public class Aspect {

    private static final Logger logger = LoggerFactory.getLogger(Aspect.class);

    //切入点
    @Pointcut("@annotation(注解的包路径)")
    public void pointcut() {
    }

    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
            //获取request
            HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();  
	        //拦截的实体类
	        Object target = joinPoint.getTarget();
	        //拦截的方法名称
	        String methodName = joinPoint.getSignature().getName();
	        //拦截的方法参数
	        Object[] args = joinPoint.getArgs();
	        //拦截的放参数类型
	        Class[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameterTypes();

            
             //TODO 处理业务代码

             

            //处理完之后放行
            Object[] args = joinPoint.getArgs();
            return joinPoint.proceed(args);
    }
      
}

 

博客地址:https://my.oschina.net/wangnian

 

 

© 著作权归作者所有

共有 人打赏支持
王念博客
粉丝 130
博文 95
码字总数 52733
作品 0
虹口
程序员
SpringAOP实现自动生成日志

项目中总要发布一下服务供系统内外调用,为了方便排查错误,入参出参都要以日志的形式记录下来。 传统做法:缺点一目了然,参数少的时候只能说还好,参数一多,烦不胜烦,浪费时间。 privat...

奋斗的海贼
2013/01/02
0
0
Java注解(Annotation)详解

Java注解(Annotation)详解 1.Annotation的概念 An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may......

幻海流心
05/23
0
0
Java注解教程:自定义注解示例,利用反射进行解析

Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响。在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解。 注解是Java ...

哲别0
2017/10/23
0
0
大数据开发培训:0基础学习Java编程语言有哪些知识点?

Java 技术通用、高效、具有平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等,学习Java首先要知道学习知识点有哪些。在这就用加米谷大数据培训...

加米谷大数据
07/25
0
0
Kotlin和Java混合开发必读:基本的互操作

在使用Kotlin和Java混合开发的时候,涉及到一些基本的互操作 一、属性的读写 1.Kotlin自动识别Java的属性的Getter和Setter 2.Java操作kotlin属性可以通过Getter和Setter的方式 二、空安全类型...

王木东
04/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ在CentOS环境安装

1.废话不多说准备一台虚拟机,系统为centos,我这里使用的系统版本如下图所示:

凌晨一点
45分钟前
0
0
线程池相关

在java.util.concurrent包下,提供了一系列与线程池相关的类。 使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度。当任务到达时,任务...

edwardGe
47分钟前
0
0
学习大数据这三个关键技术是一定要掌握!

大数据时代全面来临,大数据、人工智能等技术引领科技创新潮流,获得国家政策大力支持,前景广阔。学习大数据技术的人自然是络绎不绝, 学习大数据虽然是一个趋势,但也要注意大数据培训课程...

董黎明
今天
0
0
jetbrains 上传代码到github

设置中找github 获取token 验证是否成功 测试git 生成key,一路回车即可 ssh-keygen -t rsa -C “youremail@example.com” 打开pub复制key,需要再次输入一次密码 验证是否成功,输入yes即可...

阿豪boy
今天
0
0
分布式服务框架(拾遗)

前言 现在的大部分工程都已经是基于分布式架构来处理。所以这里对分布式框架做一个简单的总结 常用的RPC框架 RPC框架原理 RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同...

kukudeku
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部