Spring及Boot几道面试题
IOC的理解,原理与实现
总:
- 控制反转
- 理论:原来的对象是由使用者来进行控制,有了 Spring 之后,可以把整个对象交给 Spring 来帮助管理
- DI:依赖注入,把对象的属性值注入到具体的对象中。@Autowired,populateBean完成属性值的注入
- 容器
- 存储对象,使用 map 结构来存储,在 Spring 中一般在三级缓存,singletonObject 存放完整的 bean 对象,
- 整个 bean 的生命周期,从创建到使用到销毁的过程全部都是由容器来管理(bean 的生命周期)
分:
- 容器的创建过程(beanFactory,DefaultListableBeanFactory),向 bean 工厂中设置一些参数(BeanPostProcessor,Aware 接口的子类)等等属性
- 加载解析 bean 对象,准备要创建的 bean 对象的定义对象 beanDefinition(xml 或者注解的解析过程)
- beaFactoryPostProcessor 的处理,此处是拓展点,PlaceHolderConfigurSupport,ConsifurationClassPostProcessor
- BeanPostProcessor 的注册功能,方便后续对 bean 对象完成具体的拓展功能
- 通过反射方式将 BeanDefinition 对象实例化成具体的 bean 对象
- bean对象的初始化过程(填充属性,调用 aware 子类的方法,调用 BeanPostProcessor 前置方法,调用 init-method 方法,调用 BeanPostProcessor 的后置处理方法)
- 生成完整的 bean 对象,通过 getBean() 方法可以直接获取
- 销毁过程
flowchart LR subgraph bean的定义信息 xml 注解 end subgraph bf[BeanFactory] direction LR b1[BeanDefinition \n bean的定义信息] -.反射.-> b2[创建bean对象] --> b3[使用bean对象] --> b4[销毁bean对象] end bean的定义信息 --接口 规范约束--> bf subgraph 图二 direction LR PostProcessor -.-> 后置处理器增强器 -.-> 提供某些额外的拓展功能 --> BeanFactoryPostProcessor end
- BeanFactory:容器的入口,ApplicationContext实现了BeanFactory
附: 反射方式
//1.获取Class对象
Class clazz = Class.forName("包名+类名");
Class clazz = 对象.getClass();
Class clazz = 类名.class;
//2.获取构造器
Constructor constructor = clazz.getDeclaredConstructor();
//3.创建对象
Object obj = constructor.newInstance();