赞
踩
1.xmlBeanFactory对defaultListableBeanFactory类进行扩展,主要用于从XML文档中获取BeanDefinition,对于注册及获取bean都是使用从父类DefaultListableBeanFactory继承的方法去实现。
xmlBeanFactory 主要是使用reader属性对资源文件进行读取和注册。
2.循环依赖。创建bean,核心方法
getBean → doGetBean → createBean → doCreateBean → createBeanInstance → populateBean
3.BeanDefinitionReader获取资源文件,封装成BeanDefinition,通过BeanDefinitionRegistry将其注册起来,保存到BeanDefinitionMap中。BeanFactory根据bean定义信息,通过反射实例化bean。
4.FactoryBean,灵活创建bean。调用getObject方法,才会生成bean,但没有严格的bean生命周期流程
5.spring中有两种bean:容器bean(比如BFPP)、自定义bean
6.FactoryBean和BeanFactory
7.PostProcessor
8.循环依赖-三级缓存
真正的解决循环依赖是靠二级缓存,不用三级缓存也可以解决循环依赖,但这样就造成了在实例化后就立马完成代理,违背了最后一步完成代理的原则;
在创建bean的时候,在哪里通过什么方式创建了动态代理:通过BeanPostProcessor创建动态代理,在初始化之后或在出现循环依赖时实例化之后(实例化 -> 属性注入 -> 初始化)
发生循环依赖会用到二级缓存,普通依赖过程只用到一三级缓存
9.配置类加@Configuration 和不加的区别
@Bean中被依赖的bean不会被重复加载
@Configuration为Full配置类,经过了enhance增强处理,所有@Bean方法会被BeanMethodInterceptor拦截,根据方法名获取单例,而不是重复加载
10.Spring是怎样避免读取到不完整的Bean
防止多线程下Spring读取到不完整Bean加了两把锁
一把锁放在getSingleton()方法三级缓存,第二个线程阻塞直到第一个线程把二三级缓存删除完;
一把锁放在getSingleton(,)方法,先从单例池再拿一遍单例对象(double check防重复创建单例bean)
怎么样可以在所有Bean创建完后做扩展代码?
ContextRefreshedEvent/SmartInitializingSingleton
11.接口
BeanFactory
Aware
BeanDefition
BeanDefitionRegistry
BeanDefitionReader:bean定义信息读取器,解析xml、注解,转化为BeanDefinition,添加到BeanDefinitionMap中
BeanFactoryProcessor:bean工厂后置处理器,可以修改bean定义信息
BeanPostProcessor: bean后置处理器
Environment
FactoryBean
BeanFactory和factoryBean的区别都是用来创建对象的。当使用BeanFactory时,必须要遵循完整的创建过程。这个过程由spring管理。factoryBean只需要调用getObject就可以返回具体对象,整个对象创建过程由用户自己控制,更加灵活
12.spring执行流程
1.入口refresh();
2.实例化、初始化bean工厂,加载配置信息、资源、扫描包路径、注解,生成BeanDefinition对象,注册到BeanDefinitionMap中
3.注册BeanPostProcessor,执行BeanFactoryPostProcessor;
4.实例化bean(bean的生命周期)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。