JAVA全系列 教程
3762个小节阅读:7089.6k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
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
整理一下:
x1. BeanFactory是Spring框架中IoC容器的顶级接口。里面提供了IoC容器的最核心功能。
2. ApplicationContext是BeanFactory的子接口,ApplicationContext具备BeanFactory的所有功能。
3. ApplicationContext比BeanFactory多的功能
* AOP 功能
* 国际化(MessageSource)
* 访问资源,如URL和文件(ResourceLoader)
* 消息发送机制(ApplicationEventPublisher)
* Spring集成Web时功能。
除上述文档直接给出的两者区别外,使用BeanFactory时,默认所有的bean都是获取时才会被实例化。而使用ApplicationContext时IoC 容器启动就会立即实例化所有bean。
这时有的小伙伴可能有点迷惑了,那到底用哪个接口作为IoC容器类型呢?其实这个问题官方已经给出明确的解释了。网址: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#context-introduction-ctx-vs-beanfactory
官方已经明确说明了,推荐使用ApplicationContext,所以我们后面都是用ApplicationContext或其子接口。
虽然不推荐使用BeanFactory,但是我们可以看看BeanFactory接口里面到底有哪些方法。
从上图看到,BeanFactory里面主要功能就是获取容器中的Bean。获取时可以按照类型获取,也可以按照名称获取,还支持泛型,可以控制获取后Bean的类型。所以BeanFactory只提供了IoC容器的最基本功能。即:IoC/DI功能。
BeanFactory的层次结构(Hierarchy)中相关接口和实现类比较多
所以我用一张更加清晰的图来表示下这两个接口及常用的实现类。
可以看出来,ApplicationContext要比BeanFactory多继承了6个父接口。这六个父接口就是ApplicationContext比BeanFactory多出的功能。虽然现在看不太懂这6个接口是什么意思,也不用着急,等学到后面再回头来看就可以了,现在只需要知道ApplicationContext比BeanFactory功能更加强大就可以了。
最后来看看ClassPathXmlApplicationContext。因为ApplicationContext是接口,是无法实例化。只能实例化这个实现类。想要实例化类,就需要调用类的构造方法。下图被选中具有一个String类型参数的构造方法就是我们常用的,参数是Spring框架配置文件路径。
然后就可以通过从BeanFactory继承过来的getBean获取到容器中的Bean对象了。
所以,想要在Spring框架中创建IoC容器,并从容器中获取到Bean,代码也比较简单
xxxxxxxxxx
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
People peo = applicationContext.getBean("peo", People.class);
System.out.println(peo);
最后附上BeanFactory容器创建的方式。
Spring 3.1之前BeanFactory实例化是通过XmlBeanFactory,但是XmlBeanFactory在目前的Spring Framework 6已经不存在。
xxxxxxxxxx
FileSystemResource fsr = new FileSystemResource("D:\\idea\\idea2022ws\\summer\\src\\main\\resources\\applicationContext.xml");
XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(fsr);
People peo = xmlBeanFactory.getBean("peo",People.class);
System.out.println(peo);
从Spring 3.1 版本开始,使用DefaultListableBeanFactory和XMLBeanDefinitionReader替代了上面写法。
xxxxxxxxxx
DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);
xmlBeanDefinitionReader.loadBeanDefinitions(new FileSystemResource("D:\\idea\\idea2022ws\\summer\\src\\main\\resources\\applicationContext.xml"));
People peo = defaultListableBeanFactory.getBean("peo", People.class);
System.out.println(peo);