spring学习总结二-----面向切面编程(AOP)思想
上一篇spring博客简总结了spring控制反转和依赖注入的相关思想知识点,这篇博文对spring的面向切的编程思想进行简单的梳理和总结。
一、面向切面的思想
与面向对象的纵向关系概念不同,面向切面体现的是一种横向的关系:即某个代码块它需要被很多个模块调用,例如安全验证类代码和日志类代码,几乎所有业务模块都必须引用这些代码块,所以这些代码块横向地穿插在各个不同模块之间,造成了代码的重复。另外,模块之间的耦合度增加,开发不同模块的程序员不能独立进行工作,而且扩展性不好。下面这个图展现了这样一种横切关系:

下面的代码demo展示了这样一种情况:
class User{
//该类有个login方法
public void login(){
//在传统的面向对象编程中,如果login方法前需要有一个安全验证的方法,则我们直接在这里引用相应的代码
//这里是安全验证类的代码......
System.out.println("我是安全验证类代码,在login正式方法前必须执行");
//下面才是正式的登录操作代码
System.out.println("user login method");
//然后,执行login正式代码后,我们还有可能将用户操作记录写进日志文件
System.out.println("日志文件操作代码");
}
}
显然,登录方法前后都有与登录业务关系不大的模块代码,严重影响了代码的解耦。
所以,我们需要某种手段将横切的模块(权限,日志,事务等模块)抽取出来,然后统一地控制,而这种抽取的手段就是通过面向切面的思想来实现的。
二、aop的一些概念
1、横切关注点:表明我们要横切的对象方法,从什么地方开始横切,横切之后要执行说明方法。例如,上面的登录,我们的横切关注点就是:对login方法进行横切拦截操作,在方法执行前,执行我们的安全验证代码,在方法执行后,执行我们的日志方法。
2、连接点和切入点:就是拦截到的地方。例如上面代码,连接点就是可以看成是login这个方法,我们的横切代码就是在连接点处某个状态(包括之前,之后,抛出异常等状态)开始运行的,而切入点就是具体连接点的拦截定义。
3、通知(advice):就是我们在拦截处需要执行的具体方法,例如上面的通知就是安全验证类代码和日志类代码。
当然,AOP中的概念这里并没有完全列举,只是列举了部分最常用的概念,想了解更多可以百度下。
三、spring中如何面向切面(这里只讲xml配置方式,注解方式请参考其他资料)
在将具体aop实现原理之前,让我们先通过spring这个框架,大概感受下面向切面的含义。下面的例子展示了在spring中如何面向切面;
接着上面User类的例子,看下面的demo,注意看注释:
首先,上java代码:
//在User类中横切AopTest类中的方法
class User{
private String userName = null;
public void setUserName(String userName) {
this.userName = userName;
} public void login(){
System.out.println("user login method");
}
}
//该类中含有aop的通知
class AopTest{
public void loginBefore(){
System.out.println("login before method");
}
public void loginAfter(){
System.out.println("login after method");
}
}
//测试方法
public class AopBlog {
public static void main(String[] args) {
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User test = (User)appContext.getBean("userId");
test.login();
} }
下面注意看spring中如何具体适用切面:
<bean id="aopTest" class="review.blog.springRevice.AopTest"></bean>
<bean id="userId" class="review.blog.springRevice.User">
<property name="userName" value="UserName1"/>
</bean> <aop:config>
<!-- aop:aspect标签声明了织入类的信息,ref指向对应的织入类 -->
<aop:aspect id="myAop" ref="aopTest">
<!-- aop:pointcut标签声明了切入点,表明织入类是为该切入点服务的 -->
<aop:pointcut id="pointCutTarget" expression="execution(* review.blog.springRevice.User.login(..))"/>
<!-- before和after标签声明了通知执行的顺序:在切入对应方法之前(before)之后(after),当然,也可以有其他配置:例如抛出异常等 -->
<aop:before method="loginBefore" pointcut-ref="pointCutTarget"/>
<aop:after method="loginAfter" pointcut-ref="pointCutTarget"/>
</aop:aspect>
</aop:config>
这里顺便说明切入点的命名规则,以execution (* com.sample.service.impl..*.*(..))为例:
1、execution(): 表达式主体。
2、第一个*号:表示返回类型,*号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法,当然,也可以向上面例子一样具体到某个类的方法。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
具体更详细的表达式命名规则可以参考一下这篇博客
另外,在配置文件头部,记得引入命名空间,具体看下面截图说明:

<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
运行上面代码,你会发现如下结果:
login before method
user login method
login after method
spring中aop的总结先到这里,下一篇博客将重点讲解下AOP的实现原理。
spring学习总结二-----面向切面编程(AOP)思想的更多相关文章
- Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)
一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...
- Spring学习总结之面向切面(AOP)
AOP术语 通知(advice):定义切面是什么以及什么时候使用 连接点(join point):应用在执行过程中能够插入切面的点 切点(pointcut):切点的定义会匹配通知所要织入的一个或多个连 ...
- Spring学习手札(二)面向切面编程AOP
AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...
- Spring框架学习笔记(2)——面向切面编程AOP
介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...
- Spring之控制反转——IoC、面向切面编程——AOP
控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- 【串线篇】面向切面编程AOP
面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...
- [译]如何在ASP.NET Core中实现面向切面编程(AOP)
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...
随机推荐
- 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 957 Solved: 449[Submit][Status] ...
- [lua] mac上如何编译snapshot(检测Lua中的内存泄露)
最近我们的unity手游频繁闪退,只要进入战斗场景,之后一段时间就会闪退,如果是在unity编辑器中则会报出not enough memory的错误!猜测应该是有内存泄漏: 由于我们使用了tolua, ...
- MyEclipse下打开ftl文件
转:http://blog.csdn.net/w410589502/article/details/51669028 1.Freemarker模板的文件后缀名 2.Freemarker其实是一种比 ...
- Java:从面试题“i++和++i哪个效率高?"开始学习java字节码
今天看到一道面试题,i++和++i的效率谁高谁低. 面试题的答案是++i要高一点. 我在网上搜了一圈儿,发现很多回答也都是同一个结论. 如果早个几年,我也会认同这个看法,但现在我负责任的说,这个结论是 ...
- JavaScript高级程序设计---学习笔记(一)
今天,2017.3.17开始利用课余时间仔细学习<JavaScript高级程序设计>,将需要掌握的知识点记录下来,争取把书里的所有代码敲一遍并掌握. 1.标识符命名最好是第一个字母小写,剩 ...
- JS中new的自定义实现创建实例对象
我们都知道在JS中通常通过对象字面量和new关键字来创建对象,那么今天我就来给大家讲讲new是怎么创建实例对象的:首先创建一个构造函数: function Person(name,age){ this ...
- CSV工具类
分享自己昨天写的CSV工具类, 主要实现解析CSV格式, 直接上代码 #region private /// <summary> /// 从sr当前位置解析一个栏位 /// </su ...
- 如何用 JavaScript 下载文件
简介 我们知道,下载文件是一个非常常见的需求,但由于浏览器的安全策略的限制,我们通常只能通过一个额外的页面,访问某个文件的 url 来实现下载功能,但是这种用户体验非常不好. 幸好,HTML 5 里面 ...
- MAC下Xcode配置opencv(2017.3.29最新实践,亲测可行)
本文原创,未经同意,谢绝转载!(转载请告知本人并且经过本人同意--By Pacific-hong) 本人小硕一枚,因为专业方向图像相关,所以用到opencv,然后网上MAC下Xcode配置opencv ...
- 谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...