Spring总结 3.AOP(xml)
本随笔内容要点如下:
- 什么是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)的更多相关文章
- 8 -- 深入使用Spring -- 4...6 AOP代理:基于注解的XML配置文件的管理方式
8.4.6 基于XML配置文件的管理方式 Spring 2.x 提供一个新的aop:命名空间来定义切面.切入点和增强处理. XML配置方式优点: ⊙ 如果应用没有使用JDK 1.5 以上版本,那么应用 ...
- 使用Spring实现AOP(XML+注解)
一.Spring对AOP的支持 AOP并不是Spring框架特有的,Spring只是支持AOP编程的框架之一,每一个框架对AOP的支持各有特点,有些AOP能够对方法的参数进行拦截,有些AOP对方法进行 ...
- 【Spring四】AOP之XML配置
AOP:Aspect Oriented Programming 面向切面编程 面向切面编程的核心是动态代理设计模式.请先參见动态代理设计模式笔记. 以Hibernate保存一个对象到数据库为例,因为 ...
- spring 5.x 系列第3篇 —— spring AOP (xml配置方式)
文章目录 一.说明 1.1 项目结构说明 1.2 依赖说明 二.spring aop 2.1 创建待切入接口及其实现类 2.2 创建自定义切面类 2.3 配置切面 2.4 测试切面 附: 关于切面表达 ...
- Spring 中基于 AOP 的 XML架构
Spring 中基于 AOP 的 XML架构 为了使用 aop 命名空间标签,你需要导入 spring-aop j架构,如下所述: <?xml version="1.0" e ...
- Spring系列之AOP实现的两种方式
AOP常用的实现方式有两种,一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ). 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点):程序执行 ...
- Spring框架之AOP
SpringAop: 1.加入 jar 包 com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver ...
- Spring学习(二)——Spring中的AOP的初步理解[转]
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题
解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640 ...
随机推荐
- hdu 3915 高斯消元
http://acm.hdu.edu.cn/showproblem.php?pid=3915 这道题目是和博弈论挂钩的高斯消元.本题涉及的博弈是nim博弈,结论是:当先手处于奇异局势时(几堆石子数相互 ...
- hdu 5073 有坑+方差贪心
http://acm.hdu.edu.cn/showproblem.php?pid=5073 就是给你 n 个数,代表n个星球的位置,每一个星球的重量都为 1 开始的时候每一个星球都绕着质心转动,那么 ...
- bootstrap2.1相关文档
本节课我们主要学习一下 Bootstrap表格和按钮功能,通过内置的 CSS定义,显示各种丰富的效果. 一.表格 Bootstrap提供了一些丰富的表格样式供开发者使用. 1.基本格式 //实现基本的 ...
- cxgrid动态多表头
function TForm15.CreateBand(View: TcxGridDBBandedTableView; BandCaption, ParentBandCaption: String) ...
- SSD 相关基础知识
SDD 基础知识 SSD(Solid State Drives)是固态硬盘,使用闪存颗粒来存储数据,闪存又可分为NAND Flash和NOR Flash,通常所说的SSD硬盘都使用NAND Flash ...
- Android SDK Mangaer 需要下载的组件
以 Windows 下为例,安装完 Android SDK 后,可以看到 SDK 的目录结构如下: 其中: SDK Manager.exe 是 Android SDK 的管理工具, AVD Manag ...
- [C#]Dapper学习笔记
1.安装,直接用nuget搜索Dapper就行,不过只支持框架4.5.1 2.数据库测试表 CREATE TABLE [dbo].[Student]( [ID] [bigint] NULL, ) NU ...
- 微服务统一登陆认证怎么做?JWT ?
无状态登录原理 1.1.什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session. 例如登录:用户登 ...
- Java正则表达式初学者使用法简介
在Java中使用正则表达式的方法非常多,最简单的就是和字符串一起使用.对于Java正则表达式初学者,在String中有四个方法可以使用正则表达式,本文正是介绍这四个方法来使用正则表达式来处理文本数据. ...
- 初识MQ
[参考文章]:到底什么时候该使用MQ? 1. 什么是MQ? 消息队列(Message Quene)是一种跨进程的通信机制,用于上下游传递消息. MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通 ...