Spring MVC AOP 初步学习
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 初步学习相关推荐
- Spring MVC AOP切面失效原因与处理
Spring MVC AOP切面失效原因与处理 问题概述 AOP的两类实现 解决方案 方法一:用Autowired 注入自身的实例 方法二:从Spring上下文获取增强后的实例引用 方法三: 利用Ao ...
- java动态菜单显示实现,java – 为Spring MVC / AOP应用程序实现动态菜单
我希望为我的 Spring MVC应用程序实现动态可更改的菜单(无论何时添加带注释的方法或控制器). 我想要的是引入新的注释(@RequestMenuMapping),它将转到@Controller ...
- Spring MVC详解(学习总结)
一.Sprig MVC简介 1.1介绍 1.2MVC是什么 二.Spring MVC实现原理 2.1核心组件 2.2工作流程 三.第一个Spring MVC 四.常用注解 五.参数绑定 5.1URL风 ...
- 基于佟刚老师视频教程的Spring MVC数据类型转换学习总结
基于Spring MVC数据类型转换的学习笔记总结 问题 页面中数据格式为字符串格式,后台pojo中对应的类型可能为另外一种对象. 如: 在前台页面输入一个固定格式的时间字符串,在后台接收为一个jav ...
- Spring MVC Aop注入遇到空指针bug
目录 过滤 bug描述 源码 问题分析 改进的代码 过滤 如果是配置增强后报空指针,而且没有使用Around的方式,有可能有以下几种情况: Controller层的调用service层时的方法为p ...
- java地址映射关系,Spring MVC——基础(简介,使用,地址映射)
"大佬们"嘴中的SSH,SSM框架,我这种小白终于解除到第二个S了,关于Spring MVC框架,根据最近的学习发现,还是有很多不足和需要加强巩固的地方,所以,通过总结博客的方式将 ...
- 30分钟轻松入门Spring MVC
Spring MVC框架入门学习步骤 1.了解Spring MVC基本慨念, 是什么?,能干什么? 2.Spring MVC核心组件.底层实现原理 3.Spring MVC实际开发, 基于XML方式. ...
- 分布式锁 动态代理 Java数据结构List,Set,Map,Spring执行流程,Spring MVC组件
这里对今日的内容进行总结: 分布式锁具备的条件: 具备的条件: 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行. 高可用的获取锁与释放锁. 高性能的获取锁与释放锁. 具备可重入的特 ...
- Spring MVC 教程详解 个人总结 复习必备 面试宝典 狂神笔记
文章目录 一.MVC 模式 1.什么是 MVC 2.Servlet MVC 小结 二.Spring MVC 1.Spring MVC 概念 为什么学习 Spring MVC 中央控制器 Dispatc ...
- Spring 和 Spring MVC的区别
Spring 和 Spring MVC的区别 学习Spring MVC也有几天时间了,那么Spring和Spring MVC的区别到底在哪里,二者是什么关系呢?认为二者是一个东西那肯定是不对的,而 ...
最新文章
- 5G都不能取代的Wi-Fi6,到底有多厉害?
- 如果某个字段值相同则触发器新增_Thrift IDL新增字段导致版本不一致引发的惨案...
- 浦银行面试总结(信息科技部)
- Android开发之约束布局平均分布|ConstraintLayout平均分布|约束布局均匀分布|ConstraintLayout均匀分布
- Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm
- keepalive高可用nginx(nginx动静分离)的实现
- 前端传递数据超过2M不能传给后台
- 任正非:HR面试不深刻导致大规模进人、走人,耽误人家几年对得起人家吗?...
- 在Ubuntu 20.04(含Xubuntu、Linux Mint Cinnamon等衍生版)上安装Wine QQ,获得更佳的使用体验
- DevExpress的双击获取单元格数据
- office2016 Excel 打开“宏”分三步
- spring的task和quartz的区别
- 搜索引擎Bing必应高级搜索语法
- 基于单片机的危险气体泄露报警器设计
- Chrome 和 Chromium 区别
- 2022.9.15 第1次周报
- kali 2021安装w3af
- linux固定分辨率,Linux系统分辨率设置
- vue多个商品选择与列表显示
- 6种lut预设 CMG Cine LUTs for A7III
热门文章
- 严格对角占优矩阵特征值_MIT—线性代数笔记21 特征值和特征向量
- oracle 基本dos命令,Oracle 常用 Dos命令
- python random模块安装_Python中的For循环和Random模块
- ubuntu 串口调试工具_开源软件分享基于WPF的串口调试工具
- 基础数据类型转换过程中注意事项
- python文件路径的操作
- mysql使用GROUP BY分组实现取前N条记录的方法或最近几条消费记录
- Selenium爬虫 -- 使用Selenium爬取数据时,网页切换之后原先获取的元素变量失效的问题
- MySQL半同步复制 - 优点、缺点、配置
- intellij中使用git插件将项目上传到码云