一、class说明
1、BeanFactory ->
Object getBean(String name);
2、ListableBeanFactory ->
//获取它及子类的名称、bean实例
String[] getBeanNamesForType(@Nullable Class<?> type);
<T> Map<String, T> getBeansOfType(@Nullable Class<T> type);
3、AutowireCapableBeanFactory -> 实现bean工厂的bean装配功能
4、AbstractBeanFactory -> 制定bean的管理步骤doGetBean
5、AbstractAutowireCapableBeanFactory -> 实现bean的创建(实例化、依赖注入、初始化)doCreateBean
6、DefaultListableBeanFactory -> spring容器真正的实现类
7、SingletonBeanRegistry ->
void registerSingleton(String beanName, Object singletonObject);
Object getSingleton(String beanName);
8、BeanDefinitionRegistry ->
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition);
BeanDefinition getBeanDefinition(String beanName);
9、BeanFactoryPostProcessors -> 在bean实例化之前,修改bean的属性
10、BeanPostProcessor -> bean初始化前后
二、流程
1、加载并创建BeanDefinition
AbstractBeanDefinitionReader.loadBeanDefinitions
DefaultBeanDefinitionDocumentReader.registerBeanDefinitions
//解析bean标签
BeanDefinitionParseDelegate
PropertyValue(ref--RuntimeBeanReference,value--TypedStringValue)
//注册BeanDefinition
BeanDefinitionReaderUtils.registerBeanDefinition
DefaultListableBeanFactory.registerBeanDefinition
2、根据BeanDefinition去创建Bean
1)bean的实例化
2)bean的依赖注入
BeanDefinitionValueResolver类型转换
BeanWrapperImpl.setValue(setter注入,内省技术)
3)bean的初始化
//调用实现了Aware接口及它的子接口的类的方法
invokeAwareMethods(beanName, bean);
//BeanPostProcessor的postProcessBeforeInitialization方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
//执行初始化方法(先调用InitializingBean的afterPropertiesSet,再调用init-method属性指定的初始化方法)
invokeInitMethods(beanName, wrappedBean, mbd);
//应用BeanPostProcessor的postProcessAfterInitialization方法(AOP代理对象生成)
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
三、AOP
1、解析流程
BeanDefinitionParseDelegate
NamespaceHandler -> AopNamespaceHandler
ConfigBeanDefinitionParser.parse
AspectJAwareAdvisorAutoProxyCreator代理对象创建器
AspectJPointcutAdvisor切面
MethodLocatingFactoryBean通知功能(类中的方法)SimpleBeanFactoryAwareAspectInstanceFactory
AspectJMethodBeforeAdvice、AspectJAfterAdvice、AspectJAfterReturningAdvice、AspectJAfterThrowingAdvice、AspectJAroundAdvice通知类型
AspectJExpressionPointcut切入点
2、代理流程
AbstractAutoProxyCreator.postProcessAfterInitialization
JdkDynamicAopProxy.invoke
四、循环依赖问题
一级缓存
二级缓存,创建中的bean
三级缓存,产生代理对象
DefaultSingletonBeanRegistry
getSingleton
addSingletonFactory(将class提前暴露到三级缓存)
初始化后解决循环依赖代码
addSingleton