本随笔内容要点如下:

  • 什么是AOP
  • AOP术语解释
  • Spring中AOP的xml实现

一、什么是AOP

  AOP(Aspect Oriented Programming),即面向切面编程。那什么是面向切面编程呢?切面又是什么呢?

  如下图,本来存在ServiceA、ServiceB、ServiceC的,一刀把它们给切了。那这个面就是切面,切面切面,就是切开的面。

  面向切面编程呢,就是在这个大切面上插入代码,使得ServiceA、ServiceB、ServiceC都能够实现插入的逻辑。在编码中,经常会在一个类中抽取公共代码形成一个独立的方法。而面向切面编程呢,则是抽取多个类中多个方法的相同代码形成一个独立的模块,而这些相同的代码就是横切关注点。例如事务,我们可能会在这些Service中的方法添加事务,而这些事务又与具体的业务逻辑无关,不属于Service的职责,那我们可以将它抽取出来形成一个类,在通过AOP编程来实现原本的逻辑。如下图:

二、AOP术语解释

  • 通知(Advice):要被织入到指定位置的代码,上图的抽取出来的事务就是通知。通知除了定义了切面做什么还定义了这些它什么时候被使用。是在执行方法之前还是执行完方法还是抛出异常后。
  • 连接点(Join point):切面代码被织入的位置。上图事务代码要被织入的方法就是连接点了
  • 切点(Pointcut):用来描述拥有哪些连接点,描述了一个连接点的集合
  • 切面(Aspect):通知和切点的结合
  • 织入(Weaving):把切面应用到指定对象并产生代理对象的过程,抽象地理解为把切面代码插入到指定对象的指定位置

  对于织入,有一下几种形式:

  • 编译器织入:在编译前真真正正地代码插入到指定位置。但这种需要特定的编译器
  • 类加载器织入:当类加载器加载目标类时再织入,即使用字节码来增强。需要特定的类加载器
  • 运行期织入:在运行期间动态地织入,通过代理技术生成代理对象,而代理对象是织入完代码后的对象

  Spring只支持运行期织入,AspectJ三种都支持

三、Spring中AOP的实现

  本随笔使用xml实现,下篇随笔再使用注解实现。

  Spring中有两种方式来实现代理。第一种是Java自带的代理,它要求被代理类必须实现接口。第二种是使用了CGLib,即使被代理类没有实现接口也能被代理。除了引入基础的spring jar包之外,还需要引入aspectjweaver包。我使用的spring版本时4.3.2.RELEASE,当使用aspectjweaver1.8.9时会报错,降到1.8.6就可以正常使用了。

  首先定义一个接口IService以及其实现类ServiceImpl

public interface IService {
public void doSomething(int num);
} public class ServiceImpl implements IService {
@Override
public void doSomething(int num) {
System.out.println("doSomething --" + num);
}
}

  把公共代码提取出来作为一个单独的模块即切面,那就需要定义一个切面,切面也是一个普通的bean,如下:

public class Aspect {
public void before() {
System.out.println("before");
}
}

  接着写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
"> <bean id="aspect" class="cn.powerfully.aspect.Aspect" /> <bean id="service" class="cn.powerfully.service.ServiceImpl" /> <aop:config>
<aop:aspect ref="aspect">
<aop:pointcut expression="execution(* cn.powerfully.service.*.*(..))"
id="p" />
<aop:before method="before" pointcut-ref="p" />
</aop:aspect>
</aop:config> </beans>

  首先先使用<bean>标签定义两个类,接着使用<aop:config>标签,关于切面的都要放在里面。

  定义切面使用<aop:aspect>,切面呢,是由通知和切点组成的,所以定义通知和切点。<aop:before>用来定义一个前置通知,即在执行代码前执行。

  除了前置通知,spring还提供了一下几种通知:

  • 后置通知(after)
  • 返回通知(after-returning)
  • 异常通知(after-throwing)
  • 环绕通知(around)

  除了环绕通知外,其他通知的使用都类似前置通知。环绕通知的使用如下:

  切面类中:

public Object around(ProceedingJoinPoint pjp) throws Throwable {
long time = System.currentTimeMillis();
Object obj = null;
obj = pjp.proceed();
System.out.println(System.currentTimeMillis() - time);
return obj;
}

  该方法有类型ProceedingJoinPoint的参数,通过调用该对象中的proceed()方法可以继续执行被代理对象的逻辑代码。xml配置代码类似前置通知配置。

Spring总结 3.AOP(xml)的更多相关文章

  1. 8 -- 深入使用Spring -- 4...6 AOP代理:基于注解的XML配置文件的管理方式

    8.4.6 基于XML配置文件的管理方式 Spring 2.x 提供一个新的aop:命名空间来定义切面.切入点和增强处理. XML配置方式优点: ⊙ 如果应用没有使用JDK 1.5 以上版本,那么应用 ...

  2. 使用Spring实现AOP(XML+注解)

    一.Spring对AOP的支持 AOP并不是Spring框架特有的,Spring只是支持AOP编程的框架之一,每一个框架对AOP的支持各有特点,有些AOP能够对方法的参数进行拦截,有些AOP对方法进行 ...

  3. 【Spring四】AOP之XML配置

    AOP:Aspect Oriented  Programming 面向切面编程 面向切面编程的核心是动态代理设计模式.请先參见动态代理设计模式笔记. 以Hibernate保存一个对象到数据库为例,因为 ...

  4. spring 5.x 系列第3篇 —— spring AOP (xml配置方式)

    文章目录 一.说明 1.1 项目结构说明 1.2 依赖说明 二.spring aop 2.1 创建待切入接口及其实现类 2.2 创建自定义切面类 2.3 配置切面 2.4 测试切面 附: 关于切面表达 ...

  5. Spring 中基于 AOP 的 XML架构

    Spring 中基于 AOP 的 XML架构 为了使用 aop 命名空间标签,你需要导入 spring-aop j架构,如下所述: <?xml version="1.0" e ...

  6. Spring系列之AOP实现的两种方式

    AOP常用的实现方式有两种,一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ). 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点):程序执行 ...

  7. Spring框架之AOP

    SpringAop: 1.加入 jar 包 com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver ...

  8. Spring学习(二)——Spring中的AOP的初步理解[转]

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  9. springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题

    解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640 ...

随机推荐

  1. 11.js循环与函数

    Switch语句 Switch(变量){ : 如果变量和1的值相同,执行该处代码 break; : 如果变量和2的值相同,执行该处代码 break; : 如果变量和3的值相同,执行该处代码 break ...

  2. Android-Kotlin-接口与多态的表现

    上一篇博客介绍了 Android-Kotlin-抽象类与多态的表现 :, 而这一篇博客专门介绍下 接口与多态的表现 选择包名,然后右键: 选择Class类型,会有class:  选择File类型,不会 ...

  3. [转载]DevOps发展的四个重要阶段

    DevOps是敏捷开发的延续,它将敏捷的精神延伸至IT运营(IT Operation)阶段.敏捷开发的主要目的是响应变化,快速交付价值.以2001年的敏捷宣言发布这个里程碑为起点,开始几年内企业主要在 ...

  4. 【推荐】Win7任务栏增强工具 7+ Taskbar Tweaker 强大的任务栏标签管理工具

    我曾经推荐过一款XP的任务栏管理工具 Taskix,这是一款在XP系统中拖动任务栏内标签的小工具. XP 32位可以下载我汉化的版本 http://www.cnblogs.com/clso/archi ...

  5. XAML 调试工具 不见了?

    XAML调试工具不见了怎么办? 1.调试---> 选项---> 选中 启用XAML的UI调试工具 2.调试---> 选项---> 禁用 使用托管兼容模式 欧了!

  6. UWP Button添加圆角阴影(三)

    原文:UWP Button添加圆角阴影(三) Composition DropShadow是CompositionAPI中的东西,使用Storyboard设置某个属性,就是频繁的触发put_xxx() ...

  7. [模板]最小割树(Gomory-Hu Tree)(luogu4897)

    给定一个\(n\)个点\(m\)条边的无向连通图,多次询问两点之间的最小割 两点间的最小割是这样定义的:原图的每条边有一个割断它的代价,你需要用最小的代价使得这两个点不连通 Input 第一行两个数\ ...

  8. ArrayList的源码分析

    在项目中经常会用到list集合来存储数据,而其中ArrayList是用的最多的的一个集合,这篇博文主要简单介绍ArrayList的源码分析,基于JDK1.7: 这里主要介绍 集合 的属性,构造器,和方 ...

  9. WebDriver高级应用实例(3)

    3.1自动化下载某个文件 被测网页的网址: https://pypi.org/project/selenium/#files Java语言版本的API实例代码 import java.util.Has ...

  10. zookeeper+kafka集群的安装部署

    准备工作 上传 zookeeper-3.4.6.tar.gz.scala-2.11.4.tgz.kafka_2.9.2-0.8.1.1.tgz.slf4j-1.7.6.zip 至/usr/local目 ...