2019独角兽企业重金招聘Python工程师标准>>>

AOP , 即切面编程 , 是GOF设计模式的延续 , 但是GOF是什么 , 我也不懂 , 留待以后研究 .

对于AOP , 我的理解是在传统代码块中打造一个空隙平面 , 当代码运行到该平面时 , 在这个平台上回依次进行相关操作

以下是AOP的几个重要定义 :

切面(Aspect):官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”。个人理解为代码块中创建的空隙平面 , “切 面”在ApplicationContext中用<aop:aspect>来配置。

  • 连接点(Joinpoint) :程序执行过程中的某一行为,例如,UserService.get的调用或者UserService.delete抛出异常等行为。

  • 通知(Advice) :“切面”对于某个“连接点”所产生的动作,例如,TestAspect中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面”可以包含多个“Advice”,例如ServiceAspect。

  • 切入点(Pointcut) :匹配连接点的断言,在AOP中通知和一个切入点表达式关联。例如,TestAspect中的所有通知所关注的连接点,都由切入点表达式execution(* com.spring.service.*.*(..))来决定。

  • 目标对象(Target Object) :被一个或者多个切面所通知的对象。例如,AServcieImpl和BServiceImpl,当然在实际运行时,Spring AOP采用代理实现,实际AOP操作的是TargetObject的代理对象。

  • AOP代理(AOP Proxy) :在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。默认情况下,TargetObject实现了接口时,则采用JDK动态代理,例 如,AServiceImpl;反之,采用CGLIB代理,例如,BServiceImpl。强制使用CGLIB代理需要将 <aop:config>的 proxy-target-class属性设为true。

通知(Advice)类型:

  • 前置通知(Before advice):在某连接点(JoinPoint)之前执行的通知,但这个通知不能 阻止连接点前的执行。ApplicationContext中在<aop:aspect>里面使用<aop:before>元素 进行声明。例如,TestAspect中的doBefore方法。

  • 后置通知(After advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 ApplicationContext中在<aop:aspect>里面使用<aop:after>元素进行声明。例 如,ServiceAspect中的returnAfter方法,所以Teser中调用UserService.delete抛出异常 时,returnAfter方法仍然执行。

  • 返回后通知(After return advice):在某连接点正常完成后执行的通知,不包括抛出异常的情况。ApplicationContext中在<aop:aspect>里面使用<after-returning>元素进行声明。

  • 环绕通知(Around advice):包围一个连接点的通知,类似Web中Servlet规范中的 Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。ApplicationContext中 在<aop:aspect>里面使用<aop:around>元素进行声明。例如,ServiceAspect中的around 方法。

  • 抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素进行声明。例如,ServiceAspect中的returnThrow方法。

使用方法 :

1.注解方式

1).xml文件中声明激活自动扫描组件功能,同时激活自动代理功能

        <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"><!-- 激活组件扫描功能,在包cn.ysh.studio.spring.aop及其子包下面自动扫描通过注解配置的组件 --><!-- 空隙平面所需要执行代码块所放置的包名 --><context:component-scan base-package="cn.ysh.studio.spring.aop"/><!-- 激活自动代理功能 --><aop:aspectj-autoproxy proxy-target-class="true"/><!-- 用户服务对象 --><bean id="userService" class="cn.ysh.studio.spring.aop.service.UserService" /></beans>

2).为Aspect切面类添加注解:

     package cn.ysh.studio.spring.aop.aspect;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;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.springframework.stereotype.Component;/*** 系统服务组件Aspect切面Bean* @author Shenghany* @date 2013-5-28*/
//声明这是一个组件
@Component
//声明这是一个切面Bean
@Aspect
public class ServiceAspect {private final static Log log = LogFactory.getLog(ServiceAspect.class);/** 配置前置通知,使用在方法aspect()上注册的切入点* 同时接受JoinPoint切入点对象,可以没有该参数*/<!-- execution 中的路径为空隙平台创建的地方,其中logout为controller中的某一方法名 --><!-- 如: logout , logoutSomething , logout... -->@Before("execution(* com.asd.a.ho.controller.LogoutController.logout(..))")public void before(JoinPoint joinPoint){if(log.isInfoEnabled()){log.info("before " + joinPoint);}}//配置后置通知,使用在方法aspect()上注册的切入点@After("execution(* com.asd.a.ho.controller.LogoutController.logout(..))")public void after(JoinPoint joinPoint){if(log.isInfoEnabled()){log.info("after " + joinPoint);}}//配置环绕通知,使用在方法aspect()上注册的切入点@Around("execution(* com.asd.a.ho.controller.LogoutController.logout(..))")public void around(JoinPoint joinPoint){long start = System.currentTimeMillis();try {((ProceedingJoinPoint) joinPoint).proceed();long end = System.currentTimeMillis();if(log.isInfoEnabled()){log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms!");}} catch (Throwable e) {long end = System.currentTimeMillis();if(log.isInfoEnabled()){log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " + e.getMessage());}}}//配置后置返回通知,使用在方法aspect()上注册的切入点@AfterReturning("execution(* com.asd.a.ho.controller.LogoutController.logout(..))")public void afterReturn(JoinPoint joinPoint){if(log.isInfoEnabled()){log.info("afterReturn " + joinPoint);}}//配置抛出异常后通知,使用在方法aspect()上注册的切入点@AfterThrowing(pointcut="aspect()", throwing="ex")public void afterThrow(JoinPoint joinPoint, Exception ex){if(log.isInfoEnabled()){log.info("afterThrow " + joinPoint + "\t" + ex.getMessage());}}}

xml配置方式可以去这里看看  http://www.cnblogs.com/davidwang456/p/4013631.html

转载于:https://my.oschina.net/scymore/blog/524787

Spring MVC AOP 初步学习相关推荐

  1. Spring MVC AOP切面失效原因与处理

    Spring MVC AOP切面失效原因与处理 问题概述 AOP的两类实现 解决方案 方法一:用Autowired 注入自身的实例 方法二:从Spring上下文获取增强后的实例引用 方法三: 利用Ao ...

  2. java动态菜单显示实现,java – 为Spring MVC / AOP应用程序实现动态菜单

    我希望为我的 Spring MVC应用程序实现动态可更改的菜单(无论何时添加带注释的方法或控制器). 我想要的是引入新的注释(@RequestMenuMapping),它将转到@Controller ...

  3. Spring MVC详解(学习总结)

    一.Sprig MVC简介 1.1介绍 1.2MVC是什么 二.Spring MVC实现原理 2.1核心组件 2.2工作流程 三.第一个Spring MVC 四.常用注解 五.参数绑定 5.1URL风 ...

  4. 基于佟刚老师视频教程的Spring MVC数据类型转换学习总结

    基于Spring MVC数据类型转换的学习笔记总结 问题 页面中数据格式为字符串格式,后台pojo中对应的类型可能为另外一种对象. 如: 在前台页面输入一个固定格式的时间字符串,在后台接收为一个jav ...

  5. Spring MVC Aop注入遇到空指针bug

    目录 过滤 bug描述 源码 问题分析 改进的代码 过滤   如果是配置增强后报空指针,而且没有使用Around的方式,有可能有以下几种情况: Controller层的调用service层时的方法为p ...

  6. java地址映射关系,Spring MVC——基础(简介,使用,地址映射)

    "大佬们"嘴中的SSH,SSM框架,我这种小白终于解除到第二个S了,关于Spring MVC框架,根据最近的学习发现,还是有很多不足和需要加强巩固的地方,所以,通过总结博客的方式将 ...

  7. 30分钟轻松入门Spring MVC

    Spring MVC框架入门学习步骤 1.了解Spring MVC基本慨念, 是什么?,能干什么? 2.Spring MVC核心组件.底层实现原理 3.Spring MVC实际开发, 基于XML方式. ...

  8. 分布式锁 动态代理 Java数据结构List,Set,Map,Spring执行流程,Spring MVC组件

    这里对今日的内容进行总结: 分布式锁具备的条件: 具备的条件: 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行. 高可用的获取锁与释放锁. 高性能的获取锁与释放锁. 具备可重入的特 ...

  9. Spring MVC 教程详解 个人总结 复习必备 面试宝典 狂神笔记

    文章目录 一.MVC 模式 1.什么是 MVC 2.Servlet MVC 小结 二.Spring MVC 1.Spring MVC 概念 为什么学习 Spring MVC 中央控制器 Dispatc ...

  10. Spring 和 Spring MVC的区别

    Spring 和 Spring MVC的区别   学习Spring MVC也有几天时间了,那么Spring和Spring MVC的区别到底在哪里,二者是什么关系呢?认为二者是一个东西那肯定是不对的,而 ...

最新文章

  1. 5G都不能取代的Wi-Fi6,到底有多厉害?
  2. 如果某个字段值相同则触发器新增_Thrift IDL新增字段导致版本不一致引发的惨案...
  3. 浦银行面试总结(信息科技部)
  4. Android开发之约束布局平均分布|ConstraintLayout平均分布|约束布局均匀分布|ConstraintLayout均匀分布
  5. Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm
  6. keepalive高可用nginx(nginx动静分离)的实现
  7. 前端传递数据超过2M不能传给后台
  8. 任正非:HR面试不深刻导致大规模进人、走人,耽误人家几年对得起人家吗?...
  9. 在Ubuntu 20.04(含Xubuntu、Linux Mint Cinnamon等衍生版)上安装Wine QQ,获得更佳的使用体验
  10. DevExpress的双击获取单元格数据
  11. office2016 Excel 打开“宏”分三步
  12. spring的task和quartz的区别
  13. 搜索引擎Bing必应高级搜索语法
  14. 基于单片机的危险气体泄露报警器设计
  15. Chrome 和 Chromium 区别
  16. 2022.9.15 第1次周报
  17. kali 2021安装w3af
  18. linux固定分辨率,Linux系统分辨率设置
  19. vue多个商品选择与列表显示
  20. 6种lut预设 CMG Cine LUTs for A7III

热门文章

  1. 严格对角占优矩阵特征值_MIT—线性代数笔记21 特征值和特征向量
  2. oracle 基本dos命令,Oracle 常用 Dos命令
  3. python random模块安装_Python中的For循环和Random模块
  4. ubuntu 串口调试工具_开源软件分享基于WPF的串口调试工具
  5. 基础数据类型转换过程中注意事项
  6. python文件路径的操作
  7. mysql使用GROUP BY分组实现取前N条记录的方法或最近几条消费记录
  8. Selenium爬虫 -- 使用Selenium爬取数据时,网页切换之后原先获取的元素变量失效的问题
  9. MySQL半同步复制 - 优点、缺点、配置
  10. intellij中使用git插件将项目上传到码云