注解实现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请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...
随机推荐
- how to use windows azure market
here is the sample. namespace USCrime2006and2007 { class Program { static void Main(string[] args) { ...
- SDUT OJ 顺序表应用4:元素位置互换之逆置算法
顺序表应用4:元素位置互换之逆置算法 Time Limit: 10 ms Memory Limit: 570 KiB Submit Statistic Discuss Problem Descript ...
- django bug 与陷阱
环境:ubuntu,python3.4 1.QueryDict 陷阱 :以下语句语句是取每行的头元素,其中line应该是一个列表.问题是,line在实际运行中已经不是列表,而变成了列表中的头元素. 错 ...
- YY的GCD 数学
题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于 ...
- select 插入数据 不自增列实现自增
- 创建React工程
下载 main.jsBundle 包curl http://localhost:8081/index.ios.bundle -o main.jsbundle <!DOCTYPE html> ...
- RNA-Seq基因组比对工具HISAT2
原文网址: http://blog.biochen.com/archives/337 HISAT2是TopHat2/Bowti2的继任者,使用改进的BWT算法,实现了更快的速度和更少的资源占用,作者推 ...
- LeetCode4. 两个排序数组的中位数
4. 两个排序数组的中位数 问题描述 There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the ...
- vue实现进入页面表单聚焦
<input type="text" ref="input"/> <script> mounted(){ this.$refs['inp ...
- 【实战】Oracle注入总结
小结: Union联合查询: order by 定字段 and 1=2 union select null,null..... from dual 然后一个一个去判断字段类型,方法如下 and 1=2 ...