对 Spring AOP 的理解
AOP就是面向切面编程。我是这么理解的:java是面向对象编程(OOP),而OOP是从静态解读考虑程序结构,但AOP是从动态的角度考虑程序运行过程。也可以说AOP就是OOP的补充和完善。OOP引入率封装 继承和多态性等概念来建立一中对象的层次结构,用以模拟公共的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP就显得无能为力了。也就是说,OOP允许你定义从上到下的关系,但并不适合从左到右的关系,例如日志功能。日志代码往往水平的散步在所有对象层次中,而与它所散步到的对象的核心功能毫无关系。对于其他类型的代码,如安全性 异常处理和透明的持续性也是如此。这种散步在各处的无关代码被称为横切代码。
在OOP设计中,他导致大量代码的重复,而不利于各个模块的重用。
而AOP技术则恰恰相反,它利用一种称之“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,简单的来说就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来。便于减少系统的重复代码,降低模块之间的耦合度等。
AOP 底层有两种的代理 (jdk代理 CGLIB代理)
JAVA动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGLIB代理,是针对类来实现代理的,它的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的继承,所以不能对final 修饰的类进行代理。(例如service 的事务处理)
对 Spring IOC 的理解
IOC(控制反转),将类的创建和依赖关系写在配置文件里,有配置文件注入,实现了松耦合