Java编程的基础是面向对象,面向对象的增强(之一)就是AOP—面向切面编程
一、what(相关定义)
1.AOP(Aspect Oriented Programming):在运行/编译时,动态地将代码切入到类的指定方法、指定位置,从而在不改变现有类的封装的前提下,增强现有类核心功能的一种编程方法。而增强的功能通常是无法严格遵照OOP的思想实现的、穿插在各个业务模块中、并且和各个业务模块高度耦合在一起的重复实现的系统功能。并进一步引申为两小点:❶AOP是OOP的补充和增强,从属于OOP,而不是像与POP(面向过程编程)那样分属不同思想
❷具体来说,AOP就是把这些高度耦合在核心业务的功能分门别类并提取出来,封装在一个个Aspect切面中,然后再指定这些切面往核心业务中织入的规则,最后根据规则织入到核心业务中,最终实现系统功能的封装与解耦及组合。
2.Aspect切面:
类似OOP中的class,一个Aspect存放一个系统功能的实现逻辑代码,并且严格不同于业务核心代码,专注于一个横切功能。
3.Joinpoint连接点:程序执行的某个节点,例如被方法被调用前、后,抛出异常时。
4.Pointcut切入点:用于匹配哪些类中的哪些方法的正则表达式,用于定位哪些类的哪些方法需要加入Aspect切面。
5.Advice通知:用于定位在哪个Joinpoint连接点织入Aspect切面.Spring中有五种Advice:❶Before Advice前置通知
❷After Advice后置通知
❸After Return Advice返回后通知
❹Around Advice环绕通知
❺After Throwing Advice抛出异常后通知
6.Introduction引入:添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。
7.Target Object目标对象:包含连接点的对象,也被称为被通知或被代理对象。
8.AOP Proxy AOP代理:AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
9.Weaving编织:组织方面来创建一个被通知对象。这可以在编译时完成(使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。Spring中AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。
二、why(解决的问题)
专业的人做专业的事,对应到OOP上,非逻辑功能的实现就需要专门的面向切片实现,最终达成以下两个目标:
1.减少冗余代码:通常而言,每个业务功能代码最终落地实现,都离不开非业务功能的代码辅助,比如调用日志,异常处理,常规的方法是在每个业务功能代码赘上这些代码。如果应用上面向切面编程,就不用到处编写相同辅助功能的代码,只要一次编写,加上规则配置,就能实现复用的目标。
2.灵活并安全:能够在核心业务代码不改变的前提下,灵活追加非业务性的系统功能,从而轻松达到在面向非业务功能修改时,能够灵活配置系统功能,避免在不使用切面编程时修改的潜在风险。
三、how(如何解决)
1.运行时切面:例如,Spring中的原生自带AOP
2.编译时切面:例如,AspectJ中切面实现方式
领取专属 10元无门槛券
私享最新 技术干货