Spring源码阅读-IOC源码阅读(一)

接下来的几篇文章会带着大家去看看spring源码,我们会从两大部分去阅读spring的源码,主要是ioc和aop这两块。在阅读源码之前,我们先来看看spring的一些继承体系和一些容易造成混淆的接口。
复制代码

Spring的继承体系

spring基础容器(BeanFactory)的继承体系

Spring源码阅读-IOC源码阅读(一)

这里面我们对几个比较重要的接口做下说明

  • BeanFactory:IOC容器最顶层的接口,对IOC容器的基本行为做了定义,很明显这就是工厂模式的工厂接口
  • ListableBeanFactory:主要是用来定义返回一系列bean的接口,比如,返回指定类型的bean的所有实例,也可以获取所有的beanName。
  • ConfigurableBeanFactory:设置bean加载的一系列信息
  • AutowireCapableBeanFactory:自动装配的bean工厂,它提供了自动装配的功能,根据类定义BeanDefinition装配Bean、同时执行前置和后置处理器
  • DefaultListableBeanFactory:基础容器的集大成者,它包括了上面所有父类或者父接口的方法,同时继承了BeanDefinitionRegistry,也拥有了对BeanDefinition操作的能力。

spring高级容器(ApplicationContext)的继承体系

Spring源码阅读-IOC源码阅读(一)

可以看到高级容器不仅具体基础容器BeanFactory的功能还额外了许多其他的功能。

  • ClassPathXmlApplicationContext:主要是通过xml加载Bean的入口
  • AnnotationConfigApplicationContext:主要是加载通过注解配置的Bean

看了两个继承体系之后,我们先来聊一聊两个继承体系的一不同之处:

  • ApplicationContext接口是继承于BeanFactory接口
  • BeanFactory创建是在第一次getBean()的时候创建bean实例
  • ApplicationContext是在初始化的时候就把所有的单例Bean创建完成

同时还有几个接口需要我们知道他们的区别,BeanPostProcessor和BeanFactoryPostProcessor,BeanFactory和FactoryBean 这两对接口名称很相似的接口的区别我们需要清楚,否则后面看源码会有的蒙,而且面试也有可能会提及。

BeanPostProcessor和BeanFactoryPostProcessor的区别

  • BeanFactoryPostProcessor:在bean实例创建之前,对BeanDefinition进行前置和后置处理(BeanDefinition是存储需要被加载的bean的一些信息,包括类型,名称,是否单例等信息)
  • BeanPostProcessor:在创建bean实例前后,对bean对象进行处理。一些代理类就是通过BeanPostProcessor进行创建的。

下面我们了解下BeanFactory和FactoryBean的一些区别

  • BeanFactory:就是ioc的基础容器,管理着spring中所有的bean
  • FactoryBean:也是spring管理的备案,只是这个bean比较特殊,就是一些工厂bean用来是用来产生bean对象的bean。比如我们在mybatis中定义的Mapper接口就是通过,MapperFactoryBean产生对应的代理对象。

结语

今天我们带大家了解了springIoc容器的基础体系和了解一些容易混淆的感念,下一篇我们会开始带大家进入spring的源码中去看看整个bean的加载到创建完毕的一个过程。复制代码

原文 

https://juejin.im/post/5dc79426e51d454afb467b2e

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring源码阅读-IOC源码阅读(一)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址