原文:https://my.oschina.net/wangnian/blog/801348

前言: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);
} }

JAVA自定义注解SpringAOP的更多相关文章

  1. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  2. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  3. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  4. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  5. Java自定义注解的实现

    Java自定义注解的实现,总共三步(eg.@RandomlyThrowsException): 1.首先编写一个自定义注解@RandomlyThrowsException package com.gi ...

  6. Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性) 前言:由于前段时间忙于写接口,在接口中需要做很多的参数校验,本着简洁.高效的原则,便写了这个小工具供自己使用(内容 ...

  7. JAVA自定义注解 ------ Annotation

    日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...

  8. Java自定义注解和运行时靠反射获取注解

    转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...

  9. SpringBoot+SpringAOP+Java自定义注解+mybatis实现切库读写分离

    一.定义我们自己的切库注解类 自定义注解有几点需要注意: 1)@Target 是作用的目标,接口.方法.类.字段.包等等,具体看:ElementType 2)@Retention 是注解存在的范围,R ...

随机推荐

  1. Luogu P1750 【出栈序列】

    一眼(万年)贪心minn设小调不出来祭 首先要保证更靠前的输出更小那么容易想到,对于之后可能入栈的元素(即栈的剩余空间仍能装下的所有元素),我们可以取其中的最小值minn,和栈顶元素$top$比较,如 ...

  2. Java事务管理之Spring+Hibernate

    环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopallianceorg.aspe ...

  3. SQL SERVER2008 镜像全攻略

    --在非域控环境中创建数据库镜像, 我们必须使用证书来创建数据库镜像. 大致的步骤包括: --在为数据库镜像配置的每个服务器实例上执行下列步骤: --在 master 数据库中,创建数据库主密钥. - ...

  4. Icon.png pngcrush caught libpng error:Read

    [问题处理]Icon.png pngcrush caught libpng error:Read Error 遇到问题 在项目Archive时,遇到 Icon.png pngcrush caught ...

  5. MongoDB查询用法大全

    转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册: http://www.mongodb.org/d ...

  6. Mybatis入门及Dao开发方式

    本节内容: Mybatis介绍 使用jdbc编程问题总结 Mybatis架构 Mybatis入门程序 Dao的开发方式 SqlMapConfig.xml文件说明 一.Mybatis介绍 MyBatis ...

  7. 一步一步学习IdentityServer4 (4) 处理特殊需求之-登录等待页面

    用IdentityServer3的时候登录如果采用Post方式大家会发现有中间有一个等待Submit空白页面,界面不友好,现在我想把这个修改自定义的页面Loading 在Identityserver3 ...

  8. CCF CSP 201509-3 模板生成系统

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-3 模板生成系统 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据 ...

  9. HBase(二)CentOS7.5搭建HBase1.2.6HA集群

    一.安装前提 1.HBase 依赖于 HDFS 做底层的数据存储 2.HBase 依赖于 MapReduce 做数据计算 3.HBase 依赖于 ZooKeeper 做服务协调 4.HBase源码是j ...

  10. Django实战(9):实现Product的输入校验

    让我们完成上一节中的任务: 1.验证price>0:需要在Form中验证: 2. 验证title唯一:在Model中验证: 3. 验证image_url的扩展名:在Form中验证,还可以顺便在M ...