小王被委托开发一款游戏,程序分为启动页面,登陆页面,战斗页面等。小王就采用了面向对象编程思想(OOP),把整个程序分解成下图
这种就是传统的自上而下的编程,或者说纵向的编程,负责启动的模块调用登陆模块,登陆模块调用战斗模块。这个时候甲方说了,我们这个游戏要改!登陆启动页面要加广告,战斗页面也要加广告。可是三个模块已经写好了,怎么往里面添加功能?这就是面向对象编程的不足,为了弥补这个缺点,就有了面向切面编程(AOP)。
启动,登录,战斗三个模块代码不变,却增加了新的功能,广告功能相当于是横切进来的。这就是AOP的作用。AOP的编程模式相当于是横向的编程。AOP可以通过代理模式去实现,就像java框架学习日志-7(静态代理和JDK代理)里举的例子一样,收钱,打扫,炒菜的功能不改变,但是可以通过代理模式,将“服务员,麻烦”这一功能横插进代码。AOP的好处和代理模式差不多:
使得真实角色处理的业务更加纯粹,不再去关注一些公共的事情。
公共业务发生拓展时变得更加集中和方便。
名词解释
关注点:增加的某一个业务,上面例子中的广告,一般常见的是日志,安全,缓存,事物,异常等业务。一个关注点可能会横切多个对象。
切面:一个关注点的模块化,比如把上面例子中的广告都封装成一个类,这个类就可以叫切面。在OOP中模块化关键单位是类,而在AOP中模块化的单元则是切面。
连接点:在程序执行过程中某个特定的点,一个连接点总是表示一个方法的执行。关注点横切进来的位置就叫连接点。
通知:在切面的某个特点的连接点上执行的动作。
前置通知:在某个连接点之前执行的通知
log.info("前置通知")
public void fight(){}
后置通知:在某个连接点正常完成后执行的通知
public void fight(){}
log.info("后置通知")
异常通知:在方法抛出异常退出时执行的通知
最终通知:在某个连接点退出时执行的通知
环绕通知:包围一个连接点的通知,如方法调用,是最强大的一种通知类型。可以在方法调用前后完成自定义的行为。
目标对象:被一个或者多个切面所通知的对象,也叫被通知对象。织入:把切面连接到其他的应用程序类型或者对象上,并创建一个被通知对象的过程,叫织入