aop面向切面的编程Aspect  Oriented Programming

我想创建一个类来监听controller ,当controller执行方法的时候将入参和输出参数打印出来

package com.wdg.controller;import java.text.SimpleDateFormat;
import java.util.Date;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Component
@Aspect
public class ServiceAspect {private Logger logger = LoggerFactory.getLogger(ServiceAspect.class);// 检测muyan controller 中所有的方法private final String ExpGetResultDataPonit = "execution(* com.wdg.controller..*.*(..))";@Pointcut(ExpGetResultDataPonit)public void excuteService() {}// 执行方法前的拦截方法@Before("excuteService()")public void doBeforeMethod(JoinPoint joinPoint) {SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");logger.info("-----" + sdf.format(new Date()) + "--执行方法" + joinPoint.getTarget().getClass().getName() + "-----");try {Object[] obj = joinPoint.getArgs();logger.info("-----用户传入参数:{}", obj[0].toString() + "-----");} catch (Exception e) {logger.info("----无参数的方法-----");}}/*** 后置返回通知 这里需要注意的是: 如果参数中的第一个参数为JoinPoint,则第二个参数为返回值的信息* 如果参数中的第一个参数不为JoinPoint,则第一个参数为returning中对应的参数 returning* 限定了只有目标方法返回值与通知方法相应参数类型时才能执行后置返回通知,否则不执行,对于returning对应的通知方法参数为Object类型将匹配任何目标返回值*/@AfterReturning(value = "excuteService()", returning = "returnValue")public void doAfterAdvice(JoinPoint joinPoint, Object returnValue) {logger.info("-----执行方法" + joinPoint.getSignature().getName() + "返回值为{}-----", returnValue.toString());SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");logger.info("-----" + sdf.format(new Date()) + "--结束调用方法" + joinPoint.getTarget().getClass().getName() + "-----");}/*** 后置最终通知(目标方法只要执行完了就会执行后置通知方法)*/
//    @After("excuteService()")public void doAfterAdvice(JoinPoint joinPoint) {System.out.println("后置通知执行了!!!!");}/*** 环绕通知: 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。* 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型*/// @Around(ExpGetResultDataPonit)public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {System.out.println("正在执行的方法的名称:" + proceedingJoinPoint.getSignature().getClass().getName());processInputArg(proceedingJoinPoint.getArgs());try {// obj之前可以写目标方法执行前的逻辑Object obj = proceedingJoinPoint.proceed();// 调用执行目标方法processOutPutObj(obj);return obj;} catch (Throwable throwable) {throwable.printStackTrace();}return null;}/*** 处理返回对象*/private void processOutPutObj(Object obj) {System.out.println("OBJ 原本为:" + obj.toString());}/*** 处理输入参数** @param args 入参列表*/private void processInputArg(Object[] args) {for (Object arg : args) {System.out.println("ARG原来为:" + arg);}}}

private final String ExpGetResultDataPonit = "execution(* com.wdg.controller..*.*(..))";

execution 里面是我们监听的类

@before

@after

分别是前执行方法和后执行方法

pom.xml需要引入的类:

       <!-- http://mvnrepository.com/artifact/org.aspectj/aspectjrt --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.9</version></dependency><!-- http://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.9</version></dependency><!-- http://mvnrepository.com/artifact/cglib/cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.2.2</version></dependency>

最后,我们需要在springMVC-servlet.xml,引入:

<aop:aspectj-autoproxy proxy-target-class="true" />

在文件头部需要:

http://www.springframework.org/schema/aop 
  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

xmlns:aop="http://www.springframework.org/schema/aop"

上面 就可以实现我们的aop的功能了

上面仅仅是利用aop做一个简单的日志输出,

系统对你有所帮助

SpringMVC如何实现aop相关推荐

  1. Spring原理/SpringMVC原理/IOC/AOP原理

    Spring原理/SpringMVC原理/IOC/AOP原理 我的微型IOC框架实现 我的微型IOC框架实现 当你打开这本书的时候我要告诉你的第一句话就是认真把前言读完,因为前言概括的本书的大纲以及思 ...

  2. SpringMVC 如何配置aop

    aop 面向切面的编程 Spring如何配置一个简单的aop 第一步:首先是编写一个Operator的类,(类的名字你随便起,开心最为重要) package com.wdg.operator;impo ...

  3. springmvc教程--整合mybatis开发(spring+springMVC+mybatis整合开发)

    一.整合mybatis 为了更好的学习 springmvc和mybatis整合开发的方法,需要将springmvc和mybatis进行整合. 整合目标:控制层采用springmvc.持久层使用myba ...

  4. springmvc教程(2)

    springmvc教程系列 springmvc史上最好教程(3) springmvc史上最好教程(1) 一.整合mybatis 为了更好的学习 springmvc和mybatis整合开发的方法,需要将 ...

  5. Maven搭建springMvc+myBatis完整项目

    2019独角兽企业重金招聘Python工程师标准>>> 首先pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

  6. saas-export项目-系统日志管理-系统日志AOP配置

    功能需求:用户在saas-export项目中使用了什么方法,进行了什么操作,都要记录在日志中,然后在日志管理页面可以查看得到. 功能分析 两个功能,一个是分页显示,一个是保存日志 系统日志管理 (1) ...

  7. AOP注解和切入点表达式

    AOP基本组成部分 1.注解 (1)Aspect(切面):通常是一个类,里面可以定义切入点和通知 (2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用 (3)Advice(通 ...

  8. SpringMVC框架中的异常处理机制

    目录 1. 什么是异常处理? 2. SpringMVC框架中的异常处理机制是什么? 3. SpringMVC框架汇中实现异常处理的实现步骤  4. SpringMVC框架出现异常时候的处理过程  5. ...

  9. Spring AOP中自我调用的问题

    前几天在做项目的时候同事说,在使用AOP进行拦截的时候发现有些方法有时候能输出拦截的日志有时候不输出拦截的日志.发现在单独调用这些方法的时候是有日志输出,在被同一个类中的方法调用的时候没有日志输出.我 ...

最新文章

  1. 技术大咖齐聚爱数智慧人机交互技术论坛 | CNCC2021
  2. 海伦公式c语言编程funcd,c语言编程练习题及答案_0.doc
  3. KOA2路由koa-router实现类似express router的文件结构设计---KOA入门学习
  4. 根据 sitemap 的规则[0],当前页面 [pages/index/index] 将被索引
  5. oracle mysql 并发连接数_如何修改Oracle并发连接数的设置
  6. QT 32位程序Debug模式发布问题
  7. 【JXOI2018】守卫
  8. *【计蒜客 - 蓝桥训练】人以群分(二分 + dp)
  9. C#之正则表达式、异常处理和委托与事件
  10. ISCW实验10:安装SDM到路由器的FLASH中
  11. html质感阴影_CSS3 阴影(text-shadow)
  12. python判断一个数是否是质数
  13. 宽带和流量是分开的吗_宽带
  14. Xcode5 symbolicatecrash文件路径
  15. 进行海外媒体发稿的稿件撰写技巧和方法
  16. Windows XP下安装SQL2000企业版
  17. [个人笔记]python学习01
  18. 一个大学女生发人深省的人生感悟
  19. ie6 兼容整理《一》
  20. Java实现简单画图工具

热门文章

  1. Eclipse下svn的创建分支/合并/切换使用
  2. android.graphics.Paint方法setXfermode (Xfermode x...
  3. SCSI协议与存储的发展
  4. 数据库备份与还原处理
  5. Windows下的for
  6. 用Scrum敏捷开发工具Leangoo做Sprint迭代管理
  7. 服务器管理神器 开源堡垒机 jumpserver 实战教程
  8. 记一次 Kubernetes 集群被入侵,服务器变矿机
  9. 高可用 Prometheus 架构实践中的踩坑集锦
  10. 高并发系统三大利器之限流