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支持

  1. 基于代理的经典SpringAOP
  2. 存POJO切面(借助Spring的aop命名空间,pojo提供调用方法)
  3. @AcpectJ注解驱动的切面(可以不借助XML来实现AOP)
  4. 注入式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的面向切面的更多相关文章

  1. 三、Spring的面向切面

    Spring的面向切面 在应用开发中,有很多类似日志.安全和事务管理的功能.这些功能都有一个共同点,那就是很多个对象都需要这些功能.复用这些通用的功能的最简单的方法就是继承或者委托.但是当应用规模达到 ...

  2. Spring(4)——面向切面编程(AOP模块)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  3. Spring IOP 面向切面编程

    Spring IOP  面向切面编程 AOP操作术语 Joinpoint(连接点):所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.(类里面 ...

  4. 利用例子来理解spring的面向切面编程

    最近学习了spring的面向切面编程,在网上看到猴子偷桃的例子,觉得这种方式学习比书本上讲解有趣多了,也便于理解.现在就来基于猴子偷桃写个基本的例子. maven工程:

  5. 详细解读 Spring AOP 面向切面编程(二)

    本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...

  6. spring AOP面向切面编程学习笔记

    一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...

  7. 【spring-boot】spring aop 面向切面编程初接触--切点表达式

    众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...

  8. 【spring-boot】spring aop 面向切面编程初接触

    众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...

  9. spring的面向切面实现的两种方式

    面向切面:主要应用在日志记录方面.实现业务与日志记录分离开发. spring面向切面有两种实现方式:1.注解 2.xml配置. 1.注解实现如下: (1)配置如下: <?xml version= ...

随机推荐

  1. jquery表格展示

    用bootstrap设计一个弹框,然后在弹框里面生成表格 <html> <head> <link rel="stylesheet" href=&quo ...

  2. union 类型(即sum types)在golang语言中的实现

    http://www.jerf.org/iri/post/2917 Sum Types in Go posted Jun 02, 2013 in Programming, Golang, Haskel ...

  3. [py]flask动态展示主机内存图

    echarts基础 需要借助这个图来绘制,动态内存图. 绘制步骤 写py脚本来入库日志 选取合适的echart,并观察图所需的数据格式 用flask返回这个静态的echarts 用flask写接口返回 ...

  4. for练习相关

    for嵌套: 大圈套小圈思想:有一种重复的情况而这种情况每一次对应另外情况多次. ------------------------------------------------------- 例如: ...

  5. 逻辑运算,&,&&, |, ||, ^, !

    &:与  特点:判断时两边为true才为true,只要两边有一个为false则结果为false:true&true=true: false&true=false: true&a ...

  6. pycharm进行调试[转载]

    转自:https://blog.csdn.net/william_hehe/article/details/80898031 1.首先设置断点. 2.Step into(F7):进入 若函数A内存在子 ...

  7. mysql 开启慢查询

    linux启用MySQL慢查询 vim /etc/my.cnf [mysqld] slow-query-log = on slow_query_log_file = /var/log/slow_que ...

  8. MVC5+Easyui1.3.6+EF6 开发部分备忘笔记

    一点一点增加,后面继续. 1.Row Editing in DataGrid 编辑,总是绑定不了checkbox的问题

  9. Integer类之成员变量

    一.一共11个成员变量. 二.详情介绍. 1.value值.这个是Integer类的唯一标志.最重要的实例属性. 2.最小值和最大值常量.注意,计算机里面是以补码形式保存的,因此用十六进制时,给的数据 ...

  10. Hadoop学习之路(二十四)YARN的资源调度

    YARN 1.1.YARN 概述 YARN(Yet Another Resource Negotiator) YARN 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操 作系 ...