AOP是一种编程思想,一套规范。java
软件开发经历了面向过程编程时代,以C语言为表明,以后是面向对象编程时代,以Java语言为表明。编程
在21世纪大牛们又提出了一种新的编程思想面向方面编程,即AOP理念,全称Aspect-Oriented Programming。安全
AOP是第三代编程思想,到哪免不了都要问下。ide
1997年在面向对象编程大会上Gregor Kiczales等人首次提出了AOP的概念,以后各大公司等分别加入研究。2001年Palo Alto研究中心发布了首个支持AOP的语言AspectJ,同时也是一个规范。模块化
在对真实世界抽象的面向对象编程过程当中,始终伴随着某写操做的代码没法实现模块化封装,会散落在各个对象中存在,特别是非功能性代码。对于通常的功能开发采起面向对象方式进行抽象是可以很好应付的,可是面向方面(切面)给了一种新的思惟方式来考虑编程,能更好的进行全局结构化思考。工具
因此AOP主要解决两个问题:学习
链接点:join point,程序的一个执行点,如类中的一个方法,方法里面一个代码块。测试
切入点:point cut,是一个捕获链接点的代码结构,就是定义一个代码逻辑用来捕获某个链接点的代码。代理
方面;aspect,是具体被执行的切面逻辑代码,相似于一个类。调试
通知:advice,是point cut执行的代码,定义在链接点什么时机来执行aspect。
场景分为2类:
一类是非功能性需求,如日志、异常、安全、事务均可以使用AOP思想编程。
另外一类是功能性需求,在原来对象抽象的思惟中添加AOP思惟,这里是一种结构化思惟,在定义类时考虑多个类的切面共性。
对AOP实现除了AspectJ外,已知的还有JBoss AOP、Spring AOP等。
这里只介绍AspectJ和SpringAOP,重点是他们不一样点。
AspectJ采用静态织入方式进行切面织入原代码,提供独立的编译器把切面和原代码的java文件编织成一个新的class文件。提供了详细的编译日志和调试工具,编译时间长可是运行效率高。
链接点的支持范围:
关联链接点通知方式:
Spring AOP没有彻底实现AspectJ语言,它更多的是对Spring framwork进行Aop能力的扩展实现,补全Spring framework的不足并让Aop与Spring framwork融合。
链接点只支持方法拦截调用。
链接点通知方式在aspect的before、after、around的基础上增长throw对异常的触发的拦截。
Spring AOP与Spring IoC体系融合,对于aspect类统一交由Spring beans管理,而且提供ProxyFactoryBean的AOP代理工厂类,还有自动代理的BeanNameAutoProxyCreator和DefaultAdvisorAutoProxyCreator的强大工具。
Spring AOP是动态织入,在运行时完成AOP的aspect代码织入原代码逻辑中。其底层默认采用JDK的动态代理实现AOP代理,当对象没有实现接口时,CGLIB会默认使用。
优势:解决代码散乱问题、代码逻辑解偶、易于维护、提供扩展性和可重用性。
缺点:切面越多系统越复杂难懂、工程师学习成本增长(业务再也不是线型,变成了跳跃式)
AOP编程要慎重使用,做为面向对象编程的一种补充。
做者:Owen Jia