当前播放: 26 | Spring IoC容器:BeanFactory和ApplicationContext谁才是Spring IoC容器?
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程目录
第一章:Spring Framework总览 (12讲)
01 | 课程介绍
免费
02 | 内容综述
免费
03 | 课前准备:学习三件套(工具、代码与大脑)
免费
04 | 特性总览:核心特性、数据存储、Web技术、框架整合与测试
免费
05 | Spring版本特性:Spring各个版本引入了哪些新特性?
免费
06 | Spring模块化设计:Spring功能特性如何在不同模块中组织?
07 | Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?
08 | JDK API实践:Spring怎样取舍Java I/O、集合、反射、动态代理等API的使用?
09 | Java EE API整合:为什么Spring要与“笨重”的Java EE共舞?
10 | Spring编程模型:Spring实现了哪些编程模型?
11 | Spring核心价值:我们能从Spring Framework中学到哪些经验和教训呢?
12 | 面试题精选
第二章:重新认识IoC (9讲)
13 | IoC发展简介:你可能对IoC有些误会?
14 | IoC主要实现策略:面试官总问IoC和DI的区别,他真的理解吗?
15 | IoC容器的职责:IoC除了依赖注入,还涵盖哪些职责呢?
16 | 除了Spring,还有其它的IOC容器实现吗?
17 | 传统IoC容器实现:JavaBeans也是IoC容器吗?
18 | 轻量级IoC容器:如何界定IoC容器的“轻重”?
19 | 依赖查找 VS. 依赖注入:为什么 Spring 总会强调后者,而选择性忽视前者?
20 | 构造器注入 VS. Setter 注入:为什么 Spring 官方文档的解读会与作者的初心出现偏差?
21 | 面试题精选
第三章:Spring IoC容器概述 (9讲)
22 | Spring IoC依赖查找:依赖注入还不够吗?依赖查找存在的价值几何?
23 | Spring IoC依赖注入:Spring提供了哪些依赖注入模式和类型呢?
24 | Spring IoC依赖来源:依赖注入和查找的对象来自于哪里?
25 | Spring IoC配置元信息:Spring IoC有哪些配置元信息?它们的进化过程是怎样的?
26 | Spring IoC容器:BeanFactory和ApplicationContext谁才是Spring IoC容器?
27 | Spring应用上下文:ApplicationContext除了IoC容器角色,还提供哪些特性?
28 | 使用Spring IoC容器:选BeanFactory还是ApplicationContext?
29 | Spring IoC容器生命周期:IoC容器启停过程中发生了什么?
30 | 面试题精选
第四章:Spring Bean基础 (11讲)
31 | 定义Bean:什么是BeanDefinition?
32 | BeanDefinition元信息:除了Bean名称和类名,还有哪些Bean元信息值得关注?
33 | 命名Spring Bean:id和name属性命名Bean,哪个更好?
34 | Spring Bean的别名:为什么命名Bean还需要别名?
35 | 注册Spring Bean:如何将BeanDefinition注册到IoC容器?
36 | 实例化Spring Bean:Bean实例化的姿势有多少种?
37 | 初始化Spring Bean:Bean初始化有哪些方式?
38 | 延迟初始化Spring Bean:延迟初始化的Bean会影响依赖注入吗?
39 | 销毁Spring Bean: 销毁Bean的基本操作有哪些?
40 | 回收Spring Bean:Spring IoC容器管理的Bean能够被垃圾回收吗?
41 | 面试题精选
第五章:Spring IoC依赖查找(Dependency Lookup) (9讲)
42 | 依赖查找的今世前生:Spring IoC容器从Java标准中学到了什么?
43 | 单一类型依赖查找:如何查找已知名称或类型的Bean对象?
44 | 集合类型依赖查找:如何查找已知类型多个Bean集合?
45 | 层次性依赖查找:依赖查找也有双亲委派?
46 | 延迟依赖查找:非延迟初始化Bean也能实现延迟查找?
47 | 安全依赖查找
48 | 内建可查找的依赖:哪些Spring IoC容器内建依赖可供查找?
49 | 依赖查找中的经典异常:Bean找不到?Bean不是唯一的?Bean创建失败?
50 | 面试题精选
第六章:Spring IoC依赖注入(Dependency Injection) (20讲)
51 | 依赖注入的模式和类型:Spring提供了哪些依赖注入的模式和类型?
52 | 自动绑定(Autowiring):为什么Spring会引入Autowiring?
53 | 自动绑定(Autowiring)模式:各种自动绑定模式的使用场景是什么?
54 | 自动绑定(Autowiring)限制和不足:如何理解和挖掘官方文档中深层次的含义?
55 | Setter方法依赖注入:Setter注入的原理是什么?
56 | 构造器依赖注入:官方为什么推荐使用构造器注入?
57 | 字段注入:为什么Spring官方文档没有单独列举这种注入方式?
58 | 方法注入:方法注入是@Autowired专利吗?
59 | 接口回调注入:回调注入的使用场景和限制有哪些?
60 | 依赖注入类型选择:各种依赖注入有什么样的使用场景?
61 | 基础类型注入:String和Java原生类型也能注入Bean的属性,它们算依赖注入吗?
62 | 集合类型注入:注入Collection和Map类型的依赖区别?还支持哪些集合类型?
63 | 限定注入:如何限定Bean名称注入?如何实现Bean逻辑分组注入?
64 | 延迟依赖注入:如何实现延迟执行依赖注入?与延迟依赖查找是类似的吗?
65 | 依赖处理过程:依赖处理时会发生什么?其中与依赖查找的差异在哪?
66 | @Autowired注入:@Autowired注入的规则和原理有哪些?
67 | JSR-330 @Inject注入:@Inject与@Autowired的注入原理有怎样的联系?
68 | Java通用注解注入原理:Spring是如何实现@Resource和@EJB等注解注入的?
69 | 自定义依赖注入注解:如何最简化实现自定义依赖注入注解?
70 | 面试题精选
第七章:Spring IoC依赖来源(Dependency Sources) (8讲)
71 | 依赖查找的来源:除容器内建和自定义Spring Bean之外,还有其他来源提供依赖查找吗?
72 | 依赖注入的来源:难道依赖注入的来源与依赖查找的不同吗?
73 | Spring容器管理和游离对象:为什么会有管理对象和游离对象?
74 | Spring Bean Definition作为依赖来源:Spring Bean的来源
75 | 单例对象作为依赖来源:单体对象与普通Spring Bean存在哪些差异?
76 | 非Spring容器管理对象作为依赖来源:如何理解ResolvableDependency?
77 | 外部化配置作为依赖来源:@Value是如何将外部化配置注入Spring Bean的?
78 | 面试题精选
第八章:Spring Bean作用域(Scopes) (9讲)
79 | Spring Bean作用域:为什么Spring Bean需要多种作用域?
80 | "singleton" Bean作用域:单例Bean在当前Spring应用真是唯一的吗?
81 | "prototype" Bean作用域:原型Bean在哪些场景下会创建新的实例?
82 | "request" Bean作用域:request Bean会在每次HTTP请求创建新的实例吗?
83 | "session" Bean作用域:session Bean在Spring MVC场景下存在哪些局限性?
84 | "application" Bean作用域:application Bean是否真的有必要?
85 | 自定义Bean作用域:设计Bean作用域应该注意哪些原则?
86 | 课外资料:Spring Cloud RefreshScope是如何控制Bean的动态刷新?
87 | 面试题精选
第九章:Spring Bean生命周期(Bean Lifecycle) (18讲)
88 | Spring Bean 元信息配置阶段:BeanDefinition配置与扩展
89 | Spring Bean 元信息解析阶段:BeanDefinition的解析
90 | Spring Bean 注册阶段:BeanDefinition与单体Bean注册
91 | Spring BeanDefinition合并阶段:BeanDefinition合并过程是怎样出现的?
92 | Spring Bean Class加载阶段:Bean ClassLoader能够被替换吗?
93 | Spring Bean实例化前阶段:Bean的实例化能否被绕开?
94 | Spring Bean实例化阶段:Bean实例是通过Java反射创建吗?
95 | Spring Bean实例化后阶段:Bean实例化后是否一定被是使用吗?
96 | Spring Bean属性赋值前阶段:配置后的PropertyValues还有机会修改吗?
97 | Aware接口回调阶段:众多Aware接口回调的顺序是安排的?
98 | Spring Bean初始化前阶段:BeanPostProcessor
99 | Spring Bean初始化阶段:@PostConstruct、InitializingBean以及自定义方法
100 | Spring Bean初始化后阶段:BeanPostProcessor
101 | Spring Bean初始化完成阶段:SmartInitializingSingleton
102 | Spring Bean销毁前阶段:DestructionAwareBeanPostProcessor用在怎样的场景?
103 | Spring Bean销毁阶段:@PreDestroy、DisposableBean以及自定义方法
104 | Spring Bean垃圾收集(GC):何时需要GC Spring Bean?
105 | 面试题精选
第十章:Spring配置元信息(Configuration Metadata) (9讲)
106 | Spring配置元信息:Spring存在哪些配置元信息?它们分别用在什么场景?
107 | Spring Bean配置元信息:BeanDefinition
108 | Spring Bean属性元信息:PropertyValues
109 | Spring容器配置元信息
110 | 基于XML资源装载Spring Bean配置元信息
111 | 基于Properties资源装载Spring Bean配置元信息:为什么Spring官方不推荐?
112 | 基于Java注解装载Spring Bean配置元信息
113 | Spring Bean配置元信息底层实现之XML资源
114 | Spring Bean配置元信息底层实现之Properties资源
26 | Spring IoC容器:BeanFactory和ApplicationContext谁才是Spring IoC容器?

26 | Spring IoC容器:BeanFactory和ApplicationContext谁才是Spring IoC容器?

小马哥
《Spring Boot 编程思想》作者
239讲 约2500分钟7959
单独订阅¥199
2人成团¥129
11
本节摘要
登录 后留言

精选留言(18)

  • aksonic
    小马哥,通过视频我了解了ApplicationContext和BeanFactory之间的关系,也知道了DefaultListableBeanFactory被组合到了AbstractRefreshableApplicationContext,但好像视频并没有回答一个问题:UserRepository中的BeanFactory beanFactory属性为什么通过autowired=“byType”,注入的是DefaultListableBeanFactory,而不是ClassPathXmlApplicationContext?既然他们两者属于BeanFactory接口,按type注入,为什么不是ClassPathXmlApplicationContext?是框架哪里设置的吗?

    作者回复: 答案在 org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory 方法中,其中:

    beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
    beanFactory.registerResolvableDependency(ResourceLoader.class, this);
    beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
    beanFactory.registerResolvableDependency(ApplicationContext.class, this);

    以上代码明确地指定了 BeanFactory 类型的对象是 ApplicationContext#getBeanFactory() 方法的内容,而非它自生。

    2020-01-13
    14
  • Yes
    ApplicationContext是BeanFactory的子接口,说明ApplicationContext is BeanFactory。并且ApplicationContext 是BeanFactory的包装类,也就是内部组合了BeanFactory的实现-DefaultListableBeanFactory。为什么包装了DefaultListableBeanFactory,因为它需要简化且丰富功能来为企业开发提供更高的便捷性,也就是说ApplicationContext 是DefaultListableBeanFactory的超集。
    至于为什么UserRepository注入的BeanFactory 不等于ClassPathXmlApplicationContext得到的BeanFactory ,是因为AbstractApplicationContext#prepareBeanFactory中 指明了 beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); 也就是说当byType是BeanFactory.class的时候,获得是的ApplicationContext中的DefaultListableBeanFactory对象。
    那真正的IOC的底层实现就是BeanFactory的实现类,因为ApplicationContext是委托DefaultListableBeanFactory来操作getBean等方法的。

    作者回复: 👍

    2020-03-01
    2
  • 周治慧
    打卡 自己整理了一遍才清楚;
    1.文中xml中自动注入的BeanFactory为DefaultListableBeanFactory,是因为在AbstractApplicationContext#prepareBeanFactory方法中beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory)中指定了接口的实现为自己bean对象也就是DefaultListableBeanFactory(最后是放在一个map中)
    2.我们通过classPathXmlApplicationContext创建的bean对象为ApplicationContext类型,虽然继承了接口BeanFactory但是依赖注入的并不是它所以不相等
    3.ApplicationContext中每次getBean()都是通过DefaultListableBeanFactory来查找bean对象的

    作者回复: 🤙

    2020-02-26
    1
  • 司徒
    我是不是比较笨,我看了三遍 再+评论的总结和答疑,才有点明白。嘤嘤嘤~~~~

    作者回复: 你已经很厉害了,不少人看了 10 遍 🤣

    2020-02-18
    1
  • 甘乐
    总结:
    1.xml中自定义bean中注入的BeanFactory是DefaultListableBeanFactory,是我们在创建ClassPathXmlApplicationContext时,构造函数再次创建的一个组合对象,即使他们的顶级接口都是BeanFactory,但是它们根本不是同一个对象
    创建组合对象是在
    org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory方法中的createBeanFactory()方法中明确创建了DefaultListableBeanFactory()
    2.在我们操作Bean(getBean())时,其实调用的都是组合对象的getBean()方法org.springframework.context.support.AbstractApplicationContext#getBean(java.lang.String)
    麻烦马老师看下我的总结有误么:)

    作者回复: 总结到位~

    2020-02-04
    1
  • 静水流深
    这是我看到过的最好的spring课程!

    作者回复: 感谢夸奖,我们一起加油~

    2020-02-04
    1
  • 写给三月
    第一遍有点难懂,

    作者回复: 慢慢来,Spring 确实很复杂,尤其是 BeanFactory 和 ApplicationContext 的细节,需要一定的记忆~

    2020-01-09
    1
  • Berry Wang
    下班回来又把昨天没看懂的地方看了一遍,真的感觉和某课网跟着小马哥学SpringBoot一样,刚开始听着费劲,再听一遍,好像有点意思,再来一遍,讲的都是好东西。同时也有点感觉可惜,这么好的课程购买的人不及同类课程的4分之1,哎。 不管怎么样,支持小马哥,2020继续和小马哥一起成长。

    作者回复: 感谢支持~

    2020-03-26
  • 陈天柱
    小马哥, 我已经不知道是第几遍来看SpringFreamwork编程思想了,感觉开始可以略微理解小马哥讲的了,原本以为自己比较笨,需要经常温故而知新,但发现评论区好多同学和我一样,都是反复来看好几遍。前2天买了小马哥的《SpringBoot编程思想》,发现里面好多地方涉及到SpringFreamwork的东西,干货满满,很少见到有老师可以这样抽吸剥茧地讲解一个知识,给小马哥点赞!

    作者回复: 感谢支持,作为分享者,我内心是非常感动的~

    2020-03-16
  • 醉梦了红尘
    老师,AbstractRefreshableApplicationContext.getBeanFacory();获取的是组合的对象DefaultListableBeanFactory,那么着了类是在那里set进去的呢?

    作者回复: 这个对象实际是由 org.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactory 方法生成

    2020-03-06
    1
  • jack Wong
    我想要的是上层的BeanFactory父类对象,但是却给我整合了一个DefaultListableBeanFactory给我,偷龙转凤说得过去嘛

    作者回复: 这个我反复提及 BeanFactory 几乎唯一的实现是 DefaultListableBeanFactory

    2020-03-06
  • 官沛
    BeanFactory和ApplicationContext的关系,从设计模式上讲,应该是代理模式吧?

    作者回复: 是的,ApplicationContext 是使用了代理模式,也使用了面门模式。

    2020-02-29
  • 杨杰
    applicationContext.getAutowireCapableBeanFactory() == userRepository.getBeanFactory()
    ApplicationContext里面getAutowireCapableBeanFactory()和userRepository.getBeanFactory()指向的BeanFactory是同一个。说明ApplicationContext只是聚合了BeanFactory,和userRepositoy里面指向的BeanFactory是同一个对象,而不是重新创建的?

    作者回复: 是的,就是这样~

    2020-02-16
    1
  • 飞翔
    老师 那到底谁是真正的spring ioc 容器? 是beanfactory嘛

    作者回复: IoC 实际容器是 BeanFactory 的实现

    2020-02-06
    1
  • 轻描淡写
    小马哥,为什么spring需要做这么一层代理实现呢,直接用ApplicationContext继承某个BeanFactory,然后提供新的能力的方式不好吗,是因为太耦合了吗,

    作者回复: 这样设计相对简单,将 ApplicationContext 作为 Facade 提供一个大而全的 API

    2020-01-29
  • Geek_f544a9
    小马哥的视频是我唯一不敢倍速播放的。。。

    作者回复: 那就是 1/2 速度呗

    2020-01-11
  • 皇影1993
    ApplicationContext是BeanFactory的子接口,那UserRepository的beanFactory自动装配的时候不就有多个类型为BeanFactory的bean了吗,一个是我们创建的ApplicationContext,另一个是它内部的DefaultListableBeanFactory,为什么没有报错,而是直接装配了内部的DefaultListableBeanFactory

    作者回复: 参考一下我给 aksonic 回复的内容,里面已经提到了,它是一种特殊的依赖注入。

    2020-01-10
  • wang
    有点像委派,直接调用底层BeanFactory实现类的方法

    作者回复: 是的,就是委派

    2020-01-09
收起评论
看过的人还看
玩转Spring全家桶

丁雪丰  平安壹钱包高级架构师,《Spring Boot实战》《Spring攻略》译者,InfoQ社区编辑

123讲 | 27071 人已学习

拼团 ¥99 原价 ¥129
Java核心技术面试精讲

杨晓峰  前Oracle首席工程师

43讲 | 44855 人已学习

拼团 ¥79 原价 ¥99
数据结构与算法之美

王争  前Google工程师

79讲 | 77001 人已学习

拼团 ¥79 原价 ¥99
MySQL实战45讲

林晓斌  网名丁奇,前阿里资深技术专家

48讲 | 48125 人已学习

拼团 ¥79 原价 ¥99