感冒了两周了还没好,学习无力,晕晕的... 赶快好啊,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的生命周期被容器管理。
-
实例化
当容器是beanFactory时,第一次请求时会需要注入依赖时开始进行实例化,当为ApplicationContext容器,容器启动结束后,就开始实例化所有bean。
-
实例化结束后开始设置属性,即依赖注入。
-
根据是否实现了Aware接口,将相关的xxxAware实例注入bean。此时bean已经被构造完成。
-
如果实现BeanPostProcessor 接口,会将bean传递进接口的方法中,进行前置处理和后置处理。这个前置和后置是针对InitialzationBean接口而言的。
-
InitialzationBean接口方法会对bean增加逻辑,但不能对bean本身进行操作。这种方式会有侵入性,所以Spring提供了init-method属性,用来指定要执行的方法。本质还是执行了InitialzationBean的方法。
-
最后,检查DisposableBean 和 destroy-method,原理和InitialzationBean接口是一样的。
如果要你实现Spring IOC,你会注意哪些问题?
- 首先是要创建一个容器,这个容器要可以提供bean的生命周期管理,因为bean一直在容器中,不断的获取bean可以造成内存溢出。
- 要解决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的加载过程
挖坑,待填...
网友评论