自定义注解,并且实现,需要两个文件;

自定义注解类:

package com.clc.server.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(value = {ElementType.TYPE, ElementType.METHOD})//使用位置(类,方法)
@Retention(RetentionPolicy.RUNTIME)//加载到jvm里运行
public @interface Clc {
String value(); //注解的属性,如果只有一个属性,一般叫value
String name() default ""; //属性,默认值"",可以不写
}

定义好注解后,需要解析类来实现,此处使用aop来实现;

package com.clc.server.aop;

import com.clc.server.annotation.Clc;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component; import java.lang.reflect.Method; /**
* 解析clc注解使用
*/
@Aspect//来定义一个切面
@Component
public class ClcAop { //定义切入点
@Pointcut("@annotation(com.clc.server.annotation.Clc)")
public void auditAspect() {
System.out.println("1221212132");
} //通知
@Before("auditAspect()")
public void doBefore(JoinPoint joinPoint) {
System.out.println("触发到 @Before(\"auditAspect()\")");
} /**
* 后置通知
*
* @param joinPoint 切点
*/
@AfterReturning("auditAspect()")
public void doAfrterReturning(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs();
System.out.println("触发 @AfterReturning(\"auditAspect()\")");
System.out.println(args.length);
getControllerMethodDescription(joinPoint);
} /**
* 获取注解中对方法的描述信息
*
* @param joinPoint 切点
* @return 方法描述
*/
public static void getControllerMethodDescription(JoinPoint joinPoint) {
String targetName = joinPoint.getTarget().getClass().getName(); //获得执行方法的类名
String methodName = joinPoint.getSignature().getName(); //获得执行方法的方法名
Object[] arguments = joinPoint.getArgs(); //获取切点方法的所有参数类型
try {
Class targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods(); //获取公共方法,不包括类私有的
String value = "";
String name = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes(); //对比方法中参数的个数
if (clazzs.length == arguments.length) {
value = method.getAnnotation(Clc.class).value();
name = method.getAnnotation(Clc.class).name();
break;
}
}
}
System.out.println("value=" + value);
System.out.println("name=" + name);
} catch (Exception e) {
e.printStackTrace();
}
}
}

测试注解,使用

   /**
* 测试自定义注解
*/
@Clc(value = "clc", name = "name")
@RequestMapping(value = "/add2", method = RequestMethod.GET)
public String add2() {
//获取本服务的信息
ServiceInstance instance = client.getLocalServiceInstance();
Integer r = 2;
String info = "/add, host:" + instance.getHost() + ", service_id:" + instance.getServiceId() + "结果:" + r;
logger.info(info);
return info;
}

触发注解后:

2018-09-13 20:11:07.487  INFO 14012 --- [nio-9003-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-09-13 20:11:07.487 INFO 14012 --- [nio-9003-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
2018-09-13 20:11:07.514 INFO 14012 --- [nio-9003-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 27 ms
触发到 @Before("auditAspect()")
2018-09-13 20:11:07.554 INFO 14012 --- [nio-9003-exec-1] c.c.s.c.ComputeController@7fcff1b9 : /add, host:localhost, service_id:clc-service结果:2
触发 @AfterReturning("auditAspect()")
0
value=clc
name=name
2018-09-13 20:15:44.844 INFO 14012 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration

简单的自定义注解,已经实现

aop+自定义注解的更多相关文章

  1. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  2. ssm+redis整合(通过aop自定义注解方式)

    此方案借助aop自定义注解来创建redis缓存机制. 1.创建自定义注解类 package com.tp.soft.common.util; import java.lang.annotation.E ...

  3. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  4. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  5. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  6. SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!

    往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...

  7. redis分布式锁-spring boot aop+自定义注解实现分布式锁

    接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...

  8. 使用AOP+自定义注解完成spring boot的接口权限校验

    记使用AOP+自定义注解完成接口的权限校验,代码如下: pom文件添加所需依赖: 1 <dependency> 2 <groupId>org.aspectj</group ...

  9. AOP自定义注解鉴权

    刚出来工作那会或者在学校的时候,经常听到说AOP(面向对象编程,熟称切面)的用途是日志.鉴权等.但是那会不会,后面学会了,又没有写博客记录,今天写给大伙,希望能帮到大家 一.学习目标:利用AOP+自定 ...

  10. 使用Spring Aop自定义注解实现自动记录日志

    百度加自己琢磨,以下亲测有效,所以写下来记录,也方便自己回顾浏览加深印象之类,有什么问题可以评论一起解决,不完整之处也请大佬指正,一起进步哈哈(1)首先配置文件: <!-- 声明自动为sprin ...

随机推荐

  1. [BZOJ1595] [Usaco2008 Jan]人工湖(单调栈)

    传送门 好难的题..至少对我来说. 这题就是模拟从最低的平台注水,然后将最低的填满以后从最低的平台向两边扩展,每次找最近的最低的平台h,然后将水填到h高度. 栈里存的是向外扩展的时候,有时会遇到高度递 ...

  2. 雅礼培训4.3 Problem A 【点分治】

    题目简述 一个\(N\)个节点的树,有\(M\)个炸弹分布在一些节点上,有各自的威力,随着其他点距离增大对其他点的伤害呈等差减小,直至为0 问每个点受到的伤害 题解 QAQ考场代码没处理好有些炸弹威力 ...

  3. 常州模拟赛d2t1 小X的质数

    题目背景 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的 情感.小 X 认为,质数是一切自然数起源的地方. 题目描述 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因 ...

  4. 「SDOI2010」古代猪文(bzoj1951)

    题目写了一大堆背景. 一句话题意就是求 $q^{\sum_{d|n}C_{n}^{d}} \mod 999911659$. 因为$n$是质数,只有当$q$是$n$的倍数时(此题数据范围原因,最多$q= ...

  5. Codeforces 432D Prefixes and Suffixes kmp

    手动转田神的大作:http://blog.csdn.net/tc_to_top/article/details/38793973 D. Prefixes and Suffixes time limit ...

  6. 关于FileZilla Server的安装问题

    网上很多FileZilla Server教程到最后一步在本机上测试访问成功就没了,实际上还是不完整的,一般情况下外网还是访问不了,外网访问同样很重要. 可能有点童鞋会说安装的时候防火墙提示的时候我也点 ...

  7. Go -- 并发编程的两种限速方法

    引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗 ...

  8. win7安装ANT

    点击进入ant官网,找到下载选项.   选择下载安装文件.其余的源文件和手册的下载步骤完全相同.   可以下载官网上对应系统的最新版本.也可以在old ant 版本中选择自己需要的版本.笔者需要ant ...

  9. Elasticsearch shield权限管理详解

    Elasticsearch shield权限管理详解 学习了:https://blog.csdn.net/napoay/article/details/52201558 现在(20180424)改名为 ...

  10. linux系统(ubuntu14.04)安装mentohust完毕校园网锐捷认证

    近来升级电脑又一次做了系统.再次面临这linux系统下的各种校园网上网限制. 我在这里採用了mentohust来完毕锐捷认证. 这里我们选择Mentohust取代锐捷. Mentohust 是由华中科 ...