01. Spring 的 IOC 和 AOP 有了解吗?
答:
-
IOC:控制反转,(解耦合)将对象间的依赖关系交给 Spring 容器,使用配置文件来创建所依赖的对象,由主动创建对象改为了被动方式;
-
AOP:面向切面编程,将功能代码从业务逻辑代码中分离出来。
02. AOP 的实现方式有哪几种?如何选择?(必考)
答:
JDK 动态代理实现和 cglib 实现。
选择:
-
如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理实现 AOP,也可以强制使用 cglib 实现 AOP;
-
如果目标对象没有实现接口,必须采用 cglib 库,Spring 会自动在 JDK 动态代理和 cglib 之间转换。
扩展:JDK 动态代理如何实现?(加分点)
答:
JDK 动态代理,只能对实现了接口的类生成代理,而不是针对类,该目标类型实现的接口都将被代理。
原理是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
-
定义一个实现接口 InvocationHandler 的类;
-
通过构造函数,注入被代理类;
-
实现 invoke( Object proxy, Method method, Object[] args)方法;
-
在主函数中获得被代理类的类加载器;
-
使用 Proxy.newProxyInstance( ) 产生一个代理对象;
-
通过代理对象调用各种方法。