AOPAspect-Oriented Programming的缩写,中文翻译是面向切面编程。作为Spring的特征之一,是要好好学习的。

首先面向切面编程这个名称很容易让人想起面向对象编程(OOP)来。我们知道面向对象编程是从上往下的把系统拆分成若干个类,如Web项目中常见的ControllerServiceDao等分层。但是面向对象编程对于从左到右的水平抽象十分无力,类似于日志、权限等系统级功能的代码会重复的出现在任何地方。简单的说,面向切面编程是对面向对象编程的一种补充,它可以把系统里一些分散的重复代码集中在一起,抽象成一个切面。先来举一个例子:

有一个内部使用的管理系统,Controller中的每个接口在调用时都要记录下当前用户名称、当前时间等参数。

很明显这个需求的实现代码在每个接口中都是重复的。即使提取成公共类的公共方法,在每个接口里也都有一句该公共方法的调用,导致类之间的耦合。

我们希望把原来接口中的记录代码去除掉,使这些接口只关注自己的业务逻辑。然后使用预编译或运行期动态代理等方式实现在不修改接口代码的情况下,为接口添加记录功能。这种动态地将代码织入到类的指定方法、指定位置上的编程思想就是面向切面编程。

概念

面向切面编程具体的一些概念。

《EXPERT ONE ON ONE J2EE DEVELOPMENT WITHOUT EJB》第8章、《Spring实战》第4章:

  • 增强(advice,另译为通知,但《Spring3.x企业应用开发实战》作者不赞成):在特定连接点执行的动作。例子中的实现代码就是增强。

  • 切点(pointcut):一组连接点的总称,用于指定某个增强应该在何时被调用。例子中的指定哪些接口和指定位置就是切点。

  • 连接点(join point):在应用执行过程中能够插入切面的一个点。例子中具体的一个接口和指定位置的结合就是连接点。

  • 切面(aspect):通知(即增强)和切点的结合。

AOPSpring中主要是通过动态代理实现的,具体实现也分为两种:JDK动态代理CGLIB动态代理。其中JDK动态代理是基于接口代理,CGLIB动态代理是基于继承代理。

JDK动态代理

作为Java自带的一种动态代理技术,JDK动态代理的优势是使用反射技术来生成代理类,在生成效率上比较高。缺点是只能基于接口来动态代理,如果目标类没有实现任何接口是不能使用JDK动态代理的。

来看一个用JDK动态代理的例子。

public class DynamicProxy implements InvocationHandler {

    /**
* 被代理类
*/
private Object target; public DynamicProxy(Object target) {
this.target = target;
} public static Object bind(Object target) {
InvocationHandler invocationHandler = new DynamicProxy(target);
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), invocationHandler);
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + " 方法执行前");
//执行被代理类方法
Object ret = method.invoke(target, args);
System.out.println(method.getName() + " 方法执行后");
return ret;
} public static void main(String[] args) {
Dao dao = new OrderDao();
dao.doSomeThing();
Dao daoProxy = (Dao) DynamicProxy.bind(dao);
daoProxy.doSomeThing();
} }
复制代码
public class OrderDao implements Dao {

    @Override
public void doSomeThing() {
System.out.println("test");
} }
复制代码
public interface Dao {

    void doSomeThing();

}
复制代码
输出:
test
doSomeThing 方法执行前
test
doSomeThing 方法执行后 Process finished with exit code 0
复制代码

后记

这次只是梳理下概念,把自己理解的AOP概念写下来。也参考了很多文章,大体都是一致的细节上有些不同,把自己理解的写出来给大家看下就知道有没有错了。顺便整理一下,免得以后别人问起自己支支吾吾的不知道从哪说起。并没有去了解Spring中具体的AOP实现,有兴趣的同学可以自行深入了解下。

Spring理论基础-面向切面编程的更多相关文章

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

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

  2. Spring IOP 面向切面编程

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

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

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

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

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

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

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

  6. 【Spring系列】Spring AOP面向切面编程

    前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...

  7. 从源码入手,一文带你读懂Spring AOP面向切面编程

    之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...

  8. Spring AOP面向切面编程详解

    前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...

  9. Spring AOP 面向切面编程相关注解

    Aspect Oriented Programming 面向切面编程   在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业.   ...

随机推荐

  1. Cstring, TCHAR*, char*的转换

    最近老用到Cstring, TCHAR*, char*的转换. 找到一篇写得蛮详细的. 引用过来, 方便自己以后查阅. char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底 ...

  2. TCP系列21—重传—11、TLP

    一.介绍 Tail Loss Probe (TLP)是同样是一个发送端算法,主要目的是使用快速重传取代RTO超时重传来处理尾包丢失场景.在一些WEB业务中,如果TCP尾包丢失,如果依靠RTO超时进行重 ...

  3. web前端之路 - 开篇

    一 web发展历程 了解事物的历史有助于我们渐进式的从发展的思路清楚了解事物的来龙去脉. 这里有一篇网文写得比较清晰和完整:https://www.tianmaying.com/tutorial/we ...

  4. YaoLingJump开发者日志(三)

      开始第二关的筹建.   增加了地刺和会移动的砖块.   每次增加一个新东西都要改好多代码,好累吖.   把第二关搞出来后发现太难了,强行调整难度.   修复了一些bug.   调整难度后还是发现太 ...

  5. windows批处理学习(call与start)---02

    参考:https://www.cnblogs.com/Braveliu/p/5078283.html 一.call命令总结 (1)call命令简介 语法: call [ [Drive:] [Path] ...

  6. 第一部分shell编程1基础知识

    ls etc/init.d/ shell脚本的路径 ls /usr/local/apache2/ ls /usr/local/apache2/bin/apachectl 1. shell特性命令历史 ...

  7. 第四部分shell编程5项目二分发系统

    第一部分:expect讲解expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令.但当不能使用密钥验证的时候,我 ...

  8. 网络控制API 路由表 arp表 包括tcp的这些参数都是从哪里设置

    路由表查看 arp缓存 都是走的什么接口?

  9. [剑指Offer] 53.表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

  10. SQL查询数据总结

    SQL查询数据 完整语法 Select [select选项] 字段列表[字段别名]/* from 数据源 [where条件子句] [group by子句] [having子句] [order by子句 ...