Spring IOC常见问题

目录

Spring IOC常见问题

一、Spring中常见(重要)的接口

二、什么是BeanFactory

三、BeanFactory和ApplicationContext的区别

四、Spring IOC的加载过程

五、Bean的生命周期

六、Spring中有哪些扩展接口及调用时机

七、BeanFactory后置处理器

八、Bean后置处理器


Spring IOC常见问题

 

一、Spring中常见(重要)的接口

BeanFactory : Spring顶层核心接口,使用了简单工厂模式,负责生产Bean

BeanDefinition : Bean定义 Spring顶层核心接口,封装了生产Bean的一切原料

BeanDefinitionReader : 用来读取BeanDefinition,就比如通过一个配置类,知道我们要去扫描哪个路径下的文件,就是通过BeanDefinitionReader来逐一读取到

BeanDefinitionScanner : 用来扫描我们的配置需要注入到Spring容器中的bean,比如有的类有@Component所标识,那就说明这个类会被扫描进来,没有被标注的就不会被扫描进去。

BeanDefinitionRegistry : 用来注册BeanDefinition,将BeanDefinition注册到一个BeanDefinitionMap缓存中

BeanFactoryPostProcessor :BeanFactory后置处理器

 

二、什么是BeanFactory

一个bean的工厂,用来生产bean(实例化,属性赋值,初始化,调用一大堆aware接口),通过getBean方法可以获取bean,也可以生产bean。BeanFactory只专注与bean的生产与获取,其他的他都不管。

 

三、BeanFactory和ApplicationContext的区别

BeanFactory只专注与bean的生产与获取,而ApplicationContext有一个完整的创建bean的过程,ApplicationContext中有BeanDefinition(bean定义),BeanFactoryPostProcessor(BeanFactory后置处理器,用来修改Bean定义),BeanDefinitionRegistryPostProcessor(用来新增一个Bean定义),ApplicationContext可以对bean的创建进行自定义的修改。

 

共同点:都能够去生产bean,BeanFactory本来的作用就是去生产bean的,ApplicationContext为什么能够生产bean,是因为ApplicationContext本身就实现了BeanFactory接口,所以他也是通过BeanFactory来生产bean的。

不同点:BeanFactory只负责去生产bean,而ApplicationContext有更多的扩展功能,比如AOP,国际化等

而且BeanFactory只能一个一个的指定bean定义,而ApplicationContext可以通过配置类,直接去扫描就可以全部获取到。

下表列出了BeanFactoryApplicationContext接口和实现提供的功能。

FeatureBeanFactoryApplicationContext
Bean Bean实例化/装配YesYes
集成的生命周期管理NoYes
自动注册 BeanPostProcessorNoYes
自动注册 BeanFactoryPostProcessorNoYes
便利的 MessageSource 访问 (国际化)NoYes
内置ApplicationEvent 发布机制NoYes

 

虽然ApplicationContext和BeanFactory都是bean容器,但是ApplicationContext比BeanFactory更值得推荐使用。

 

四、Spring IOC的加载过程

ApplicationContext通过注解或者配置文件的方式扫描到需要注册的bean,将bean通过BeanDefinition,BeanFactoryPostProcessor一系列的处理,然后调用到BeanFactory来对bean进行实例化,属性赋值,初始化,调用一大堆aware接口等操作。最后将bean缓存至一级缓存中。

  1、先将类通过xml的方式或者注解的方式,先加载成BeanDefinition,怎么加载成BeanDefinition,如下几个步骤:

    a、通过BeanDefinitionReader读取到我们的配置类。

    b、通过BeanDefinitionScanner去扫描我们的类,通过读取到的配置类,找到我们所配置的类

    c、通过BeanDefinitionRegistry将我们扫描到的符合我们配置的类,去注册成BeanDefinition

  2、我们的ApplicationContext可以调用扩展点来修改,注册BeanDefinition

  扩展点:BeanFactoryPostProcessor,用来修改BeanDefinition,其实上面的a,b,c三步操作都是依附于这个后置处理器来实现的,没用这个,上面的a,b,c都实现不了。由此可见后置处理器的重要性。

             BeanDefinitionRegistryPostProcessot,用来注册一个新的BeanDefinition

  3、通过BeanFactory来调用getBean来生产bean,getBean可以用来生产bean也可以用来获取bean,用了简单工厂的设计模式。getBean中还有很多细节,需要去看源码来慢慢熟悉。

  4、然后再就是Bean的生命周期的几个步骤,生成一个完整的Bean。

  5、生产完一个Bean后,放到一个Map里面,也就是单例缓存池(一级缓存)

 

五、Bean的生命周期

1)实例化,2)属性赋值,3)初始化,4)调用一大堆aware接口。

初始化完后将bean存入单例缓存池中,就是一个Map,一级缓存。需要用到哪个bean的时候,就通过getBean(“beanName”)来获取Bean

这四步操作每一步操作前后都会有调用BeanPostProcessor(Bean的后置处理器),为了以后可能够在bean的初始化过程中对其进行一些设置。

  1、实例化:a通过反射实现,是spring去实现的,我们无法控制这个bean实例化的过程的,此时这个bean还是一个空壳;b.通过工厂方式实例化,如@Bean注解,这个可以是我们自己通过new的方式来创建,可以我们自己控制这个bean实例化的过程的。通过工厂方式实例化更灵活,但是需要自己去写bean的实例化。怎么实例化看开发者自己,想反射反射,想new就new,想赋什么属性参数就赋什么。

  2、属性赋值:填充属性,解析@Autowired @Value 等操作,注意spring是如何处理循环依赖的

  3、初始化:配置的initMethod,destory等方法在这步进行调用

  4、aware接口:在初始化这一步,会调用很多的aware接口,用来获取bean中的各种信息,数据

 

六、Spring中有哪些扩展接口及调用时机

 BeanDefinitionReader,BeanDefinitionRegister,BeanFactoryPostProcessor,BeanDefinitionRegistryPostProcessor,BeanPostProcessor,各种Aware等接口,主要是使Spring能够更好的解耦,对spring其他功能或者其他第三方能够很好的整合,拔插。

 

七、BeanFactory后置处理器

BeanFactoryPostProcessor:用来在创建BeanDefinition(bean定义)的时候可以去修改这个bean,很多第三方框架集成spring都用到了这个,比如:mybatis

BeanDefinitionRegistryPostProcessor: 实现BeanFactoryPostProcessor接口,用来注册一个BeanDefinition(bean定义),他的参数就是BeanDefinitionRegistry(bean定义注册器),那么我们就可以直接来操作这个注册器,通过registry.registerBeanDefinition()来注册(新增)一个bean定义,就相当于新增了一个bean

 

这两个扩展节点是在ApplicationContext里面的,这也是他的为什么比BeanFactory好用的原因。因为ApplicationContext中有很多的扩展点。

 

八、Bean后置处理器

既然ApplicationContext有那么多的扩展点,那么BeanFactory有扩展点吗?答案是有的

BeanFactory中有各种BeanPostProcessor,在bean的生命周期中,会各种调用BeanPostProcessor

 

Spring Framework 中文文档: https://github.com/DocsHome/spring-docs/blob/master/SUMMARY.md

想要更深入的了解Spring IOC,请看源码解析部分。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值