❝ 「最近有一位朋友和我说,他做了开发 3 年了,最近去面试时,Spring 被面试官问得哑口无言,他总结了下面几道被问到的关于 Spring 的面试题,可以参考下。」 ❞
还有其他的类不一一列举出来,都在 java.lang.reflect 包下。说到这个模块的时候,那么面试官可能会考察相关的知识,主要是考察你是否真的有去了解过反射的使用。「举两个例子:」 「利用反射获取实例的私有属性值怎么做」 这里其实就是里面的重要考察点就是反射对私有属性的处理。
动态代理相关原理的话,你需要了解什么是代理模式、静态代理的不足、动态代理的实现原理。「Spring 中实现动态代理有两种方式可选,这两种动态代理的实现方式的一个对比也」 「是面试中常问的。」
「JDK 动态代理」 必须实现 InvocationHandler 接口,然后通过「Proxy.newProxyInstance(ClassLoader」 「loader, Class>[] interfaces, InvocationHandler h)」 获得动态代理对象。 CGLIB 动态代理 使用 CGLIB 动态代理,被代理类「不需要强制实现接口」。CGLIB 不能对声明为 final的方法进行代理,因为 CGLIB 「原理是动态生成被代理类的子类。」OK,AOP 讲
参考问题
- Spring IoC、AOP 原理
- Spring Bean 生命周期
- Spring Bean 注入是如何解决循环依赖问题的
- 怎样用注解的方式配置 Spring?
- Spring 事务为何失效了
- SpringMVC 的流程?
- Springmvc 的优点:
- Spring 通知类型使用场景分别有哪些?
- IoC 控制反转设计原理?
- Spring 如何处理线程并发问题?
参考解析
1.Spring IoC、AOP 原理
Inversion of Control,控制反转。是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(DependencyInjection,简称 DI),这也是 Spring 的实现方式。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。Aspect Oriented Programming,面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。其中,最常用的使用场景一般有日志模块、权限模块、事物模块。 IoC 内部核心原理就是反射技术,当然这里面还涉及到 Bean 对象的初始化构建等步骤,这个在后面的生命周期中讲,这里我们需要了解 Java 中反射是如何做的就好。这里主要说明下主要的相关类和可能面试问题转向,具体的 API 实现需要自己去看。![a108b794fcbb1f8c1113ef70facdfd45.png](https://i-blog.csdnimg.cn/blog_migrate/faa67e9c644401ceaf0ce0c6c151ce6b.png)
/**
* 通过反射获取私有的成员变量.
*/
private Object getPrivateValue(Person person, String fieldName)
{
try
{
Field field = person.getClass().getDeclaredField(fieldName);
// 主要就是这里,需要将属性的 accessible 设置为 true
field.setAccessible(true);
return field.get(person);
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
AOP 的内部原理其实就是动态代理和反射了。主要涉及到的反射类:
![7c83ef18e5a17cebd7563f17e59ce4d7.png](https://i-blog.csdnimg.cn/blog_migrate/190841ed75d52352ea7c8f5f06d6c456.png)