Spring学习笔记

141 阅读4分钟
  1. IoC

    控制反转,它是一个技术思想不是一个技术实现。

    控制:指的是对象创建(实例化,管理)的权利

    反转:控制权交给外部环境了(Spring框架,IoC容器)

  2. DI

    依赖注入

    IoC和DI描述的是同一件事。IoC是站在对象的角度,对象的实例化鸡其管理的权力交给了容器。DI是站在容器的角度,容器会把对象依赖的其他对象注入送进去;比如A对象实例化过程中因为声明了一个B类型的属性,那么就需要容器把B对象注入给A。

  3. AOP

    切面编程

  4. 创建bean的三种方式
    1. 使用无参构造函数创建
    2. 使用静态方法创建
    3. 使用实例化方法创建
  5. Bean的生命周期
    单例模式:singleton

    对象出生:当创建容器时,对象就被创建

    对象活着:只要容器在,对象一直活着

    对象死亡:当销毁容器时,对象就被销毁了

    一句话总结:单例模式的bean对象生命周期与容器相同

    设置lazy-init懒加载,当使用对象时才会创建新的对象实例

    (1)开启延迟加载一定程度提高了容器的启动和运转性能

    (2)对于不常使用的Bean设置延迟加载,这样偶尔使用的时候在加载,不必要从一开始该bean就占 用资源。

    多例模式:prototype

    对象出生:当使用对象时,创建新的对象实例

    对象活着:只要对象在使用时,就一直活着

    对象死亡:当对象长时间不用时,被java的垃圾回收器回收了

    一句话总结:多例模式的bean对象,spring框架只负责创建,不负责销毁

    设置了lazy-init容器启动时不会实例化bean,还是在调用getBean方法时实例化

  6. FactoryBean和BeanFactory

    BeanFactory接口是容器的顶级接口,定义了容器的一些基础行为,负责生产和管理Bean的一个工厂。

    FactoryBean可以生成某一个类型的Bean实例,也就是说可以借助于它自定义Bean的创建过程。

  7. 后置处理器

    spring提供了两种后处理bean的拓展接口,分别为BeanPostProcessor和BeanFactoryPostProcessor。

  8. Bean的创建生命周期
    1. 对象类--->无参构造方法(实例化)--->对象--->依赖注入--->初始化前(@PostConstruct)--->初始化(InitializingBean)--->初始化后(aop)--->代理对象--->bean

    2. PostConstruct修饰的方法只能是void,并且无参
      InitializingBean:afterPropertiesSet()方法
      
    3. 实例化BeanFactoryPostProcessor实现类

      执行BeanFactoryPostProcessor的postProcessBeanFactory方法

      实例化BeanPostProcessor实现类

      实例化InstantiationAwareBeanPostProcessorAdapter实现类

      执行InstantiationAwareBeanPostProcessorAdapter的postProcessBeforeInstantiation方法

      (中间还有什么国际化,广播器等等操作)

      (上面已经实例化,下面进行初始化)

      执行Bean的构造器

      执行InstantiationAwareBeanPostProcessorAdapter的postProcessPropertyValues方法

      为Bean注入属性

      调用BeanNameAware的setBeanName方法

      调用BeanFactoryAware的setBeanFactory方法

      (调用等等Aware方法)

      执行BeanPostProcessor的postProcessBeforeInitialization方法

      调用InitializingBean的afterPropertiesSet方法

      调用Bean的init-method属性指定的初始化方法

      执行BeanPostProcessor的postProcessAfterInitialization方法

      执行InstantiationAwareBeanPostProcessorAdapter的postProcessAfterInstantiation方法

      容器初始化成功,执行正常调用后,下面销毁容器

      调用DisposableBean的destory方法

      调用Bean的destroy-method属性指定的初始化方法

  9. 单例Bean是否线程安全
    1. 无状态:bean中没有定义可变的成员变量,此时是线程安全
    2. 有状态:bean中定义了成员变量,此时是线程不安全(可以将变量保存在ThreadLocal中)
  10. Bean创建过程
    1. 通过反射生成的
  11. createBeanFactory

    getBean

    doGetBean

    createBean

    doCreateBean

    createBeanInstance

    populateBean(填充bean)

  12. 三级缓存中分别保存的是什么对象
    1. 成品对象
    2. 半成品对象
    3. lambda表达式
  13. 如果只使用一级缓存行不行?
    1. 不行,因为成品和半成品对象会放到一起,在进行对象获取的时候有可能会获取到半成品对象。这样的对象是无法使用的。
  14. 如果只有二级缓存行不行?
    1. getSigngleton
    2. doCreateBean
    3. 只有二级缓存的时候也可以解决循环依赖的问题
    4. 添加aop的实现之后报错
  15. 三级缓存到底做了什么事
    1. 如果一个对象需要被代理,生成代理对象,那么这个对象需要预先生成非代理对象吗?

      1. 需要
    2. 三级缓存到底做了什么?

      1. lambda表达式,getEarlyBeanReference(),当前方法中,有可能会用代理对象替换非代理对象,如果没用三级缓存的话,那么久无法得到代理对象,换句话说,在整个容器中,包含了同名对象的代理和非代理对象。
      2. 容器中,对象都是单例的。