Open SummerXinBing opened 1 month ago
IOC 定义:控制反转,是一种设计思想。DI依赖注入是一种实现方式。
如何设计?
面试重点:
问题1: 区分”类的加载机制(加载、准备、验证、链接、初始化、使用、卸载)“;Sping Bean生命周期: 这里要注意,只用单例bean才有这个流程,而原型bean只有创建,销毁是客户端(java程序员)自己去管理。 实例化 -> 属性赋值 -> 初始化 -> 使用中 -> 销毁
问题2: Spring可以解决Bean属性依赖的问题,不可以解决构造器的方法依赖。具体使用的三级缓存来解决; A有属性B,B有属性A。创建A的时候,会去一级缓存中去找B,没有的话会去二级缓存,再没有去三级缓存中。因为Spring已经提前暴露了B的class文件,并放在三级缓存中(涉及到Spring Bean的生命周期),这时候的B是一个不完整的对象(只有一个class文件)。在构造A方法中,会使用反射机制获取B class文件的实例; 第一层缓存(sigletonObjects): 单例对象缓存池,已经实例化并且属性赋值了,这里的对象是成熟对象; 第二层缓存(earlySigletonObjects): 单例对象缓存池,已经实例化,但是为属性赋值,半成品对象; 第三层缓存(sigletonFactories):单例工厂的缓存 问题3: Spring Bean的作用域是单例(全局唯一)>原型(每次注入创建一个实例)> 会话(每次会话创建一个实例)> 请求(每次请求创建一个)
// 饿汉式单例模式 -> 线程不安全 public class Singleton{ // 先创建单例对象,然后直接返回 private Singleton(){} private static Singleton singleton = new Singleton(); //建立对象 public static Singleton getInstance(){ return singleton; } } // 懒汉式单例模式 -> 线程安全 public class Singleton{ // 先不创建对象,如果判定对象是空,才去创建对象 private Singleton(){} private static Singleton singleton = null; //建立对象 public static synchronized Singleton getInstance(){ if (singleton == null) { singleton = new Singleton(); } } }
IOC 定义:控制反转,是一种设计思想。DI依赖注入是一种实现方式。
如何设计?
面试重点:
问题1: 区分”类的加载机制(加载、准备、验证、链接、初始化、使用、卸载)“;Sping Bean生命周期: 这里要注意,只用单例bean才有这个流程,而原型bean只有创建,销毁是客户端(java程序员)自己去管理。 实例化 -> 属性赋值 -> 初始化 -> 使用中 -> 销毁
问题2: Spring可以解决Bean属性依赖的问题,不可以解决构造器的方法依赖。具体使用的三级缓存来解决; A有属性B,B有属性A。创建A的时候,会去一级缓存中去找B,没有的话会去二级缓存,再没有去三级缓存中。因为Spring已经提前暴露了B的class文件,并放在三级缓存中(涉及到Spring Bean的生命周期),这时候的B是一个不完整的对象(只有一个class文件)。在构造A方法中,会使用反射机制获取B class文件的实例; 第一层缓存(sigletonObjects): 单例对象缓存池,已经实例化并且属性赋值了,这里的对象是成熟对象; 第二层缓存(earlySigletonObjects): 单例对象缓存池,已经实例化,但是为属性赋值,半成品对象; 第三层缓存(sigletonFactories):单例工厂的缓存 问题3: Spring Bean的作用域是单例(全局唯一)>原型(每次注入创建一个实例)> 会话(每次会话创建一个实例)> 请求(每次请求创建一个)