注解实现AOP
package com.dch.service.aop; import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; /**
* AOP Controller RestController
*
* @author liu wp
*
*/
@Aspect
@Component
public class AutoControllerAspect {
private static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/** 日志类 */
private final Logger logger = LoggerFactory.getLogger(super.getClass()); /**
* AfterReturning 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行
*
* @param joinPoint
* @param returnObj
* 返回值
*/
@AfterReturning(pointcut = "allControllerMethod()||allrestControllerMethod()", returning = "returnObj")
public void afterReturning(final JoinPoint joinPoint, final Object returnObj) {
logger.info("----afterReturning Start 请求时间:{}----", dateTimeFormat.format(new Date()));
logger.info("返回值:{}", returnObj);
logger.info("----afterReturning End 请求时间:{}----", dateTimeFormat.format(new Date())); } /**
* AfterThrowing 核心业务逻辑调用异常退出后执行,处理错误信息
*
* @param joinPoint
* @param ex
* 异常信息
*/
@AfterThrowing(value = "allControllerMethod()||allrestControllerMethod()", throwing = "ex")
public void AfterThrowing(final JoinPoint joinPoint, final Exception ex) {
logger.info("----AfterThrowing Start 请求时间:{}---", dateTimeFormat.format(new Date()));
logger.info("异常信息:{}", ex.getMessage());
logger.info("----AfterThrowing End 请求时间:{}---", dateTimeFormat.format(new Date()));
} /**
* 监控所有@Controller的方法
*/
@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void allControllerMethod() {
} @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
public void allrestControllerMethod() {
} /**
* Around 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
*
* 注意:当核心业务抛异常后,立即退出,转向afterReturning 执行完afterReturning,再转到AfterThrowing
*
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("allControllerMethod()||allrestControllerMethod()")
public Object Around(final ProceedingJoinPoint joinPoint) throws Throwable {
logger.info("----Around Start 请求时间:{}----", dateTimeFormat.format(new Date()));
logger.info("---请求前 beforeMethod");
final Object obj = joinPoint.proceed();
logger.info("---请求后 afterReturning");
logger.info("----Around End 请求时间:{}----", dateTimeFormat.format(new Date()));
return obj;
} /**
* 在核心业务执行前执行。
*
* @param joinPoint
* @throws InterruptedException
*/
@Before("allControllerMethod() || allrestControllerMethod()")
public void beforeMethod(final JoinPoint joinPoint) throws InterruptedException {
logger.info("--beforeMethod Start 请求时间:{}--", dateTimeFormat.format(new Date()));
final ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
final HttpServletRequest request = servletRequestAttributes.getRequest();
final String requestUrl = request.getRequestURI().toString();
final int jpsHashCode = joinPoint.getSignature().hashCode();
logger.info("访问序号:{},请求路径:{},访问请求参数对象 : {}", jpsHashCode, requestUrl, Arrays.toString(joinPoint.getArgs()));
logger.info("--beforeMethod End 请求时间:{}--", dateTimeFormat.format(new Date()));
} }
注解实现AOP的更多相关文章
- 如何通过自定义注解实现AOP切点定义
面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...
- Spring之注解实现aop(面向切面编程)
1:Aop(aspect object programming)面向切面编程,名词解释: 1.1:功能:让关注点代码与业务逻辑代码分离 1.2:关注点 重复代码就叫做关注点 ...
- Spring_Spring与AOP_AspectJ基于注解的AOP实现
一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Cl ...
- spring学习笔记二 注解及AOP
本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...
- spring中基于注解使用AOP
本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...
- spring-AOP框架(基于AspectJ注解配置AOP)
基于AspectJ注解配置AOP 1.加入jar包: 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.w ...
- Spring注解(AOP)
底层动态代理 程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 导入aop的相关模块 <!-- https://mvnrepository.com/artifact/org. ...
- spring注解开发-AOP(含原理)
一:AOP基本使用 AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 步骤一:导入aop模块:Spring AOP:(spring-aspects) <depen ...
- SpringCloud开发学习总结(六)—— 结合注解的AOP示例
面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP ...
- SpringBoot自定义注解、AOP打印日志
前言 在SpringBoot中使用自定义注解.aop切面打印web请求日志.主要是想把controller的每个request请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...
随机推荐
- 【bzoj3796】Mushroom追妹纸 hash/sa+kmp+二分
Description Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意--写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从网上找到了两篇极佳的情书, ...
- CPU 的工作原理
内部架构 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 .其内部架构如下: [1]控制 ...
- 本文分享一下ehcache的使用心得,本文主要讲以广播的形式同步缓存。
本文分享一下ehcache的使用心得,本文主要讲以广播的形式同步缓存. 下面讲述主要分为两个部分,一个是配置文件,一个是Java代码. 1.准备jar包: slf4j-api-1.7.12.jar,e ...
- 5、Numpy处理数据
转载自:http://old.sebug.net/paper/books/scipydoc/numpy_intro.html#id9 2 NumPy-快速处理数据 标准安装的Python中用列表(li ...
- JS 的冒泡排序
// 冒泡排序 从小到大 function maoPaoPaiXu(arr) { // 控制循环的比较的轮次 for (var i = 0; i < arr.length - 1; i++) { ...
- gnome-terminal
在终端中打开终端: gnome-terminal 同时打开多个终端: gnome-terminal --window --window 此处有几个 --window 就会打开几个终端 最大化形式打开终 ...
- 2B - Amy
数据范围是18位,把每一位加起来的和最多9*18 = 162 所以只需考虑n-162 - n的数即可,暴力解决 #include <iostream> using namespace st ...
- python学习之路---day04
一:元组 元组案例:tuple=("张三","李四","王五","小六","大七",["1 ...
- [转] Scala 2.10.0 新特性之字符串插值
[From] https://unmi.cc/scala-2-10-0-feature-string-interpolation/ Scala 2.10.0 新特性之字符串插值 2013-01-20 ...
- U盘安装CentOS 7错误 /dev/root does not exist, could not
问题: U盘安装CentOS 7,显示/dev/root does not exist, could not boot 解决方法: 1. 到windows里面查看U盘名称(例如 "Cento ...