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

自定义注解类:
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+自定义注解的更多相关文章
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- ssm+redis整合(通过aop自定义注解方式)
此方案借助aop自定义注解来创建redis缓存机制. 1.创建自定义注解类 package com.tp.soft.common.util; import java.lang.annotation.E ...
- spring AOP自定义注解方式实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- spring AOP自定义注解 实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- (转)利用Spring AOP自定义注解解决日志和签名校验
一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...
- SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!
往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...
- redis分布式锁-spring boot aop+自定义注解实现分布式锁
接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...
- 使用AOP+自定义注解完成spring boot的接口权限校验
记使用AOP+自定义注解完成接口的权限校验,代码如下: pom文件添加所需依赖: 1 <dependency> 2 <groupId>org.aspectj</group ...
- AOP自定义注解鉴权
刚出来工作那会或者在学校的时候,经常听到说AOP(面向对象编程,熟称切面)的用途是日志.鉴权等.但是那会不会,后面学会了,又没有写博客记录,今天写给大伙,希望能帮到大家 一.学习目标:利用AOP+自定 ...
- 使用Spring Aop自定义注解实现自动记录日志
百度加自己琢磨,以下亲测有效,所以写下来记录,也方便自己回顾浏览加深印象之类,有什么问题可以评论一起解决,不完整之处也请大佬指正,一起进步哈哈(1)首先配置文件: <!-- 声明自动为sprin ...
随机推荐
- 算法复习——单调队列(sliding windows,ssoi)
题目: 题目描述 给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端,你只能见到窗口的 K 个整数,每次窗体向右移动一位,如下表:
- kali 1.1.0 boot failed
从几个月前的14.10 daily 版本就有U盘刻录无法启动的现象,相关bug可参见: https://bugs.launchpad.net/ubunt ... reator/+bug ...
- java.util.ResourceBundle 用法小介
java中读取配置文件的信息可以采用properties这个类,但是当遇到国际化问题的时候还是不好解决,因而还是最好使用 ResourceBundle这个类,其实ResourceBundle本质上和P ...
- http 400报错
http 400报错---springmvc相关: 1.使用了json入参,传递给了对象,如果对象里的属性,如这里的Bonus是int类型,你传入了非int类型,这里就会报400 2.使用了@Requ ...
- 中国余数定理 1(codevs 3040)
题目描述 Description 摘自算法导论...... 找出第k个被3,5,7除的时候,余数为2,3,2的数: 输入描述 Input Description 一个数k. 输出描述 Output D ...
- 洛谷P2365 任务安排 [解法一]
题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti.在每批任务开始 ...
- 【SPOJ687&POJ3693】Maximum repetition substring(后缀数组)
题意: n<=1e5 思路: From http://hzwer.com/6152.html 往后匹配多远 r 用ST表求lcp即可...往前 l 就把串反过来再做一下.. 但是有可能求出来的最 ...
- 关于PDF的读取与绘制
本文方法参考了:官方文档.见A function that draw a PDF page的代码部分: void MyDisplayPDFPage (CGContextRef myContext, s ...
- Android菜单menu控件大全
下载:http://www.see-source.com/androidwidget/list.html?type=16 Android-NewPopupMenu 使用PopupWindow实现的Po ...
- 常见iOS面试题 之 怎么判断一个类是否遵循某个协议
答案: 使用方法conformsToProtocol. 调用例子: BOOL isConform = [Student conformsToProtocol:@protocol(UIScrollVie ...