三、Spring的面向切面
Spring的面向切面
在应用开发中,有很多类似日志、安全和事务管理的功能。这些功能都有一个共同点,那就是很多个对象都需要这些功能。复用这些通用的功能的最简单的方法就是继承或者委托。但是当应用规模达到一定程度时,使用继承或委托将会使应用的结构非常复杂。
面向切面便是解决上面问题的最佳办法。我们把这些通用的功能(横切关注点)放在专门的类中(这种类又叫切面),然后在程序运行后通过动态代理,将这些功能插入到需要这些功能的类中。在这种模式下,这些通用的功能都是通过切面统一管理,使得模块之间更加清晰。
一、面向切面基础
(一)AOP术语
在学习Spring的面向切面时,首先需要学习Spring的AOP术语。在切面中常用的术语有通知(advice)、切点(pointcut)和连接点(joinpoint)。
1.通知(Advice)
当我们往那些需要插入通用功能的类中进行插入时,通知就是定义这个功能是什么以及在什么时候插入,是方法调用之前?之后?还是前后都要用?
前置通知:在目标方法调用之前调用通知功能。
后置通知:在目标方法调用之后调用通用功能,此时不关心方法的输出是什么。
返回通知:在目标方法成功执行后调用通知。
异常通知:在目标方法抛出异常后调用通知。
环绕通知:在目标方法的前后执行自定义的行为。
2.连接点(Join point)
连接点就是所有可以插入功能的点的集合,例如,调用方法时、抛出异常时、修改一个字段时。Spring只支持方法级别的连接点。
3.切点(Pointcut)
我们知道,很多的连接点都可以进行插入功能,但是只有在需要这个功能地方进行插入才会有意义,而这些“需要”的地方,就是切点。
上面说到通知定义了功能是什么以及在什么时候插入。那么切点就是定义在什么地方插入。
4.切面(Aspect)
切面就是通知和切点的结合,他们一起定义了功能是什么以及什么时候、什么地方插入。
5.引入(Introduction)
引入允许我们向现有的类添加新方法或属性(其实是通过动态代理,生成一个和原有类有一样方法的类,同时在这个类中添加新方法或属性。因为方法一样,我们完全可以把新生成的类看成是原来的类)。这样我们就可以在不修改类的情况下让他有新的行为和状态。
6.织入(Weaving)
织入就是把切面应用到目标对象的过程,就是前面说的“插入”。
(二)Spring中使用AOP的几种方式
Spring提供四种AOP支持
- 基于代理的经典SpringAOP
- 存POJO切面(借助Spring的aop命名空间,pojo提供调用方法)
- @AcpectJ注解驱动的切面(可以不借助XML来实现AOP)
- 注入式AspectJ切面
二、创建切面
(一)使用注解创建切面
如果使用AspectJ的注解,需要aspectjrt和aspectjweaver依赖。
切面就是一个特殊的类,之所以特殊是因为要在类上添加@Aspect注解。并且这个切面也需要是一个bean。
下面我们根据一个实例来了解切面的创建,在这个实例中,我们要通过AOP的技术,使得所有的汽车在启动的前后都需要进行安全检查。
首先需要一个接口来构建一个车的骨架。

有公交车和货车都实现了这个接口。


我们的目的是让所有实现Car接口的车在启动前后都能进行安全检查,例如启动前车门情况,跑完锁是否关了等,下面是AOP的实现。

当我们把切面声明完以后,还需要启动AspectJ自动代理,否则就不会生效。
在JavaConfig中,启动需要添加@EnableAspectJAutoProxy注解

在XML中,需要Spring Aop空间的<aop:aspectj-autoproxy>元素
下面是测试代码,测试使用了:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Config.class})
public class CarTest {
@Autowired
private Car bus;
@Autowired
private Car trucks;
@Test
public void go(){
bus.run();
bus.change(1);
bus.change(2);
System.out.println("--------");
trucks.run();
} }
我是使用maven创建的项目,下面是依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.10.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core -->
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.4</version>
</dependency>
(一)处理通知中的参数
当我们创建通知时,可能会需要切入点方法调用时的参数。例如,在计算汽车油量时,通知应该在汽车换挡时获取切换的档数,然后根据档数来计算油耗。

在这个例子中,通过args(num)限定符实现了参数的传递。它说明change()方法的int参数会被传递到通知中去。参数的名称a需要与切点方法签名中的参数相匹配。
三、Spring的面向切面的更多相关文章
- Spring(4)——面向切面编程(AOP模块)
Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...
- Spring IOP 面向切面编程
Spring IOP 面向切面编程 AOP操作术语 Joinpoint(连接点):所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.(类里面 ...
- Spring的面向切面
Spring的面向切面 在应用开发中,有很多类似日志.安全和事务管理的功能.这些功能都有一个共同点,那就是很多个对象都需要这些功能.复用这些通用的功能的最简单的方法就是继承或者委托.但是当应用规模达到 ...
- 利用例子来理解spring的面向切面编程
最近学习了spring的面向切面编程,在网上看到猴子偷桃的例子,觉得这种方式学习比书本上讲解有趣多了,也便于理解.现在就来基于猴子偷桃写个基本的例子. maven工程:
- 详细解读 Spring AOP 面向切面编程(二)
本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...
- 深入学习Spring框架(三)- AOP面向切面
1.什么是AOP? AOP为 Aspect Oriented Programming 的缩写,即面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术..AOP是OOP的延续, ...
- 解析Spring第三天(面向切面AOP)
面向切面:AOP 在不修改源代码的基础上,对方法进行增强.AOP的底层原理就是代理技术(第一种:jdk的动态代理(编写程序必须要有接口).第二种:cglib代理技术(生成类的子类).如果编写的程序有借 ...
- spring AOP面向切面编程学习笔记
一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...
- 【Spring系列】Spring AOP面向切面编程
前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...
随机推荐
- 201521123100 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 201521123053《Java程序设计》第3周学习总结
---恢复内容开始--- 1. 本周学习总结 2. 书面作业 1. 代码阅读 以上代码可否编译通过?哪里会出错?为什么?尝试改正? 如果创建3个Test1对象,有内存中有几个i,几个j? ...
- 201521123057 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 常用异常 1.题目5-1 1.1 截图你的提交结果(出现学号) 答: 1.2 自己以前编写的代码中经 ...
- 201521123014 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 Q1 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用sync ...
- 运用GRASP原则来做uml交互类图-------pos机实例
重要的几个GRASP原则:1.控制器模式 2.创建者模式 (原则)3.信息专家模式(原则) 4. 高内聚 低耦合 这里所说的模式并不是java中针对具体的事件的设计模式 主成功场景的几个操作: ...
- centOS 6启动流程
centOS6启动流程 centOS6启动流程 linux内核组成 centos6启动大致流程 1.post加电自检 2.Boot Sequence 3.MBR引导 4.Grub启动 制作init ...
- XML解析【介绍、DOM、SAX详细说明、jaxp、dom4j、XPATH】
什么是XML解析 前面XML章节已经说了,XML被设计为"什么都不做",XML只用于组织.存储数据,除此之外的数据生成.读取.传送等等的操作都与XML本身无关! XML解析就是读取 ...
- 鸟哥Linux学习笔记07
1, vi 是 老式的文字处理器,不过功能已经很齐全了,但是还是有可以进步的地方. vim可以说是程序开发者的一项很好用的工具,vim官网(http://www.vim.org)自己也说vim是一个“ ...
- APUE 3 -- 信号 (signal)<II>: 可靠信号
一个事件可以事一个信号发送给一个进程,这个事件可以是硬件异常,可以是软件条件触发,可以是终端产生信号,也可以是一个kill函数调用.当信号产生后,内核通常会在进程表中设置某种形式的标志(flag).我 ...
- CSS 入门基础
一.CSS 介绍什么是CSS CSS 指的是层叠样式表(Cascading StyleSheet).在网页制作时采用层叠样式表技术, 可以有效地对页面的布局.字体.颜色.背景和其它效果实现更加精确的控 ...