Spring AOP 切面编程的方法
spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现。
先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅。目录如下:
1.基于注解实现spring aop
2.基于配置文件实现spring aop
3.增强的分类
4.切点表达式的构成
1.基于注解来实现的方法
基于注解并不意味着不需要配置文件,只不过是在配置文件中所需要的配置很少。切面编程,显然我们需要一个增强类,一个被增强的普通类。
配置文件中需要添加以下的内容
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.2.xsd" <!--引入配置--> <context:component-scan base-package="com.test.aspect"/> <!--扫描这两个包-->
<context:component-scan base-package="com.test.user"/> <aop:aspectj-autoproxy/> <!--开启aop自动扫描-->
下面是增强类
package com.test.aspect; @Component
@Aspect
public class TestAspect{
@Before("execution(* com.test.user.Login.greetTo(..))")
public void beforeDoing(){ //do somthing
}
}
下面是被增强类
@Component
public Class Login{ public void greetTo(){
//some action
}
}
这样就可以完成对被增强类的增强。
2.基于配置文件的方式
非注解方式的首先把上面的注解都去掉,主要内容在配置文件中,配置文件如下 (其实还有 <aop:advisor>的配置,不过是旧版本所用,如果spring版本较低使用)
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.2.xsd" <!--引入配置--> <aop:config proxy-target-class="true"> <!--aop config 是最外层的内容-->
<aop:pointcut id="pc" expression="execution(* com.test.aspect.*(..))"/> <!--首先定义了切入点-->
<aop:aspect ref="TestAspect" order="2"> <!--定义了增强类 order指的是增强织入的顺序-->
<aop:before method="beforeDoing" pointcut-ref="pc"/> <!--指定增强类中一个方法为before增强,切入点为之前定义的切入点-->
</aop:aspect>
</aop:config>
3.增强的分类
增强主要有以下几种:1.before 2.after 3.after-returning 4.after-throwing 5.around
依次进行一下介绍,提供注解方式和配置文件方式
// before 增强是在所需要增强的方法执行之前被织入
@before("execution(* org.test.*.*(..))")
public void beforeAction(JoinPoint jp) //如果要使用joinpoint必须是第一个参数
{
jp.getSignature().getName(); //获得目标方法
jp.getArgs(); //获得目标方法的参数
//dosomething
}
在配置文件中写成
<aop:before pointcut="execution(* org.test.*.*(..))" method="beforeAction"/>
//after 增强无论目标方法如何结束,都会织入在方法的后面
@After("execution(* org.test.*.*(..))")
public void afterAction(JoinPoint jp){
//doSomething()
}
<aop :after pointcut="execution(* org.test.*.*(..))" method="afterAction">
//AfterReturning 将在目标方法正常完成后被织入 @AfterReturning(returning ="rvt" ,pointcut="execution(* org.test.*.*(..))")
public void log(JointPoint jp,Object rvt){
//rvt是目标方法的返回值
} <aop:after-returning pointcut="execution(* org.test.*.*(..))" method="log"/>
//afterthrowing 用于处理程序中未被处理的异常 @AfterThrowing(throwing="ex",pointcut="execution(* org.test.*.*(..))")
public void recovery(Throwable ex){ //ex 是目标方法抛出的异常
} <aop:after-throwing pointcut="execution(* org.test.*.*(..))" method="recovery" throwing="ex">
//round 功能比较强大,可以环绕被增强方法
@Around("execution(* org.test.*.*(..))")
public Object round(ProceedingJoinPoint pjp){
Object[] args=jp.getArgs(); //获得参数
Object rvt=jp.procceed(args);//调用目标方法,可以将修改后的参数传入
return rvt+1; //可以对返回值进行处理
}
<aop:around pointcut="execution(* org.test.*.*(..))" method="round"/>
4.切点表达式的构成
//可以定义一个切点,然后后续重复使用,比较方便
@Pointcut("execution(* org.test.*.*(..))")
public void myPointcut(){}
@Before(pointcut="myPointcut")
public void before(){
....
}
//下面是配置文件方法中的对应内容
<aop:poincut id="myPointcut" expression=""execution(* org.test.*.*(..))""/>
<aop:aspect ref="TestAspect">
<aop:before method="before" pointcut-ref="myPointcut"/> </aop:aspect>
之前所用的切点指示符只有 execution 还有 within this target args 下面依次进行介绍
execution(1? 2 3? 4(5) 6?)
1.指定方法的修饰符 public private等,该部分可省略
2.指定方法的返回值 该部分不可省略 不过一般用*代表任意返回值
3.指定方法所属的类 可以省略,可用通配符
4.指定方法名,可用通配符,不可省略
5.指定方法的参数支持*与.. ()表示没有参数 (*)表示一个任意类型的参数 (..)表示任意数量的参数 (String,..)表示有一个String 参数,后面可以有任意个参数不可省略
6.指定方法声明要抛出的异常(throws) 可用通配符 可省略 eg. execution(* org.test.service.impl.*.*(..))//org.test.service.imple 包下所有类的所有方法 pointcut="execution(* org.test.service.impl.*.*(..))"
//args 表示入参的类型 当入参类型匹配时织入 强调参数,可用execution代替
arg(Integer) //within 类匹配模式
within(org.test.User) //匹配User中的所有类,最小粒度,不能到方法
within(org.test.*) //匹配org.test包中的所有类
within(org.test..*) //匹配org.test包及子孙包中的所有类 //target和within类似,匹配符合的类别 //this判断代理对象的类是否匹配 //这几种都没怎么用过,所以简略提一下,用到后再补充
切点表达式也可以用复合的方式 && || !
用法很简单,而且个人感觉用处并不大...
@Before("A&&B") AB均为之前描述的表达式
如果在xml中配置则要用and or等 pointcut="A and B"
先写到这里,如果有需要补充的再来!
Spring AOP 切面编程的方法的更多相关文章
- Spring AOP 切面编程记录日志和接口执行时间
最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...
- spring aop 切面编程中获取具体方法的方法
spring 切面编程中获取具体方法的方法 工作中,使用环绕通知,用来捕获异常,然后通过获取方法的返回值,返回不同的数据给到调用方. 由于方法的返回值不同,我们处理异常时,也需要返回不同的格式. 这时 ...
- Spring AOP 切面编程实战Demo项目
为什么会有此项目?在某日,我看博客时,看到了讲面向切面编程的内容,之前也知道spring是面向切面编程的,只是自己没有写过相关的代码,于是决定自己写一个test.但是url拦截器从外部看,和AOP有相 ...
- spring aop切面编程实现操作日志步骤
1.在spring-mvc.xml配置文件中打开切面开关: <aop:aspectj-autoproxy proxy-target-class="true"/> 注意: ...
- spring aop 切面编程
import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Ha ...
- Spring 面向切面编程(AOP)
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入
首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html http://www.cnblogs.com/guokai8 ...
- 快速高效掌握企业级项目中的Spring面向切面编程应用,外带讲面试技巧
Spring面向切面编程(AOP)是企业级应用的基石,可以这样说,如果大家要升级到高级程序员,这部分的知识必不可少. 这里我们将结合一些具体的案例来讲述这部分的知识,并且还将给出AOP部分的一些常见面 ...
- [Spring] Aspect Oriented Programming with Spring | AOP | 切面 | 切点
使用Spring面向切面编程 1.介绍 AOP是OOP的补充,提供了另一种关于程序结构的思路. OOP的模块化的关键单位是 类 . AOP的则是aspect切面. AOP 将程序的逻辑分成独立的块(叫 ...
随机推荐
- 【转】推荐UML插件AmaterasUML
基于Green UML在使用过程中的问题(对于大工程,点击生成类图后不响应),自己只能再次寻找其他的插件.在无意中,发现AmaterasUML. 官方网站:http://amateras.source ...
- why cpp is a shitty language
// the below is a standard template for any of my writings about c++ cpp_is_a_shitty_language_as { t ...
- ubifs核心功能 -- 垃圾回收
可回收空间的分类 垃圾回收的目的是再利用(回收后的空间大小能写入有效的node),如果再利用的价值越低,其回收的必要性越低.为了进行有效的垃圾回收,UBIFS对可回收空间做了2个层次的水线划分: 死空 ...
- BZOJ4552: [Tjoi2016&Heoi2016]排序
Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...
- IOS 蓝牙相关-连接外设的代码实现(2)
我们具体说明一下中心模式的应用场景.主设备(手机去扫描连接外设,发现外设服务和属性,操作服务和属性的应用.一般来说,外设(蓝牙设备,比如智能手环之类的东西), 会由硬件工程师开发好,并定义好设备提供的 ...
- Java_CookieUtil
package com.willow.util; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequ ...
- Eclipse 使用maven创建Dynamic Web Project
今天看到spring的官网首页已经没有下载连接了,建议使用maven构建spring项目.虽然maven已经不是新技术,但是这个我还没用过,谷歌走起! 通常创建项目都是用Eclipse,前几年还是My ...
- 深入C#判断操作系统类型的总结详解(转载)
Windows操作系统的版本号一览 操作系统 PlatformID 主版本号 副版本号 Windows95 1 4 0 Windows98 1 4 10 WindowsMe ...
- 李洪强iOS经典面试题上
李洪强iOS经典面试题上 1. 风格纠错题 修改完的代码: 修改方法有很多种,现给出一种做示例: // .h文件 // http://weibo.com/luohanchenyilong/ / ...
- iOS 最全面试题
HTTP/1.0 在HTTP/1.0版本中,并没有官方的标准来规定Keep-Alive如何工作,因此实际上它是被附加到HTTP/1.0协议上,如果客户端浏览器支持Keep-Alive,那么就在HTTP ...