springboot Aop配置,并使用自定义注解annotation,并且拦截service层
前言
用Spring Boot的AOP来简化处理自定义注解,并将通过实现一个简单的方法执行判断节点是否开始的状态示列源码。
AOP概念
面向侧面的程序设计(aspect-oriented programming,AOP,又译作面向方面的程序设计、观点导向编程、剖面导向程序设计)是计算机科学中的一个术语,指一种程序设计范型。该范型以一种称为侧面(aspect,又译作方面)的语言构造为基础,侧面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点(crosscutting concern)。
Spring Boot的AOP环境准备
在pom.xml
中引入相应的依赖模块
<!-- AOP依赖模块 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
先建一个简单地建一个自定义注解类
一个简单地自定义注解类就生成了:
package com.common.annotation; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* 自定义注解
* @Description 自定义注解@HAStatusCheck 拦截service层 HAStatusCheckService
* @Author Justin zeng
* @Date 2019-04-19
* @version 1.0
*/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HAStatusCheck {
//自定义的方法描述信息
String description() default "";
}
在建一个切点类实现你的要处理的事情
package com.common.aop; import java.lang.reflect.Executable;
import java.lang.reflect.Method;
import java.util.ArrayList; import javax.annotation.Resource; import org.aspectj.lang.JoinPoint;
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.stereotype.Component;
import org.aspectj.lang.reflect.MethodSignature; import com.common.annotation.HAStatusCheck;
import com.common.enums.ha.ServerPort;
import com.common.enums.ha.ServerType;
import com.common.ha.HAStatusCheckService;
/**
* 切点类
* @Description AOP拦截判断 HA节点是否开启状态方法Service层
* @Author Justin zeng
* @Date 2019-04-19
* @version 1.0
*/
@Aspect
@Component
public class HAStatusCheckAop {
//注入Service
@Resource
private HAStatusCheckService hAStatusCheckService;
private static final Logger LOG = LoggerFactory.getLogger(HAStatusCheckAop.class); //Service层切点 自定义的注解类路径
@Pointcut("@annotation(com.common.annotation.HAStatusCheck)")
public void servicePointCut() {} Object proceed=null;
@Around("servicePointCut()")
public void logAroundService(ProceedingJoinPoint jointPoint) throws Throwable {
LOG.info("------判断节点开始------");
ArrayList<String> list = new ArrayList<String>();
list.add("192.168.1.5");
if (!hAStatusCheckService.isActAsActiveNode(list, ServerPort.BILLING_HANDLER, ServerType.BILLING_HANDLER)) {
LOG.info("------访问请求不合法!------");
return;
//强制退出
//System.exit(0);
}else {
LOG.info("------判断注解开始------");
//获得当前访问的class
Class<?> className = jointPoint.getTarget().getClass();
//获得访问的方法名
String methodName = jointPoint.getSignature().getName();
//得到方法的参数的类型
Class[] argClass = ((MethodSignature) jointPoint.getSignature()).getParameterTypes();
try {
// 得到访问的方法对象
Method method = className.getDeclaredMethod(methodName, argClass);
// 判断是否存在@HAStatusCheck注解
if (method.isAnnotationPresent(HAStatusCheck.class)) {
HAStatusCheck annotation = method.getAnnotation(HAStatusCheck.class);
annotation.description();
LOG.info("当前目标执行方法:"+methodName+"执行开始");
//执行当前目标中的方法
proceed = jointPoint.proceed();
LOG.info("当前目标class路径:"+className);
LOG.info("当前目标执行方法名:" + methodName);
LOG.info("当前目标执行方法的参数类型:" + argClass);
LOG.info("当前目标方法执行的结果:" + proceed);
LOG.info("当前目标执行方法:"+methodName+"执行结束");
}
} catch (Exception e) {
LOG.error("不存在@HAStatusCheck注解",e);
}
}
} /**
* 获取注解中对方法的描述信息 用于service层注解
*
* @param joinPoint 切点
* @return 方法描述
* @throws Exception
*/
public static String getServiceMthodDescription(JoinPoint joinPoint)
throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
String description = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description = method.getAnnotation(HAStatusCheck. class).description();
LOG.info("======"+description+"======");
break;
}
}
}
return description;
} }
最后
在你需要的判断预处理的地方加上自定义的注解 @HAStatusCheck
package com.job; import com.annotation.HAStatusCheck; import lombok.extern.slf4j.Slf4j; @Slf4j
public class TestJob {
//这就是上面自定义的注解
@HAStatusCheck
public void job() throws Exception {
System.out.println("TestJob job run ....");
}
}
这样自定义注解拦截service层开发就结束了,需要的可以试试吧,希望能帮到大家。
springboot Aop配置,并使用自定义注解annotation,并且拦截service层的更多相关文章
- springBoot AOP环绕增强、自定义注解、log4j2、MDC
(一)log4j2 maven配置 <dependency> <groupId>org.springframework.boot</groupId> <art ...
- 使用自定义注解和springAOP捕获Service层异常,并处理自定义异常
一 自定义异常 /** * 自定义参数为null异常 */ public class NoParamsException extends Exception { //用详细信息指定一个异常 publi ...
- spring自定义注解实现登陆拦截器
1.spring自定义注解实现登陆拦截器 原理:定义一个注解和一个拦截器,拦截器拦截所有方法请求,判断该方法有没有该注解.没有,放行:有,要进行验证.从而实现方法加注解就需要验证是否登陆. 2.自定义 ...
- 2.基于AOP自定义注解Annotation的实现
上一篇中分析了AOP的实现原理, 总结为: 判断对象是否需要被代理?@Aspect注解的实现是根据切入点表达式 代理之后需要做什么,就是那些通知,本质上是实现了MethodInterceptor的拦截 ...
- 【Spring】每个程序员都使用Spring(四)——Aop+自定义注解做日志拦截
一.前言 上一篇博客向大家介绍了Aop的概念,对切面=切点+通知 .连接点.织入.目标对象.代理(jdk动态代理和CGLIB代理)有所了解了.理论很强,实用就在这篇博客介绍. 这篇博客中,小编向大家介 ...
- AOP通过反射获取自定义注解
自定义注解: @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component publ ...
- 一小时搞明白自定义注解(Annotation)
原文链接:http://blog.csdn.net/u013045971/article/details/53433874 什么是注解 Annotation(注解)就是Java提供了一种元程序中的元素 ...
- 自定义注解--Annotation
Annotation 概念:注解 原理 是一种接口,通过反射机制中的相关API来访问annotation信息 常见的标准Annotation @Override 方法重写 @Deprecated ...
- Spring AOP基础概念及自定义注解式AOP初体验
对AOP的理解开始是抽象的,看到切点的匹配方式其实与正则表达式性质大致一样就基本了解AOP是基本是个什么作用了.只是整个概念更抽象,需要具化理解.下图列表是AOP相关概念解释,可能也比较抽象^_^ 比 ...
随机推荐
- 算法提高 合并石子(DP)
问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子合并成一堆的最小花费. 输入格式 输入第一行包含一个 ...
- Spring MVC零配置(全注解)(版本5.0.7)
// 核心配置类 package spittr.config; import org.springframework.web.servlet.support.AbstractAnnotationCon ...
- asp遍历前端的所有控件
//遍历ID为Panel1的panel里的所有label控件 foreach (Control ctl in this.Panel1.Controls) { //判断类型为Label的 if (ctl ...
- Super-Resolution Restoration of MISR Images Using the UCL MAGiGAN System 超分辨率恢复
作者是伦敦大学学院Mullard空间科学实验室成像组,之前做过对火星图像的分辨率增强. 文章用了许多的图像处理方法获得特征和高分辨率的中间结果,最后用一个生产对抗网络获得更好的高分辨率结果. 用的数据 ...
- Java实现微信小程序支付(支付,提现,退款)
1.添加WXpayCommon类用以具体实现功能,代码如下: package com.karat.cn.wxCommon; import java.io.IOException; import jav ...
- 【Leetcode】Combinations
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...
- [Leetcode]016. 3Sum Closest
public class Solution { public int threeSumClosest(int[] num, int target) { int result = num[0] + nu ...
- input keyup的时候实现内容过滤
当在文本框中输入关键字,就会搜索出包含关键字的数据 实现: 只需要一个内容过滤即可 <body> <input type="text" id="sear ...
- buildKibanaServerUrl
private String buildKibanaServerUrl(DiscountIndexMailData mailData,Statistic stat,String failureCaus ...
- Reactive Extensions入门
https://www.cnblogs.com/yangecnu/archive/2012/11/03/Introducting_ReactiveExtensions.html 前面我写过7篇文章粗略 ...