美文网首页
Spring 一些整理

Spring 一些整理

作者: Snipers_onk | 来源:发表于2019-10-24 20:54 被阅读0次

    感冒了两周了还没好,学习无力,晕晕的... 赶快好啊,MD。

    SpringIOC的理解及初始化过程

    一个老生常谈的问题,Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。由IOC容器,如beanFactory、ApplictionContext这些容器来负责对象的生命周期和对象之间的关系。

    BeanFactory和FactoryBean

    BeanFactory是一个Bean容器,它是IOC必备的数据结构。在BeanFactory中维护着BeanDefinition map,在容器初始化时,会对资源进行读取并加载到BeanDefinition中,再根据BeanDefinition的描述对Bean进行加载和管理。过程中还包括了处理对象的依赖和Bean生命周期。

    我们经常使用的ApplictionContext就是一个BeanFactory,在顶层实现了BeanFactory,只不过它不仅具有BeanFactory所有的功能,还有BeanFactory所没有的功能,比如AOP,WEB应用等。所以一般使用时会优先使用ApplicationContext。

    FactoryBean是一个接口,实现这个接口的Bean就代表了一个工厂Bean,和普通的bean不同,从容器中通过BeanName获取的工厂Bean,其实是从FactoryBean的getObject()方法返回的对象,如果要获取FactoryBean对象本身,需要在name前面加上&

    FactoryBean比BeanFactory在生产上更加灵活,还可以修饰对象,带有一些装饰模式的思想在里面。比如使用spring-mybatis时,mybatis底层会将mapper定义为一个FactoryBean,在getObject()中通过动态代理生成一个代理对象放在BeanFactory容器中。

    Spring循环依赖的处理

    在Spring中循环以来的场景一共有两种,一种是构造器的循环依赖,还有一种是field属性的循环依赖。对于构造器的循环依赖,Spring是无法解决的,会直接抛出循环依赖异常。在处理属性的循环依赖时,其实只解决了单例模式的循环依赖问题,对于prototype的bean,也会直接抛出异常。

    对于singleton的bean,并不是等完全创建好后再加入缓存中,而是在创建过程中通过ObjectFactory提前将自己暴露出来。比如说单例bean A,在创建的过程中会提前曝光自己(ObjectFactory)到缓存中。加载过程中如果依赖B,如果B没有创建出来,那么则会去加载B,在B初始化如果依赖A,则会从缓冲拿到ObjectFactory.getObject()拿到对象A,等B拿到A后,B初始化完成,将B放到缓存中,紧跟着A也初始化完成。这时候A和B都放在缓存中后,并将ObjectFactory删除。

    Spring中bean的生命周期

    Spring中bean的生命周期被容器管理。

    1. 实例化

      当容器是beanFactory时,第一次请求时会需要注入依赖时开始进行实例化,当为ApplicationContext容器,容器启动结束后,就开始实例化所有bean。

    2. 实例化结束后开始设置属性,即依赖注入。

    3. 根据是否实现了Aware接口,将相关的xxxAware实例注入bean。此时bean已经被构造完成。

    4. 如果实现BeanPostProcessor 接口,会将bean传递进接口的方法中,进行前置处理和后置处理。这个前置和后置是针对InitialzationBean接口而言的。

    5. InitialzationBean接口方法会对bean增加逻辑,但不能对bean本身进行操作。这种方式会有侵入性,所以Spring提供了init-method属性,用来指定要执行的方法。本质还是执行了InitialzationBean的方法。

    6. 最后,检查DisposableBean 和 destroy-method,原理和InitialzationBean接口是一样的。

    如果要你实现Spring IOC,你会注意哪些问题?

    1. 首先是要创建一个容器,这个容器要可以提供bean的生命周期管理,因为bean一直在容器中,不断的获取bean可以造成内存溢出。
    2. 要解决bean的循环依赖问题,对于prototype或构造器注入时要抛出异常,否则会造成死循环。

    Spring 是如何管理事务的,事务管理机制?

    Spring对事务的管理并不会直接管理的,而是通过事务管理器,对外提供统一的事务边界管理。在Spring中,事务管理器统一的抽象为PlatformTransactionManager,它定义了getTransaction,commit,rollback方法,方法中一些核心的具体的实现是根据访问技术不同,由不同的子类实现,比如jdbc或者mybatis,就是DataSourceTransactionManager实现的。

    事务管理机制?这个问的是啥啊?头疼,看不懂...

    Spring 的不同事务传播行为有哪些,干什么用的?

    传播行为定义在TransactionDefinition中,
    一般默认为PROPAGATION_REQUIRED,如果存在事务则加入当前事务,如果不存在事务则创建一个新事务。
    PROPAGATION_SUPPORTS 为如果存在新事务,则加入,不存在新事务,则直接执行。对于一些查询方法来说,用PROPAGATION_SUPPORTS比较适合,这个传播行为可以保证当前事务对数据所做的更新,其他传播方式是看不到的,因为事务还没有提交。
    PROPAGATION_REQUIRES_NEW 不管当前事务是否存在,都会创建新事务,如果存在事务则会将当前事务挂起,这个是要看PlatformTransactionManager的实现类是否支持挂起。

    Spring 中用到了那些设计模式?

    1.策略模式 在Spring事务框架中,就是采用了策略模式,根据访问技术的不同,如mybatis或者hibernate,采用不同的策略注入不同的子类实现。
    2.模板方法模式 这个是最常使用的策略,在final方法中确定好逻辑,将需要实现的抽象方法交给子类去实现。

    Spring中bean的加载过程

    挖坑,待填...

    相关文章

      网友评论

          本文标题:Spring 一些整理

          本文链接:https://www.haomeiwen.com/subject/nwzdvctx.html