说到面向切面编程,想必大家都不会陌生。不就是AOP——Aspect Orient Programming
但是说了那么久,你所理解的面向切面编程,用一句话概括到底是什么呢?
目录
1.什么是AOP(面向切面编程)
在我的理解来说:
在运行时,动态的 将代码 切入到 类的 指定方法。 这种编程思想就称为面向切面编程
来举个例子吧,你写了A方法之后,老板想让你看看这段代码的执行时间。ok,那你就在A方法的前后加上代码,查看时间。。。
过了几天,你又完成了B方法之后,老板又想让看你记录这段代码的日志信息。没问题,加上
又过了几天,老板又要让你每个功能都加上日志功能。。。没过几天你就。。。
久而久之,你就发现,你的代码中会出现越来越多与业务无关的东西。后来你发现它们都是有共同点的,于是你将这些公共的代码整体抽成common方法进行调用,想办法降低耦合。但是由于是在方法中进行调用,该污染代码还是会污染,如果严格说来还是有很强的关联系的。比如说一旦涉及到部分参数的传递,那么耦合度还是很高的。
在你想解耦合且方便维护的时候,AOP出现了。
spring提供这个工具,让你能解决上述老板给你提出的这些要求,避免你修改次数太多删库跑路~
2.AOP相关术语
1.连接点(Joinpoint)
程序执行的某个特定位置:如类开始初始化前,类初始化后,类某个方法调用前。一个类或一段代码拥有一些边界性质的特定点,这些代码中的特定点就被称为“连接点”。Spring仅支持方法的连接点,既仅能在方法调用前,方法调用后,方法抛出异常时等这些程序执行点进行织入增强。
连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位。如在Test.foo()方法执行前的连接点,执行点为Test.foo(),方位为该方法执行前的位置。Spring使用切点对执行点进行定位,而方位则在增强类型中定义。
2.切点(Pointcut)
每个程序类都拥有多个连结点,如一个拥有两个方法的类,这两个方法都是连接点,既连接点是程序中客观存在的事务。当某个连接点满足指定要求时,就可以被添加Advice,成为切点,比如:
pointcut xxxPorintcut()
:execution(void H*.say*())
每个方法被调用,都只是连接点,如果某个方法属于H开头的类,而且方法一say开头,则该方法就变成了切入点。如何使用表达式定义切入点,是AOP的核心,Spring默认使用AspectJ切入点语法。
3.增强(Advice)
连接上一条,你可以在切点这里做一些事情,有“around”,“before”,“after”等类型。
4.目标对象(Target)
被AOP框架进行增强处理的对象。如果是动态AOP的框架,则对象是一个被代理的对象。
5.引介(Introduction):
引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态的为该事务添加接口的实现逻辑,让业务类成为这个接口的实现类。
6.织入(Weaving):
织入是将增强添加对目标类具体连接点上的过程,AOP象一台织布机,将目标类增强或引介AOP这台织布机天衣无缝的编织在一起。