自己整理的一些关于Spring源码的总结,面试之前回来看看(不定期更新)

Spring中的设计模式?

1.工厂
2.单例(看看内部枚举实现的单例)
3.委派(delegate)
4.模板方法(refresh方法算一个)
5.策略模式
6.访问者模式
7.责任链模式(beanPostProcess这些后置处理器执行)

Spring事务是怎么运作的?

待更新

Spring中的obtainfreshbeanfactory?(XML方式BeanDefinition如何注册)

1.new DefaultListableBeanFactory 注册beandefinition的作用
new BeanDefinitionReader
把DefaultListableBeanFactory 和外部容器(实际上起到一个ResourceLoad的作用)放到BeanDefinitionReader

2.解析阶段,利用ResourceLoad把xml解析成Document

3.注册阶段,这个阶段前后还会有preProcessXML和postProcessXML两个处理器,然后创建BeanDefinitionParserDelegate(这个类包含xml中的标签的关键字和解析方式)然后通过delegate将Document转化成beandefinition并注册到DefaultListableBeanFactory

注解方式BeanDefinition如何注册?

1.refresh方法之前(也就是AbstractApplicationContext的构造方法中)就会生成一个DefaultListableBeanFactory,同时生成的还有AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner

2.之后在refresh方法中会执行invokebeanfactorypostprocess

3.beanfactorypostprocess分成两类,一类是beandefinitionregistrypostprocess,另一类是普通的beanfactorypostprocess,这两类beanfactorypostprocess根据priorityorder、order这些接口排序,先执行beandefinitionregistrypostprocess,然后再执行普通的beanfactorypostprocess。

4.执行beandefinitionregistrypostprocess时,会通过ClassPathBeanDefinitionScanner去扫描加载类,解析,并注册到DefaultListableBeanFactory

SpringBoot的启动流程?

待更新

不支持循环依赖的bean类型有哪些?

1.多例bean

2.构造方法注入的bean

Spring中dogetbean具体实现?

1.AbstractBeanFactory.doGetBean

1.1.getSingleton,从三级缓存(singletonObjects,earlySingletonObjects,singletonObjects)中查找bean,如果是个objectFactory,会执行getobject方法并把bean放到二级缓存,并删除三级缓存中的内容。

1.2.getObjectForBeanInstance,这里面如果是普通bean就直接返回了,如果是factoryBean还要在通过getObject方法再提取一下,并把它放到factoryBeanInstanceCache里面。

1.3.如果从缓存里找不到,首先找到并合并父子beandefinition,然后获取该bean显示声明的dependson的依赖bean的名称,并递归掉用getbean方法获取依赖bean。

1.4.getSingleton

1.4.1.AbstractAutowiredCapableBeanFactory.creatBean

1.4.1.1.如果实现了InstantiationAwareBeanPostProcessor这个接口(这个接口继承BeanPostProcessor,在实例化和初始化前后分别有4个后置方法,假如实现了实例化前方法并创建了bean,则会直接执行初始化的后置方法并返回bean,不会执行接下来的doCreatBean)。

1.4.1.1.先查找factoryBeanInstanceCache有没有对应的beanwapper

1.4.1.2.没有的话就直接createBeanInstance,尝试通过工厂方法,有参构造和无参构造创建出没有赋值的bean实例并包装成beanwapper,beanwapper里面包含未完成的实例和类型转换器。

1.4.1.3.通过AutowiredAnnotationBeanPostProcessor对@autowire和@value的属性进行标记并生成injectMetaData进行缓存(这个类还用于属性注入)。

1.4.1.4.将bean放到第三级的singletonFactory缓存中。

1.4.1.5.populateBean

1.4.1.5.1执行InstantiationAwareBeanPostProcessor的实例化后方法

1.4.1.5.2执行AutowiredAnnotationBeanPostProcessor的inject方法进行属性输入

1.4.1.5.initializeBean

1.4.1.5.1如果bean实现了beanfactory、beanname、beanclassloader这些aware接口,则注入相关的bean

1.4.1.5.2执行AutowiredAnnotationBeanPostProcessor的inject方法进行属性输入

1.4.1.5.执行初始化前方法

1.4.1.5.执行初始化方法

1.4.1.5.执行初始化后方法

1.4.2.把bean放入一级缓存,并删除二三级缓存。

Spring中AOP实现?

1.首先你要在配置类上加上@EnableAspectJAutoProxy这个注解,这个注解会import一个AspectJAutoProxyRegistrar类。

2.在refresh方法中执行到invokeBeanfactory时,会通过AspectJAutoProxyRegistrar这个类想内部容器注册一个annotationAwareAspectJAutoproxyCreator,这个类就是AOP的核心

3.这个类首先会在某个bean的实例化前置方法时找到增强类并封装成adviser放到缓存,之后在bean的初始化的后置方法中如果有需要则会对bean代理增强。如果实现了接口优先采用jdk动态代理,如果@EnableAspectJAutoProxy的注解上的属性proxytargetclass属性为true,则强制使用cglib代理

你可能感兴趣的:(自己整理的一些关于Spring源码的总结,面试之前回来看看(不定期更新))