Spring容器、BeanFactory、ApplicationContext
一. spring容器
spring容器可以理解为生产对象的地方,在这里容器不只是帮我们创建了对象那么简单,它负责了对象的整个生命周期–创建、装配、销毁。而这里对象的创建管理的控制权都交给了Spring容器,所以这是一种控制权的反转,称为IOC容器。
二. BeanFactory 和 ApplicationContext之间的关系(IOC容器的两种接口)
- BeanFactory和ApplicationContext是Spring的两大核心接口,而其中ApplicationContext是BeanFactory的子接口。它们都可以当做Spring的IOC容器,Spring容器是生成Bean实例的工厂,并管理容器中的Bean。
在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源,Hibernate的SessionFactory、事务管理器等。
-
BeanFactory 一般不提供开发人员进行使用
加载配置文件时候不会创建对象,在第一次获取(使用)对象时才去创建对象,之后获取的是缓存中的同一对象。 -
ApplicationContext 一般由开发人员进行使用
加载配置文件时候就创建所有对象,在获取(使用)对象时都是同一对象。
看区别(其中bean0.xml是定义bean的xml文件)(举例子:只讨论单例):
BeanFactory context1=new ClassPathXmlApplicationContext(“bean0.xml”); //没有创建对象
User user1=context1.getBean(“user”,User.class);//这才创建了对象
User user11=context1.getBean(“user”,User.class);//从缓存中获取同一对象。ApplicationContext context2=new ClassPathXmlApplicationContext(“bean0.xml”); //创建xml中所有配置的对象
User user2=context2.getBean(“user”,User.class); //获取使用对象。
User user22=context2.getBean(“user”,User.class);//获取使用对象。
备注:如果是多例,都是只在获取对象的时候才去创建对象的,并且每次都是创建的新对象!!!
-
生活中我们一般会把生产产品的地方称为工厂,而在这里bean对象的地方官方取名为BeanFactory,直译Bean工厂(com.springframework.beans.factory.BeanFactory),我们一般称BeanFactory为IoC容器。ApplicationContext 也为容器。(或者应用上下文)
-
Spring的核心是容器,而容器并不唯一,框架本身就提供了很多个容器的实现,大概分为两种类型:
一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能;
一种就是继承了BeanFactory后派生而来的ApplicationContext(应用上下文),它能提供更多企业级的服务,例如解析配置文本信息等等,这也是ApplicationContext实例对象最常见的应用场景。
三、BeanFactory详情介绍:
Spring容器最基本的接口就是BeanFactory。BeanFactory负责创建、装配、管理Bean,它有一个子接口ApplicationContext,也被称为Spring上下文,容器同时还管理着Bean和Bean之间的依赖关系。
spring IOC容器的实现,从根源上是BeanFactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说:
DefaultListableBeanFactory 是整个spring ioc的始祖。
接口介绍:
- BeanFactory接口:
是Spring bean容器的根接口,提供获取bean,是否包含bean,是否单例与原型,获取bean类型,bean 别名的方法 。它最主要的方法就是getBean(String beanName)。 - BeanFactory的三个子接口:
* HierarchicalBeanFactory:提供父容器的访问功能
* ListableBeanFactory:提供了批量获取Bean的方法
* AutowireCapableBeanFactory:在BeanFactory基础上实现对已存在实例的管理 - ConfigurableBeanFactory接口:
主要单例bean的注册,生成实例,以及统计单例bean - ConfigurableListableBeanFactory接口:
继承了上述的所有接口,增加了其他功能:比如类加载器,类型转化,属性编辑器,BeanPostProcessor,作用域,bean定义,处理bean依赖关系, bean如何销毁… - 实现类DefaultListableBeanFactory 的详细介绍:
实现了ConfigurableListableBeanFactory接口,实现上述BeanFactory所有功能。它还可以注册BeanDefinition
四. ApplicationContext介绍
如果说BeanFactory是Sping的心脏,那么ApplicationContext就是完整的身躯了。
ApplicationContext接口有个扩展接口ConfigurableApplicationContext,
新增了两个方法:refresh()、close(),让ApplicationContext具有启动、刷新、关闭上下文的功能。
ApplicationContext接口的常用实现类 | 作用 |
---|---|
ClassPathXmlApplicationContext | 从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式。 |
FileSystemXmlApplicationContext | 从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件。 |
XmlWebApplicationContext | 从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。 |
AnnotationConfigApplicationContext | 从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式。 |
AnnotationConfigWebApplicationContext | 专门为web应用准备的,适用于注解方式。 |
五. Spring的三种主要装配机制?
- 在xmL中进行显示配置
- 在Java中进行显示配置
- 隐式的bean发现机制和自动装配
*组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
*自动装配(autowiring):Spring自动满足bean之间的依赖。
(学习链接:https://blog.csdn.net/weixin_34279579/article/details/91796695)
六. 鸣谢
链接1:https://www.jianshu.com/p/2854d8984dfc
链接2:https://www.cnblogs.com/xiaoxi/p/5846416.html