注解实现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()));
	}

}
时间: 2024-08-24 04:27:50

注解实现AOP的相关文章

spring相关—AOP编程—数学计算器情景示例讲解(包含注解配置AOP与XML配置AOP)

1.数学计算器 ①数学计算器接口[MathCalculator]            public void add(int i,int j);     public int sub(int i,int j);     public int multi(int i,int j);     public void divide(int i,int j);    ②提供简单实现:加减乘除运算[EasyImpl]    ③在简单实现的基础上让每一个计算方法都能够打印日志[LoginImpl]    

spring事务管理,xml配置aop事务和注解配置aop事务

xml配置和注解配合共同代码 AccountService.java public interface AccountService { //转账方法 void transfer(Integer from,Integer to,Double money); } AccountServiceImpl.java xml配置aop事务的AccountServiceImpl.java public class AccountServiceImpl implements AccountService {

Spring_Spring与AOP_AspectJ基于注解的AOP实现

一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件.(百度百科) Spring又将AspectJ的对于AOP的实现引入到自己的框架中. 在Spring中使用AOP开发时,一般使用AspectJ的实现方式. 二.AspectJ的通知类型 前置通知 后置通知 环绕通知 异常通知 最终通知 三.AspectJ的切入点表达式 表达式中加[]的部分

通过自定义注解与aop统一存储操作记录

模块开发完成后,接到通知需要添加操作记录功能,看着那一堆接口,如果一个方法一个方法的加,那真是太麻烦了.为了偷懒,就百度了一下,发现可以通过自定义注解和aop的形式来统一添加操作记录,只需要在每个方法上面添加自定义的注解就可以了.我在这里用的是springboot2.0以及jpa,废话不多说,直接上代码~ 自定义注解serverLog import java.lang.annotation.ElementType; import java.lang.annotation.Retention; i

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

面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 我们现在做的一些非业务,如:日志.事务.安全等都会写在业务代码中(也即是说,这些非业务类横切于业务类),但这些代码往往是重复,复制--粘贴式的代码会给程序的维护带来不便,AOP就实现

SpringBoot利用自定义注解实现AOP

SpringBoot利用自定义注解实现AOP java 本文主要讲解利用SpringBoot的自定义注解来实现AOP思想. 在开始所有的操作之前,需要导入aop坐标: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 如何自定义注解? 实际上注解本

Spring注解(AOP)

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

阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置这里就可以删除了 配置注解 使用@Service注解 开始AOP配置 把通知类交给Spring来管理 在Logger上加注解.之类注意,@Service和@Repository都不合适.因为logger属于三层 所以这里用@Component这个注解来配置 写完上面的@Component的注解后.b

SPRING学习(十九)--基于注解的AOP切面编程

上篇中介绍了基于XML配置的AOP切面编程,除了XML配置AOP切面编程外,还可以通过注解方式实现AOP切面编程,本篇通过一个小例子来介绍基于注解的AOP编程. 1.在spring中使用AOP变成,不止要导入spring-aop.jar,还需要导入spring-aspects.jar.aspectjweaver.jar和aopalliance.jar,但是aspectjweaver.jar被spring-aspects.jar依赖,aopalliance.jar被spring-aop.jar依赖

Spring学习--用 ASpectJ 注解实现 AOP

用 AspectJ 注解声明切面: 要在 Spring 中声明 AspectJ 切面 , 只需要在 IOC 容器中将切面声明为 bean 实例.当在 Spring IOC 容器中初始化 AsjectJ 切面之后 , Spring IOC 容器就会为那些与 AspectJ 切面相匹配的 bean 创建代理. 在 ApectJ 注解中 , 切面只是一个带有 @Asject 注解的 Java 类. 通知是标注有某种注解的简单的 Java 方法. AspectJ 支持 5 种类型的通知注解: @Befo