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的更多相关文章

  1. 如何通过自定义注解实现AOP切点定义

    面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...

  2. Spring之注解实现aop(面向切面编程)

    1:Aop(aspect object programming)面向切面编程,名词解释:    1.1:功能:让关注点代码与业务逻辑代码分离    1.2:关注点        重复代码就叫做关注点  ...

  3. Spring_Spring与AOP_AspectJ基于注解的AOP实现

    一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Cl ...

  4. spring学习笔记二 注解及AOP

    本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...

  5. spring中基于注解使用AOP

    本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...

  6. spring-AOP框架(基于AspectJ注解配置AOP)

    基于AspectJ注解配置AOP 1.加入jar包: 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar.aspectj.w ...

  7. Spring注解(AOP)

    底层动态代理 程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 导入aop的相关模块 <!-- https://mvnrepository.com/artifact/org. ...

  8. spring注解开发-AOP(含原理)

    一:AOP基本使用 AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 步骤一:导入aop模块:Spring AOP:(spring-aspects) <depen ...

  9. SpringCloud开发学习总结(六)—— 结合注解的AOP示例

    面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP ...

  10. SpringBoot自定义注解、AOP打印日志

    前言 在SpringBoot中使用自定义注解.aop切面打印web请求日志.主要是想把controller的每个request请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...

随机推荐

  1. 网页控件很多时最好用绝对定位absolute

    否则动一个位置可能影响其他的,牵一发而动全身

  2. 洛谷P1550 [USACO08OCT]打井Watering Hole

    P1550 [USACO08OCT]打井Watering Hole 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to ...

  3. 运行Scrapy工程,报错ModuleNotFoundError: No module named 'win32api'解决方法

    1.运行爬虫scrapy crawl name,报错ScrpyModuleNotFoundError: No module named 'win32api' 2.解决方法: 在https://gith ...

  4. Mysql数据库申请

    前段时间大部门下新成立了一个推广百度OCR.文字识别.图像识别等科技能力在金融领域应用的子部门.因为部门刚成立,基础设施和人力都是欠缺的.当时分到我们部门的任务是抽调一个人做新部门主站前端开发工作.本 ...

  5. postgresql编译安装与调试(一)

    因为最近组里的项目和postgresql有关,并且需要查看和调试源码,所以专门学习了一下如何安装和调试postgresql,此博文用来记录自己的安装和调试过程.安装环境是CentOS6(CentOS7 ...

  6. 【转】intellij idea使用指南—— 导入Eclipse的Web项目

    通常一个团队中可能有人用eclipse,有人用intelliJ,那么经常会出现需要导入别人用eclipse建好的web项目.而IntelliJ提供了多种项目类型的导入方式,其中就有eclipse. 在 ...

  7. CodeForces - 1110C-Meaningless Operation(打表找规律)

    Can the greatest common divisor and bitwise operations have anything in common? It is time to answer ...

  8. git 如何删除远程提交方法总结

    今天不小心把代码提到主分支了,虽然改动只有一点点,但感觉asdasdasdsadd(要被骂死) 怎么样才能删除掉远程的分支呢. 假设我们有提交 commit commit commit 手残把3提交错 ...

  9. vux构建的项目打包成app出的一些问题

    1.static里面能放一些外部的插件,css可以放static,引用的时候按照相对路径写, less不可以,因为放在static里面的文件不会经过webpack的处理,所以也就不会编译成css,所以 ...

  10. [转] 一个简单的零配置命令行HTTP服务器 - http-server (nodeJs)

    [From] http://www.cnblogs.com/lucker/p/4108838.html http-server 是一个简单的零配置命令行HTTP服务器, 基于 nodeJs. 如果你不 ...