SpringMVC 的 切面
官网路径:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans
一:术语介绍
通知(Advice)
指切面(定义为aspect的类)中的工作;
spring切面可以应用的五种通知:
前置通知(Before):在目标方法被调用之前调用通知功能;
后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
返回通知(After-returning):在目标方法成功执行之后调用通知;
异常通知(After-throwing):在目标方法抛出异常后调用通知;
环绕通知(Around):通知报过了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
连接点(Join point)
连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。(切点方法中配置的匹配的方法都是连接点)
切点(Pointcut)
定义通知所要织入的一个或多个连接点。
切面(Aspect)
是通知和切点的结合。
引入(Introduction)
向现有的类添加新的方法和属性。
织入(Weaving)
织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:
编译期:切面在目标类编译时被织入,这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
类加载期:切面在目标类加载到jvm时被织入。这种方式 需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。
运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理对象。Spring AOP就是以这种方式织入切面的。
下图展示了这些概念是如何联系在一起的。
下面了解一下具体的切点表达式。在spring的切面中,主要使用execution指示器来设置匹配的方法。下图中的表达式能够设置当sleep()方法执行时触发的通知调用。
execution()指示器选择ViewController的sleep()方法,方法表达式以“*”号开始,表明了不关心方法返回值的类型。然后,指定了全限定方法名和类名。对于方法参数列表,使用两个点号(. .)表明切点要选择任意的sleep()方法,不需要考虑入参。
使用AspectJ切点表达式来选择ViewController的sleep方法
如果我们需要设定切点仅适用于某个包下的方法,则可以使用within()指示器来指定,不同的指示器之间使用&&(and)或||(or)连接。如下图表达式,表示只匹配com.spring包下的ViewController的sleep()方法。
spring中还引入了bean()指示器,可以限制切点只匹配特定的bean,也可以使用!bean()来匹配除了特定bean以外的其他bean。如下:
execution(* com.spring.ViewController.sleep()) and bean ("rest")
execution(* com.spring.ViewController.sleep()) and !bean ("rest")
下面写一个切面的demo。
首先,在com.spring下的ViewController类中添加一个sleep()方法如下:
@RequestMapping("/sleep")
public String sleep(){
System.out.println("sleeping………………zzzZZZ~~~~");
return "index";
}
然后,添加切面代码。使用注解新建一个切面SleepHelper,代码如下。
@Component
@Aspect
public class SleepHelper { public SleepHelper(){ } @Pointcut("execution(* com.spring.controller.ViewController.*(..))")
public void sleeppoint(){
} @Before("sleeppoint()")
public void beforeSleep(){
System.out.println("马上要睡觉咯~~~");
} @AfterReturning("sleeppoint()")
public void afterSleep(){ System.out.println("睡醒咯!");
} }
当然也可以这么定义
@Before("execution(* com.spring.controller.ViewController.save(..)) && args(para1,para1)")
public void test(String para1,String para1) throws Exception {
params= obj;
}
关于参数:
com.spring.controller.ViewController.save(..)
此处为切入到具体方法:
save(..) -- .. 表示所有参数
args(para1,para1) 此处为具体参数
public void test(String para1,String para1) --方法里面的可以拿出来在方法中使用
最后,项目是maven的项目,所以需要在pom.xml中添加切面对应的依赖jar包,并在applicationContext.xml文件中添加下图红框中的内容:

第一个红框中内容作用:声明spring的aop的命名空间;
第二个红框中内容作用:启用aspectj的自动代理;
SpringMVC 的 切面的更多相关文章
- SpringMvc 面向切面1
1.配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC &q ...
- SpringMvc切面校验JavaBean及基础类型
先配置好aop需要的配置,文:https://www.cnblogs.com/jiangxishicheng/p/10896498.html 编写校验切面类: package com.aspect;/ ...
- springmvc学习笔记三:整合JDBC,简单案例==数据库事务配置(切面)
package cn.itcast.bean; import org.springframework.jdbc.core.PreparedStatementSetter; public class U ...
- 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...
- spring springMVC
spring是一个开源框架,是为了解决企业应用程序开发,功能如下 目的:解决企业应用开发的复杂性 功能:使用基本的javabean代替EJB,并提供了更多的企业应用功能 范围:任何java应用 总之: ...
- SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)【转】
使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合 ...
- java web后台开发SSM框架(Spring+SpringMVC+MyBaitis)搭建与优化
一.ssm框架搭建 1.1创建项目 新建项目后规划好各层的包. 1.2导入包 搭建SSM框架所需包百度云链接:http://pan.baidu.com/s/1cvKjL0 1.3整合spring与my ...
- springMVC+spring+hibernate 框架整合实例
先说一下流程思路: 流程讲解1:首先访问会先定位到控制器.这就用到了过滤器配置文件"spring-mvc.xml".这个文件负责定义控制器的包路径.视图的格式等.其次从" ...
- 整合Spring、SpringMVC、MyBatis
spring+springmvc+mybatis集成 一个核心:将对象交给spring管理. 1新建web项目 2添加项目jar包 spring包见上一篇博客 3建立项目的目录结构 4完成Mapper ...
随机推荐
- 阿里云OSS-js分片上传
使用 aliyun-oss-sdk-4.4.4.min.js 方式一 客户端授权 https://help.aliyun.com/document_detail/32069.html 通过new OS ...
- The left-hand side of an assignment must be a variable,代码中使用了中文的字符
进行ajax测试,报这个错误,代码检测无误,然后就是查了相关文档 发现是符号错误,eclipse识别中文符号,就会报这个错误,而且eclipse的js里需要写冒号结尾,附个代码. <body&g ...
- linux nkf 日文编码转换命令[转载]
对于日语的编码 windows : Shift-JIS Linux : 2.4内核使用EUC编码,2.6内核中使用UTF8编码 检查文件编码 nkf -g filename 通常处理字符编码都使用i ...
- spring注解@Value取不到值【转】
spring注解@Value取不到值 今天在一个项目中发现一个情况,在Service中取不到name值,直接输出了{name}字符串,找了好久,最后在一篇文章中找到解决方案. 解决这个问题的一篇文章( ...
- Window vista 以上制作自定义证书并为端口配置ssl
此处的关键在于证书需要分两步,不然在配置ssl时总会有错误.也许makecert命令也会有些玄机,但是管他呢,请按以下步骤和命令配置,几分钟就可成功: 证书制作: 1, 在开始/所有程序(或其他地方 ...
- CGLIB实现动态代理
JDK动态代理和CGLIB字节码生成的区别? * JDK动态代理只能对实现了接口的类生成代理,而不能针对类 * CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承 ...
- ORACLE PATCH 版本的查询 PL/SQL
--ORACLE PATCH 版本的查询 PL/SQL SELECT DD.PATCH_NAME, PP.CREATION_DATE, PP.DRIVER_FILE_NAM ...
- Linux服务器使用XShell上传下载文件
在学习Linux过程中,我们常常需要将本地文件上传到Linux主机上,这里简单记录下使用Xsheel工具进行文件传输 1:首先连接上一台Linux主机 2:输入rz命令,看是否已经安装了lrzsz,如 ...
- 原生 javaScript 百叶窗 效果的实现及原理介绍
百叶窗大家都见过吧!如图: 原理: 如图所示,空心格子就好比是每个li,给它设定相对定位属性,设置overflow:hidden: 黑块为li子元素,高度为li的2倍,设置absolute属性,我们正 ...
- windows下用wampServer 为wordpress 搭建本地服务器运行环境
1.准备wamp server wamp是windows apache mysql php 的首字母缩写,更新的wamp总能保证wordpress对服务器的要求 点此下载最新wamp 2.安装wa ...