Spring——AOP(面向切面编程)@AspectJ注解方式
一、什么是AOP?
AOP: (Aspect Oriented Programming)即面向切面编程。
试想这样的场景:项目中需要在业务方法执行完打印日志记录。最笨的办法就是在每个方法核心业务执行完后加入日志打印程序语句,但如果项目浩大,这样工程量是巨大的,而且若要求对日志打印部分进行修改,则又要对每个方法里的打印语句进行修改,这简直是灾难。好点的办法就是把打印日志的语句封装起来,抽取出来专门顶一个打印日志的方法,这样会把日志打印语句从核心业务中分离出来,在业务语句执行后调用日志打印的方法即可,这样工作量小了不少,而且耦合度也变低了。但是,因为要调用方法,还是有一定耦合度的,后来有人就提出了AOP,从而彻底地使两者分离。
二、基于@AspectJ注解方式实现AOP:
1.首先要在配置文件中添加<aop:aspectj-autoproxy/>,启动对@AspectJ注解的支持。
<!-- 启动对@AspectJ注解的支持 -->
<aop:aspectj-autoproxy/>
2.定义切面类(所谓切面类,就是定义一些围绕核心业务方法的日志打印之类的方法,去切入核心业务,注解用@AspectJ表示切面类。再在这些定义的处理方法上用@Before,@After,@Around等注解限定它们切入哪些业务方法。
@Component
@Aspect //表示这是一个切面类,里面的方法都是像打印日志等围绕业务方法的方法
public class AopLog { //方法执行前调用,插入com.zywang.services.impl包下所有业务方法
@Before("execution (* com.zywang.services.impl.*.*(..))")
public void printLog() {
System.out.println("业务方法执行前日志。");
} //方法执行后调用,插入 com.zywang.services.impl包下所有方法
@After("execution (* com.zywang.services.impl.*.*(..))")
public void MyMethod() {
System.out.println("业务方法执行后日志");
} //方法执行的前后调用,前后都插入。
@Around("execution (* com.zywang.services.impl.*.*(..))")
public Object MyMethod(ProceedingJoinPoint point) throws Throwable{
System.out.println("begin around");
Object object = point.proceed();
System.out.println("你们都可以来插入我");
return object;
} //方法运行出现异常时调用,出现异常后插入。
@AfterThrowing(pointcut = "execution (* com.zywang.services.impl.*.*(..))",throwing = "ex")
public void MyMethod(Exception ex){
System.out.println("afterThrowing");
System.out.println(ex);
}
}
另外:我们可以声明切入点(Pointcut),所谓切入点就是给比较啰嗦的切入表达式起个简洁的名字,在多处使用的时候用简洁的名字,使之方便。
如下例子,在注解@pointcut下定义一个私有的,无返回值,无参数的方法,就可以取代括号里复杂的切入表达式了。
// 使用@Pointcut Annotation 时指定切入点表达式
@pointcut("execution * transfer(..)")
// 使用一个返回值为void,方法体为空的方法来命名切入点
private void anyOldTransfer(){} // 使用上面定义的切入点
@AfterReturning(pointcut="anyOldTransfer()", returning="reVal")
public void writeLog(String msg, Object reVal){
...
}
Spring——AOP(面向切面编程)@AspectJ注解方式的更多相关文章
- Spring AOP 面向切面编程相关注解
Aspect Oriented Programming 面向切面编程 在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业. ...
- 详细解读 Spring AOP 面向切面编程(二)
本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...
- 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...
- 【原创】Android AOP面向切面编程AspectJ
一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...
- spring AOP面向切面编程学习笔记
一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...
- 【Spring系列】Spring AOP面向切面编程
前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...
- Spring AOP面向切面编程详解
前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...
- 详细解读 Spring AOP 面向切面编程(一)
又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...
- Spring Aop面向切面编程&&自动注入
1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...
- 从源码入手,一文带你读懂Spring AOP面向切面编程
之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...
随机推荐
- UITabBarController使用详解
UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod 程序等.UITabBarController通常作为整个程序的rootViewCo ...
- 如何使用eclipse生成javadoc帮助文档
---恢复内容开始--- 如果你已经能制造轮子了,你想让其他人使用你的轮子,那你就得告诉他们你的轮子都是由什么构成的.这样他们才能更好的使用你制造的轮子.然而,很多开发者都不想写长篇大论的帮助文档,这 ...
- Excel中公式的绝对引用和相对引用单元格
在Excel的表格中,非常常用的就是公式里的绝对引用和相对引用了,具体情况请看下列表格吧. 步骤1 打开做好的excel表格.公式中的相对单元格引用是基于包含公式和单元格引用的单元格的相对位置,若公式 ...
- EXCEL破冰之旅
1 背景 EXCEL用于日常数据分析的工具中,最便利并且最强大的莫属透视表了.因为透视表对原始数据有一定的要求,所以本次的破冰之旅也将把焦点放在如何整理基础数据这个方面. 1.1 初识透视表 ...
- nginx 几个参数
worker_processes : When set to 'auto', which is also the default behavior, Tengine will create the s ...
- hadoop笔记之Hive的数据存储(分区表)
Hive的数据存储(分区表) Hive的数据存储(分区表) 分区表 Partition对应于数据库的Partition列的密集索引 在Hive中,表中的一个Partition对应于表下的一个目录,所有 ...
- ExtJS4.x Grid 单元格鼠标悬停提示
//每一个列都会出现鼠标悬浮上去显示内容 /** * //适用于Extjs4.x * @class Ext.grid.GridView * @override Ext.grid.GridView * ...
- 浮动层固定兼容IE6 position:fixed的最佳解决方案
第一种:css方法 有时候当我们需要把一个元素固定在页面的某个部位,一般都是用css中的“position:fixed;”方法来解决,但是IE6不支持fixed,所以今天分享一个兼容IE6的页面底部固 ...
- JavaWeb基础之tomcat部署
有些东西,看起来简单,做起来也简单,简单的你并不一定知道! 问题:如何将一个java project转变为 web project,并使其自动部署到tomcat? 1.先建立一个Java Projec ...
- 2 kNN-K-Nearest Neighbors algorithm k邻近算法(二)
2.3 示例:手写识别系统 2.3 .1 准备数据:将图像转换为测试向量 训练样本:trainingDigits 2000个例子,每个数字大约200个样本 测试数据:testDigits 大约900个 ...