一、什么是AOP
AOP(Aspect Oriented Programming 面向切面编程) AOP是传统的OOP(Object Oriented Programming 面向对象编程)的补充,添加了一些更为完善的功能,和OOP并没有什么根本上的冲突。解释下传统的切片,如果我们想在一根香蕉
中间加一段黄瓜,那么我们要怎么做?首先第一步,拿刀从某个部位切开,在将准备好的一段黄瓜放到两段香蕉中间,我们称之为放入。那么联想到我们代码中来;
比如我们要给我们的service层增加一段代码,用来计算我们业务层某个功能的性能,首先我们可以直接在代码中添加一些需求代码,但是想一下,如果是测试环境,而且是功能模块不多的情况下我们才能用自己手动添加代码来实现,生产环境如果也是这样搞,那么就太耗时间了,万一你leader说,小李啊,来再把这些功能去掉把。。。艹。显然如果使用手动往里面写代码是不现实的。所有我们要用到AOP。和往香蕉里面添加黄瓜一样,我们可以将service层的代码切开(这里专业术语叫“切入点”),然后将我们计算性能的代码塞进去(这里专业术语叫“织入”),那么我们想用的时候,添加切入点,不想用的时候,直接删掉,简直不要太方便。
其实我们不仅可以用AOP来实现计算性能,还有一些,记录日志、控制事务,等等......
二、专业术语解释
通知(advice):我们也可以称之为额外功能,比如添加计算某个模块的性能、日志、事务;
切入点(pointcut):我们用来增加通知的连接点,通俗点就是,我们放置额外功能的地方;
切面(aspect):我们放置的通知的点所连接成的一个几何图形所形成的一个面,就叫切面;
织入(weave):将额外功能放到某个功能上,就叫织入;
三、代理模式
1、静态代理
所谓代理,用我们现实中的例子来说就是,代理就是明星的经纪人。明星的任务就是演戏、唱歌、上综艺节目、参加公益活动了,这之类的。明星的任务就是做就行了,至于其他的,全交给经纪人处理,这里经纪人是代理。联想到我们的代码中,比如有个xxxService接口还有一个xxxServiceImpl接口的实现类,还有一个proxy代理,那么实现类就是明星,proxy就是经理人,实现类和proxy都要实现xxxService接口,因为明星是不对外沟通演出的事情的,所以要经纪人知道这个明星都是可以做什么,只有实现接口,在proxy中才会有接口中的一些功能。
这样做有个缺点,就是我们有一个实现类,就要添加一个代理,代码需要写的太多了,以至于静态代理几乎都不用。。。。;
2、动态代理
在静态代理的基础上我们不用在手写代理类了,直接由程序自动生成,这个代理类我们看不到的,这个代码也不会出现在我们的程序中,所以相对于静态代理来讲,我们可以省很多的代码(这里怎么做动态代理就不一一介绍了,大致的就是,定义目标类,将目标类交给Spring管理也就是配置成bean对象,然后创建额外功能类,也是将此交给Spring管理,在后面,创建切入点,最后织入);
其实代理模式就是基于AOP实现的,所有在这里说了一下代理模式。
Spring AOP的东西其实是有很多很多的,我只是自己稍微总结了一下,希望能帮到看到这篇文章的兄弟!!