SpringIOC源码
2021-05-06 17:40:47 54 举报
SpringIOC源码解析
作者其他创作
大纲/内容
F:一级缓存未找到
getSingleton(beanName);
执行Bean的初始化方法:1.先判断Bean是否实现了 InitializingBean 接口,如果实现了InitializingBean接口,则调用Bean对象的afterPropertiesSet方法;2.然后判断Bean是否有指定init-method方法,如果指定了init-method方法,则调用bean对象的init-method指定的方法.
return wrappedBean;
初始化前,处理标注有@PostConstruct注解的方法
填充的属性包括:普通属性和使用@Autowired和@Resource注解标注的引用类型属性的赋值。使用了反射操作set方法完成赋值.
2.xml:获取 Bean 工厂,期间会做解析和加载 bean 定义的一系列工作.生成 BeanDefinition 对象.此处返回的beanFactory的真实类型为:DefaultListableBeanFactory自定义的xsd约束文件也会在该步骤进行解析,通过实现 BeanDefinitionParser 接口,并实现 parse 方解析自定义标签时通过实现 NamespaceHandlerSupport 接口,并实现init方法进行实现注解方式: 获取 Bean 工厂,并且对工厂设置了序列化ID
determineCandidateConstructors
11. 初始化所有剩余的单实例Bean(没有使用懒加载的Bean).整个Spring IOC的核心.包括执行@PostConstruct标注的方法.注意:SpringMVC的父子容器创建Bean的过程: SpringMVC中,存在着父容器和子容器。当父容器启动之后,会通过该方法将所有的Dao和Service对应的Bean创建出来,保存到beanFactory的单例缓存容器中 当子容器启动之后,也会通过该方法将所有的Controller,viewResolver,HandlerMapping对应的Bean创建出来,然后放入到beanFactory的单例缓存容器中.
registerListeners();
SmartInstantiationAwareBeanPostProcessor
执行顺序:先执行实现了优先级接口PriorityOrdered的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法 然后执行实现了Ordered接口的... 最后执行未实现PriorityOrdered接口和Ordered接口的...然后执行BeanFactoryPostProcessor接口的实现类的postProcessBeanFactory方法执行过程中,也是先执行实现了优先级接口PriorityOrdered的BeanFactoryPostProcessor的postProcessBea 然后执行实现了Ordered接口的... 最后执行未实现PriorityOrdered接口和Ordered接口的...
getEarlyBeanReference
prepareRefresh();
new AnnotationConfigApplicationContext(MainConfig.class);
(1) BeanFactory的后置处理器(2个): 1. BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 方法 2. BeanFactoryPostProcessor 的 postProcessBeanFactory 方法
针对不同的scope进行bean的创建
postProcessMergedBeanDefinition
initMessageSource();
1. 转化真正的BeanName2. 尝试从缓存或者singletonFactories 的 ObjectFactory中获取单实例对象(单实例可以解决循环依赖问题)3. bean的实例化(有时候存在诸如 BeanFactory 的情况,并不是直拨返回实例本身,而是返回指定方法返回的实例)4. 原型模式的依赖检查5. 检测parentBeanFactory6. 将存储 XML 配置文件的 GenericBeanDefinition 转换为 RootBeanDefinition7. 寻找依赖8. 针对不同的scope进行bean的创建9. 类型转换
postProcessAfterInitialization
4.Bean定义加载完毕之后实现,目前方法为空实现,留给开发人员进行自定义扩展。 和BeanFactoryPostProcessor中的方法postProcessBeanFactory相同该方法在Bean定义加载完毕之后,Bean实例化之前会执行比如在BeanFactory加载完所有的Bean定义之后,想要修改某个bean的定义信息,可以通过重写这个方法实现.比如:在xml中配置了<bean id=\"user\"><property name=\"name\" value=\"wb\"></property></bean>如果想在不修改配置文件的情况下修改name的值,可以使用如下的方法:class MyApplicationContext extends ClassPathXmlApplicationContext{ public MyApplicationContext(String s){ super(s); } @Override protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { BeanDefinition beanDefinition = beanFactory.getBeanDefinition(\"user\"); PropertyValue propertyValue=new PropertyValue(\"name\
1.准备上下文的刷新工作,记录bean容器的启动时间,容器活跃状态 验证系统中一些属性和属性值的设置等. 使用LinkedHashSet初始化earlyApplicationListeners和earlyApplicationEvents 早期的监听器和事件
调用Bean实现的Aware接口的方法,主要包括下面三个接口BeanNameAware ----> setBeanName()BeanClassLoaderAware ----> setBeanClassLoader()BeanFactoryAware ----> setBeanFactory()
BeanPostProcessor
InstantiationAwareBeanPostProcessor
finishBeanFactoryInitialization(beanFactory);
this.reader = new AnnotatedBeanDefinitionReader(this);
refresh()
postProcessBeforeDestruction
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
registerBeanPostProcessors(beanFactory);
applyMergedBeanDefinitionPostProcessors
二级缓存
原型模式的依赖检查
将存储 XML 配置文件的 GenericBeanDefinition 转换为 RootBeanDefinition
完成Bean的初始化(执行afterPropertiesSet和init-method)
创建Bean的实例,并且包装为一个包装对象返回.
this();
BeanDefinitionScanner初始化默认的Bean定义扫描器,在ClassPathBeanDefinitionScanner的构造中,会初始化配置文件解析器.初始化CandidateComponentsIndexLoader对象,用来按照索引加载bean定义核心方法:doScan(...String)
mbd.getDependsOn();
bean的实例化(有时候存在诸如 BeanFactory 的情况,并不是直拨返回实例本身,而是返回指定方法返回的实例)
获取当前Bean所依赖的其他Bean
赋值判断
postProcessBeanFactory(beanFactory);
initApplicationEventMulticaster();
此处会调用 ApplicationContextAwareProcessor 执行其他的aware方法.执行ApplicationContextAwareProcessor的postProcessBeforeInitializationorg.springframework.context.EnvironmentAwareorg.springframework.context.EmbeddedValueResolverAwareorg.springframework.context.ResourceLoaderAwareorg.springframework.context.ApplicationEventPublisherAwareorg.springframework.context.MessageSourceAwareorg.springframework.context.ApplicationContextAwareorg.springframework.context.support.AbstractApplicationContext#refresh()
else
T:三级缓存中找到,调用getObject()获取bean
Spring的11个扩展点
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
DestructionAwareBeanPostProcessor
BeanDefinitionReader初始化默认的Bean定义读取器,该步骤也会给容器中注册用来处理Spring注解的处理器(主要是后置处理器).创建conditionEvaluator,默认类型为:ConditionEvaluator注意:该步骤中会向容器中注入以下几个比较重要的后置处理器:(1) ConfigurationClassPostProcessor(本质是一个BeanFactoryPostProcessor): 用来处理JavaConfig配置类的后置处理器,包括JavaConfig配置类中注解的解析及处理操作(2) AutowiredAnnotationBeanPostProcessor: 用来处理@Autowired和@Value注解(3) CommonAnnotationBeanPostProcessor: 提供对JSR-250规范注解的支持@javax.annotation.Resource、@javax.annotation.PostConstruct 和 @javax.annotation.PreDestroy等的支持。(4) EventListenerMethodProcessor:提供对@PersistenceContext的支持(5) DefaultEventListenerFactory: 提供对@EventListener的支持
this.scanner = new ClassPathBeanDefinitionScanner(this);
postProcessProperties
hasInstantiationAwareBeanPostProcessors
获取候选的用来创建bean对象的构造函数指定了带参数的构造函数
可以直接返回bean,停止创建,AOP:解析切面
在bean实例被销毁前调用
一级缓存
MergedBeanDefinitionPostProcessor
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
if (mbd.isSingleton())
检测parentBeanFactory
getBean(beanName);
12.发布事件。例如容器中的刷新事件:ContextRefreshedEvent就是在这一步中发布. SpringCloud在该步骤中会启动web服务
6.注册所有bean的后置处理器.用来拦截Bean的创建注册所有实现了BeanPostProcessor接口的后置处理器 执行过程中,也是先执行实现了优先级接口PriorityOrdered接口的BeanPostProcessor的addBeanPostProcessor方法 然后执行实现了Ordered接口的... 最后执行未实现PriorityOrdered接口和Ordered接口的... 其中也涉及到了排序过程
注入属性,@Autowired
invokeBeanFactoryPostProcessors(beanFactory);
//解析配置类并将配置类封装为一个bean定义注册到Bean定义注册中心register(componentClasses);
// 将配置类解析为Bean定义,并注册到Bean定义注册中心.\t\tthis.reader.register(componentClasses);
初始化后,创建代理类.
三级缓存
return
7.初始化消息源用来做国际化,消息绑定,消息解析等功能一般在SpringMVC中会使用到.
(2) Bean的后置处理器(9个): 1. InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantiation 方法 2. SmartInstantiationAwareBeanPostProcessor的 determineCandidateConstructors 方法 3. MergedBeanDefinitionPostProcessor 的 postProcessMergedBeanDefinition 方法 4. SmartInstantiationAwareBeanPostProcessor 的 getEarlyBeanReference 方法 5. InstantiationAwareBeanPostProcessor 的 postProcessAfterInstantiation 方法 6. InstantiationAwareBeanPostProcessor 的 postProcessProperties 方法 7. BeanPostProcessor 的 postProcessBeforeInitialization 方法 8. BeanPostProcessor 的 postProcessAfterInitialization 方法 9. DestructionAwareBeanPostProcessor 的 postProcessBeforeDestruction
通过实现InstantiationAwareBeanPostProcessor接口来进行自定义扩展,生成自定义的代理对象
super()
onRefresh();
isPrototypeCurrentlyInCreation(beanName)
postProcessAfterInstantiation
9.用来初始化一些特殊的Bean,目前默认是空方法,未实现,可以通过继承AbstractApplicationContext类, 然后覆写该方法进行自定义特殊bean的初始化.比如:AbstractRefreshableWebApplicationContext中onRefresh方法用来初始化主题能力.SpringBoot也是在改步骤中启动内嵌Tomcat容器的
beanFactory.preInstantiateSingletons();
this.beanFactory = new DefaultListableBeanFactory();
transformedBeanName(name);
10.注册监听器将监听器绑定到广播器上,将监听器对应的beanName绑定到到第8步初始化的事件派发器中, 如果之前有发布的事件,则直接通过事件派发器将事件派发出去.
prepareBeanFactory(beanFactory);
postProcessBeforeInitialization
8.初始化事件派发器,用来发布事件 如果容器中有类型为ApplicationEventMulticaster的派发器组件,则直接获取使用 如果容器中没有,则默认创建一个类型为SimpleApplicationEventMulticaster的派发器,供容器派发事件使用
throw new BeanCurrentlyInCreationException(beanName);
BeanDefinitionRegistry初始化默认的Bean工厂,类型为DefaultListableBeanFactory 功能最全的 BeanFactory查看DefaultListableBeanFactory的继承类,发现它继承了 BeanDefinitionRegistry
F:三级缓存中没有找到
注意:(1)通过 setter 注入方式产生的循环引用是可以通过以上方案解决的。(2)构造器注入方式产生的循环引用无法解决,因为无法实例化出 earlySingletonBean 实例。(3)非单例模式的循环引用也无法解决,因为 Spring 框架不会缓存非单例的 bean 实例。
T:添加到二级缓存,从三级缓存中移除
else if (mbd.isPrototype())
F:二级缓存没有找到
finishRefresh();
if (getParentBeanFactory() != null && !containsBeanDefinition(beanName))
解决循环依赖问题
postProcessBeforeInstantiation
0 条评论
下一页