理解Spring 容器、BeanFactory 以及 ApplicationContext
一、spring 容器理解
spring 容器可以理解为生产对象(Object)的地方,在这里容器不只是帮助我们创建对象那么简单,它负责了对象的整个生命周期-创建、装配、销毁。而这里对象的创建管理的控制器都交给
了spring 容器,所以这是一种控制权的反转,称为IOC 容器,而这里 IOC 容器不只是 Spring 才有,很多框架也有此技术。
二、BeanFactory 和 ApplicationContext 之间的关系
- BeanFactory 和 ApplicationContext 是 Spring 的两大接口,而其中 ApplicationContext 是 BeanFactory 的子接口。它们都可以当作 Spring 的容器,Spring 容器是生成 Bean 实例的工厂,并
 
管理容器中的Bean。 在基于 Spring 的 Java 应用中,所有的组件都被当成 Bean 处理,包括数据源,Hibernate 的 SessionFactory 、事务管理器等。
- 生活中一般把生产产品的地方称为工厂,而这里 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 三个子接口
* ListableBeanFactory:提供了批量获取Bean的方法
* AutowireCapableBeanFactory:在BeanFactory基础上实现对已存在实例的管理
四、 ApplicationContext 介绍

ApplicationContext结构图.png
ApplicationContext类结构树.png

Spring 具有非常大的灵活性,它提供了三种主要的装配机制
- 在 XML 中进行显示配置
 - 在 Java 中显示配置
 - 隐式的 bean 发现机制和自动装配
- 组件扫描 (component scanning) : Spring 会自动发现应用上下文中创建的 bean
 - 自动装配(autowire):Spring 自动满足 bean 之间的依赖
 
 
- 通过xml文件将配置加载到IOC容器中
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--若没写id,则默认为com.test.Man#,#0为一个计数形式-->
<bean id="man" class="com.test.Man"></bean>
</beans>
public class Test {
    public static void main(String[] args) {
        //加载项目中的spring配置文件到容器
        //ApplicationContext context = new ClassPathXmlApplicationContext("resouces/applicationContext.xml");
        //加载系统盘中的配置文件到容器
        ApplicationContext context = new FileSystemXmlApplicationContext("E:/Spring/applicationContext.xml");
        //从容器中获取对象实例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}
- 通过java注解的方式将配置加载到IOC容器
 
//同xml一样描述bean以及bean之间的依赖关系
@Configuration
public class ManConfig {
@Bean
public Man man() {
return new Man(car());
}
@Bean
public Car car() {
return new QQCar();
}
}
public class Test {
    public static void main(String[] args) {
        //从java注解的配置中加载配置到容器
        ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class);
        //从容器中获取对象实例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}
- 隐式的bean发现机制和自动装配
 
/**
* 这是一个游戏光盘的实现
*/
//这个简单的注解表明该类回作为组件类,并告知Spring要为这个创建bean。
@Component
public class GameDisc implements Disc{
@Override
public void play() {
System.out.println("我是马里奥游戏光盘。");
}
}
不过,组件扫描默认是不启用的。我们还需要显示配置一下Spring,从而命令它去寻找@Component注解的类,并为其创建bean
@Configuration
@ComponentScan
public class DiscConfig {
}
除了提供BeanFactory所支持的所有功能外ApplicationContext还有额外的功能
- 默认初始化所有的Singleton,也可以通过配置取消预初始化。
 - 继承MessageSource,因此支持国际化。
 - 资源访问,比如访问URL和文件。
 - 事件机制。
 - 同时加载多个配置文件。
 - 以声明式方式启动并创建Spring容器。
 
参考:https://www.jianshu.com/p/2854d8984dfc
理解Spring 容器、BeanFactory 以及 ApplicationContext的更多相关文章
- 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean
		
7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...
 - 通过单元测试理解spring容器以及dubbo+zookeeper单元测试异常处理
		
一.先说一个结论:单元测试与主项目的spring容器是隔离的,也就是说,单元测试无法访问主项目spring容器,需要自己加载spring容器. 接下来是代码实例,WEB主项目出于运行状态,单元测试中可 ...
 - 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring IoC容器BeanFactory和ApplicationContext
		
IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建.Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring ...
 - 资深程序员总结:彻底理解Spring容器和应用上下文
		
点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪 ...
 - 转: 彻底理解 Spring 容器和应用上下文
		
本文由 简悦 SimpRead 转码, 原文地址 https://mp.weixin.qq.com/s/o11jVTJRsBi998WlgpfrOw 有了 Spring 之后,通过依赖注入的方式,我们 ...
 - spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean
		
1.Beanfactory和ApplicationContext有什么区别 ApplicationContext (1)在配置文件加载后创建bean 利用debug方式,在Student类的无参构造方 ...
 - Spring中BeanFactory与ApplicationContext的区别
		
BeanFactory:Bean工厂接口,是访问Spring Bean容器的根接口,基本Bean视图客户端.从其名称上即可看出其功能,即实现Spring Bean容器的读取. ApplicationC ...
 - Spring之BeanFactory与ApplicationConText区别
		
使用BeanFactory从xml配置文件加载bean: import org.springframework.beans.factory.xml.XmlBeanFactory; import org ...
 - spring容器BeanFactory简单例子
		
在Spring中,那些组成你应用程序的主体及由Spring Ioc容器所管理的对象,都被称之为bean.简单来讲,bean就是Spring容器的初始化.配置及管理的对象.除此之外,bean就与应用程序 ...
 
随机推荐
- 【网站】 简单通用微信QQ跳转浏览器打开代码
			
使用方法: 将代码全部复制 粘贴到 网站根目录下index.php文件的顶端 注意:不要覆盖了 index.php里面的原代码,原代码保留 使用说明: 手机QQ内打开,会自动跳转浏览器: 微信内打开, ...
 - Echat 地图样式格式
			
1.白色 mapStyle: { styleJson: [{ 'featureType': 'water', 'elementType': 'all', 'stylers': { 'color': ' ...
 - js-时间相关的转换
			
毫秒值 -> 时间 var date = new Date(1477386005*1000);
 - Python JASON
			
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. http://www.runoob.com/python/python-json.ht ...
 - vue-cli脚手架创建vue项目
			
CLI 使用vue-cli可以快速搭建Vue开发环境以及对应的webpack配置 cnpm install -g @vue/cli // 如果需要使用旧版本的vue init功能(脚手架2),你可以全 ...
 - Java-POJ1014-Dividing
			
多重背包问题的特点是物品数量可以大于1但是有限制.状态定义与01背包一致. 多重背包的解法有多种,复杂度也各不相同. 对于物品数Ci较大的数据,可以采取二进制数进行优化(就是这样,别问就是baidu! ...
 - logits的用法和此类标注的作用,已经再最后一层加了映射了就不需要再加入了
			
logits的用法和此类标注的作用,已经再最后一层加了映射了就不需要再加入了 待办 PyTorch(tensorflow类似)的损失函数中,有一个(类)损失函数名字中带了with_logits. 而这 ...
 - MySQL学习(八)删除表数据
			
表空洞的产生 删除某个行数据 或删除某个页 如下图所示,这个删除过程只是标记了某行的位置为删除,假如此时在300与600之间插入了一行数据,那么 同理,当删除某个页时,该页就会被复用.所以当删 ...
 - Java基础(十二)之包和权限访问
			
软件包 软件包解决了两个类名字一样的问题.软件包就是一个"文件夹". 包名的命名规范:1.要求所有字母都小写:2.包名一般情况下,是你的域名倒过来写.比如baidu.com,pac ...
 - hdu 1281 棋盘游戏(二分图)
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 每行每列作为节点,给可以放车的点将对应的行列连边,最多可放置的车即为建二分图后的最大匹配,跑一边 ...