SummerXinBing / xiabing_wuji

学习仓库,用此来驱动自己
Apache License 2.0
0 stars 0 forks source link

Spring IOC #11

Open SummerXinBing opened 1 month ago

SummerXinBing commented 1 month ago

IOC 定义:控制反转,是一种设计思想。DI依赖注入是一种实现方式。

如何设计?

面试重点:

  1. Spring Bean的生命周期
  2. Spring怎么解决Bean的循环依赖问题?
  3. 引申:单例Bean是线程安全的吗?

问题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();
        }
    }
}