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代理