目录
百战程序员,全站22050+开发课程+文档 ,学习精选优质好课快人一步!观看视频 快捷键ALT+N

JAVA全系列 教程

3762个小节阅读:7089.6k

收藏
全部开发者教程

C语言快速入门

JAVA全系列 教程

面向对象的程序设计语言

Python全系列 教程

Python3.x版本,未来主流的版本

人工智能 教程

顺势而为,AI创新未来

大厂算法 教程

算法,程序员自我提升必经之路

C++ 教程

一门通用计算机编程语言

微服务 教程

目前业界流行的框架组合

web前端全系列 教程

通向WEB技术世界的钥匙

大数据全系列 教程

站在云端操控万千数据

AIGC全能工具班

A

A A

White Night

阅读(763)
赞(0)

四、BeanFactory和ApplicationContext

IoC/DI 实现过程非常重要的一块就是IoC Container。必须创建出IoC容器,才能继续做后面的事情。

在Spring框架中IoC Container的类型是BeanFactory和ApplicationContext。所以必须先搞懂这两个东西是什么,然后才能去写第一个Spring框架案例。否则即使照着视频写出来了,也是照葫芦画瓢。

在上面学习IoC/DI时,就看到官方在介绍IoC时直接介绍了BeanFactory和ApplicationContext的区别。

网址: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction

image-20230314153514648

整理一下:

除上述文档直接给出的两者区别外,使用BeanFactory时,默认所有的bean都是获取时才会被实例化。而使用ApplicationContext时IoC 容器启动就会立即实例化所有bean。

这时有的小伙伴可能有点迷惑了,那到底用哪个接口作为IoC容器类型呢?其实这个问题官方已经给出明确的解释了。网址: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#context-introduction-ctx-vs-beanfactory

image-20230314162053546

官方已经明确说明了,推荐使用ApplicationContext,所以我们后面都是用ApplicationContext或其子接口。

虽然不推荐使用BeanFactory,但是我们可以看看BeanFactory接口里面到底有哪些方法。

image-20230314155059371

从上图看到,BeanFactory里面主要功能就是获取容器中的Bean。获取时可以按照类型获取,也可以按照名称获取,还支持泛型,可以控制获取后Bean的类型。所以BeanFactory只提供了IoC容器的最基本功能。即:IoC/DI功能。

BeanFactory的层次结构(Hierarchy)中相关接口和实现类比较多

image-20230314155618596

所以我用一张更加清晰的图来表示下这两个接口及常用的实现类。

页-1(6)

可以看出来,ApplicationContext要比BeanFactory多继承了6个父接口。这六个父接口就是ApplicationContext比BeanFactory多出的功能。虽然现在看不太懂这6个接口是什么意思,也不用着急,等学到后面再回头来看就可以了,现在只需要知道ApplicationContext比BeanFactory功能更加强大就可以了。

最后来看看ClassPathXmlApplicationContext。因为ApplicationContext是接口,是无法实例化。只能实例化这个实现类。想要实例化类,就需要调用类的构造方法。下图被选中具有一个String类型参数的构造方法就是我们常用的,参数是Spring框架配置文件路径。

image-20230314163050531

然后就可以通过从BeanFactory继承过来的getBean获取到容器中的Bean对象了。

image-20230314163315858

所以,想要在Spring框架中创建IoC容器,并从容器中获取到Bean,代码也比较简单

最后附上BeanFactory容器创建的方式。

suiranbuyong

Spring 3.1之前BeanFactory实例化是通过XmlBeanFactory,但是XmlBeanFactory在目前的Spring Framework 6已经不存在。

从Spring 3.1 版本开始,使用DefaultListableBeanFactory和XMLBeanDefinitionReader替代了上面写法。

 

北京市昌平区回龙观镇南店村综合商业楼2楼226室

©2014-2023 百战卓越(北京)科技有限公司 All Rights Reserved.

京ICP备14032124号-2