当前播放: 40 | 理解Spring的应用上下文
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程目录
第一章:初识Spring (4讲)
01 | Spring课程介绍
免费
02 | 一起认识Spring家族的主要成员
免费
03 | 跟着Spring了解技术趋势
免费
04 | 编写你的第一个Spring程序
免费
第二章:JDBC必知必会 (10讲)
05 | 如何配置单数据源
免费
06 | 如何配置多数据源
免费
07 | 那些好用的连接池们:HikariCP
08 | 那些好用的连接池们:Alibaba Druid
09 | 如何通过Spring JDBC访问数据库
10 | 什么是Spring的事务抽象(上)
11 | 什么是Spring的事务抽象(下)
12 | 了解Spring的JDBC异常抽象
免费
13 | 课程答疑(上)
14 | 课程答疑(下)
第三章:O/R Mapping实践 (9讲)
15 | 认识Spring Data JPA
16 | 定义JPA的实体对象
17 | 开始我们的线上咖啡馆实战项目:SpringBucks
18 | 通过Spring Data JPA操作数据库
19 | Spring Data JPA的Repository是怎么从接口变成Bean的
20 | 通过MyBatis操作数据库
21 | 让MyBatis更好用的那些工具:MyBatis Generator
22 | 让MyBatis更好用的那些工具:MyBatis PageHelper
23 | SpringBucks实战项目进度小结
第四章:NoSQL实践 (7讲)
24 | 通过Docker辅助开发
25 | 在Spring中访问MongoDB
26 | 在Spring中访问Redis
27 | Redis的哨兵与集群模式
28 | 了解Spring的缓存抽象
29 | Redis在Spring中的其他用法
30 | SpringBucks实战项目进度小结
第五章:数据访问进阶 (8讲)
31 | Project Reactor介绍(上)
32 | Project Reactor介绍(下)
33 | 通过Reactive的方式访问Redis
34 | 通过Reactive的方式访问MongoDB
35 | 通过Reactive的方式访问RDBMS
36 | 通过AOP打印数据访问层的摘要(上)
37 | 通过AOP打印数据访问层的摘要(下)
38 | SpringBucks实战项目进度小结
第六章:Spring MVC实践 (14讲)
39 | 编写第一个Spring MVC Controller
40 | 理解Spring的应用上下文
41 | 理解请求的处理机制
42 | 如何定义处理方法(上)
43 | 如何定义处理方法(下)
44 | Spring MVC中的视图解析机制(上)
45 | Spring MVC中的视图解析机制(下)
46 | Spring MVC中的常用视图(上)
47 | Spring MVC中的常用视图(下)
48 | 静态资源与缓存
49 | Spring MVC中的异常处理机制
50 | 了解Spring MVC的切入点
51 | SpringBucks实战项目进度小结
52 | 课程答疑
第七章:访问Web资源 (5讲)
53 | 通过RestTemplate访问Web资源
54 | RestTemplate的高阶用法
55 | 简单定制RestTemplate
56 | 通过WebClient访问Web资源
57 | SpringBucks实战项目进度小结
第八章: Web开发进阶 (9讲)
58 | 设计好的RESTful Web Service(上)
59 | 设计好的RESTful Web Service(下)
60 | 什么是HATEOAS
61 | 使用Spring Data REST实现简单的超媒体服务(上)
62 | 使用Spring Data REST实现简单的超媒体服务(下)
63 | 分布式环境中如何解决Session的问题
64 | 使用WebFlux代替Spring MVC(上)
65 | 使用WebFlux代替Spring MVC(下)
66 | SpringBucks实战项目进度小结
第九章:重新认识Spring Boot (8讲)
67 | 认识Spring Boot的组成部分
68 | 了解自动配置的实现原理
69 | 动手实现自己的自动配置
70 | 如何在低版本Spring中快速实现类似自动配置的功能
71 | 了解起步依赖及其实现原理
72 | 定制自己的起步依赖
73 | 深挖Spring Boot的配置加载机制
74 | 理解配置背后的PropertySource抽象
第十章:运行中的Spring Boot (11讲)
75 | 认识Spring Boot的各类Actuator Endpoint
76 | 动手定制自己的Health Indicator
77 | 通过Micrometer获取运行数据
78 | 通过Spring Boot Admin了解程序的运行状态
79 | 如何定制Web容器的运行参数
80 | 如何配置容器支持HTTP/2(上)
81 | 如何配置容器支持HTTP/2(下)
82 | 如何编写命令行运行的程序
83 | 了解可执行Jar背后的秘密
84 | 如何将Spring Boot应用打包成Docker镜像文件
85 | SpringBucks实战项目进度小结
第十一章:Spring Cloud及Cloud Native概述 (5讲)
86 | 简单理解微服务
87 | 如何理解云原生(Cloud Native)
88 | 12-Factor App(上)
89 | 12-Factor App(下)
90 | 认识Spring Cloud的组成部分
第十二章:服务注册与发现 (9讲)
91 | 使用Eureka作为服务注册中心
92 | 使用Spring Cloud Loadbalancer访问服务
93 | 使用Feign访问服务
94 | 深入理解服务发现背后的DiscoveryClient
95 | 使用Zookeeper作为服务注册中心
96 | 使用Consul作为服务注册中心
97 | 使用Nacos作为服务注册中心
98 | 如何定制自己的DiscoveryClient
99 | SpringBucks实战项目进度小结
第十三章:服务熔断 (7讲)
100 | 使用Hystrix实现服务熔断(上)
101 | 使用Hystrix实现服务熔断(下)
102 | 如何观察服务熔断
103 | 使用Resilience4j实现服务熔断
104 | 使用Resilience4j实现服务限流(上)
105 | 使用Resilience4j实现服务限流(下)
106 | SpringBucks实战项目进度小结
第十四章:服务配置 (7讲)
107 | 基于Git的配置中心(上)
108 | 基于Git的配置中心(下)
109 | 基于Zookeeper的配置中心
110 | 深入理解Spring Cloud的配置抽象
111 | 基于Consul的配置中心
112 | 基于Nacos的配置中心
113 | SpringBucks实战项目进度小结
第十五章:Spring Cloud Stream (4讲)
114 | 认识Spring Cloud Stream
115 | 通过Spring Cloud Stream访问RabbitMQ
116 | 通过Spring Cloud Stream访问Kafka
117 | SpringBucks实战项目进度小结
第十六章:服务链路追踪 (6讲)
118 | 通过Dapper理解链路治理
119 | 使用Spring Cloud Sleuth实现链路追踪
120 | 如何追踪消息链路
121 | 除了链路还要治理什么
122 | SpringBucks实战项目进度小结
123 | 结束语
40 | 理解Spring的应用上下文

40 | 理解Spring的应用上下文

丁雪丰
平安壹钱包高级架构师,《Spring Boot实战》《Spring攻略》译者,InfoQ社区编辑
123讲 123课时,1300分钟24878
单独订阅¥129
2人成团¥99
18
本节摘要

PDF 课件和源代码下载地址:

https://github.com/geektime-geekbang/geektime-spring-family

猜你喜欢

unpreviewunpreview

展开
登录 后留言

精选留言(30)

  • null
    #笔记#
    Glossory

    FooConfig.java:父上下文(parent application context)。
    applicationContext.xml:子上下文(child application context)。

    FooConfig.java 中定义两个 testBean,分别为 testBeanX(foo) 和 testBeanY(foo)。
    applicationContext.xml 定义了一个 testBeanX(bar)。

    委托机制:在自己的 context 中找不到 bean,会委托父 context 查找该 bean。

    ----------

    代码解释:
    fooContext.getBean("testBeanX"),在父上下文查找 testBeanX,命中直接返回 testBeanX(foo)。
    barContext.getBean("testBeanX"),在子上下文查找 testBeanX,命中直接返回 testBeanX(bar)。
    barContext.getBean("testBeanY"),在子上下文查找 testBeanY,未命中;委托父上下文查找,命中,返回 testBeanY(foo)。

    ----------

    场景一:
    父上下文开启 @EnableAspectJAutoProxy 的支持
    子上下文未开启 <aop: aspectj-autoproxy />
    切面 fooAspect 在 FooConfig.java 定义(父上下文增强)

    输出结果:
    testBeanX(foo) 和 testBeanY(foo) 均被增强。
    testBeanX(bar) 未被增强。

    结论:
    在父上下文开启了增强,父的 bean 均被增强,而子的 bean 未被增强。

    ----------
     
    场景二:
    父上下文开启 @EnableAspectJAutoProxy 的支持
    子上下文开启 <aop: aspectj-autoproxy />
    切面 fooAspect 在 applicationContext.xml 定义(子上下文增加)

    输出结果:
    testBeanX(foo) 和 testBeanY(foo) 未被增强。
    testBeanX(bar) 被增强。

    结论:
    在子上下文开启增强,父的 bean 未被增强,子的 bean 被增强。

    ----------

    根据场景一和场景二的结果,有结论:“各个 context 相互独立,每个 context 的 aop 增强只对本 context 的 bean 生效”。如果想将切面配置成通用的,对父和子上下文的 bean 均支持增强,则:
    1. 切面 fooAspect 定义在父上下文。
    2. 父上下文和子上下文,均要开启 aop 的增加,即 @EnableAspectJAutoProxy 或<aop: aspectj-autoproxy /> 的支持。
    2019-06-22
    37
  • shaohsiung
    一个spring应用可以存在多个web上下文,但是只有一个root上下文,这个例子中的fooctx和barctx都是applicationcontext,并将fooctx作为barctx的父容器是为了演示容器的层次关系,这样理解对吗老师?

    作者回复: 上下文可以有很多个,这个是我们自己决定的。我可以编程方式来控制。你说的没错,我这里只是为了演示上下文继承的一些坑。

    2019-03-16
    8
  • 码农Kevin亮
    老师我没听太明白,spring mvc 单独搞个ServletWebApplicationContext来管理servlet的bean的意义是什么?反过来问就是,假如都用RootWebApplicationContext来管理,会有什么问题?另外我也没听明白WebApplicationContext与ApplicationContext的区别
    2019-03-14
    6
  • $hell
    子容器可以感知父容器(有引用),父容器无法感知子容器

    [Aop支持]--[Aspect信息]--[同侧]:
    parentContext [关闭] Aop 支持----subContext [开启] Aop 支持并[托管] Aspect : 仅注册在子容器中的bean增强;
    parentContext [开启] Aop 支持----subContext [开启] Aop 支持并[托管] Aspect : 仅注册在子容器中的bean增强;因为父容器感知不到子容器中的 Aspect信息
    parentContext [开启] Aop 支持并[托管] Aspect--subContext [关闭] Aop 支持 : 仅注册在父容器中的bean增强,从子容器拿到的父容器bean是属于父容器的,会增强;
    parentContext [开启] Aop 支持并[托管] Aspect--subContext [开启] Aop 支持 : 注册在父\子容器中的bean都会增强;

    [Aop支持]--[Aspect信息]--[异侧]:
    parentContext [开启] Aop 支持----subContext [关闭] Aop 支持并[托管] Aspect : 父子容器中的bean都无增强; Aspect信息 无法被感知到
    parentContext [关闭] Aop 支持并[托管] Aspect----subContext [开启] Aop 支持 : 仅注册在子容器中的bean增强; 子容器可以感知到 Aspect信息

    结论:
    bean的注册容器开启了Aop支持,其次该注册容器能感知到Aspect信息,则该容器中的注册的bean不管被谁取用都会被增强.
    2019-07-18
    4
  • 碧雪天虹
    foo 和 bar 绕着晕, 改了一下代码, 不晕了
    @Configuration
    @EnableAspectJAutoProxy
    public class FooConfig {
        @Bean
        public TestBean testBeanX() {
            return new TestBean("parentX");
        }

        @Bean
        public TestBean testBeanY() {
            return new TestBean("parentY");
        }

        @Bean
        public FooAspect fooAspect() {
            return new FooAspect();
        }
    }


        <bean id="testBeanX" class="geektime.spring.web.context.TestBean">
            <constructor-arg name="context" value="childX" />
        </bean>


    hello parentX
    after hello()
    =============
    hello childX
    after hello()
    hello parentY
    after hello()

    作者回复: 发现你这是个好办法,我自己念foo和父都觉得会让人搞不清楚,当时像你这么机智就好了

    2019-04-28
    3
  • 锋芒
    既然fooContext是barContext的父级,按java继承的原理。 barContext 应该也均有父级的设置即 也能用父级的增强配置才对 ? 老师麻烦解惑一下。 谢谢

    作者回复: 这个继承和Java的继承没啥关系啊。父Context里的增强只能看到自己Context里的Bean,并看不到子Context的东西,所以也没法增强。

    2019-06-18
    2
  • Charles
    @EnableAspectJAutoProxy
    老师,该注解如果加在配置类上,只会对配置类内部的切面Bean生效;如果加在启动类上,会对整个工程中所有的切面Bean生效?可以这么理解吗?

    作者回复: 不是啊,如果是个单纯的SpringBoot应用程序,加在随便哪个配置类上就行了,Application那个类也是个配置类,大家都是一样的。我在这个例子里是在演示不同的上下文,这个注解其实就是帮忙配了些东西,它配在哪个上下文里,哪里就会有AOP的增强。

    2019-04-25
    2
  • shaohsiung
    老师,在Spring Boot中,如果我添加了一个配置类,并在这个配置类中装配了Bean,那么我们怎么知道这些Bean会被那个容器管理,web容器还是root容器
    2019-04-05
    2
  • Lee KouKuKing
    老师你好,请教几个问题,谢谢
    1、这个例子中的FooAspect中定义的AfterReturning切点是会作用到id为testBean开头的bean的所有方法吧?

    作者回复: 是的,testBean打头的

    2019-03-19
    1
    2
  • Senior6623
    老师,有一个疑问,同名Bean(fooAspect)为何不会报错?因为在不同上下文中吗?

    作者回复: 子上下文在使用时,里面的同ID Bean会覆盖父上下文里的那个Bean。

    2019-08-04
    1
  • Tarn
    老师,我在阅读源码的时候发现applicationContext的getBean方法是直接调用容器里beanfactory的getBean方法,并没有看见向父容器中查询bean的过程,而beanfactory的getBean方法则有一个向父beanfactory递归getbean方法的过程,那么是不是可以理解为父applicationcontext的实质就是父beanfactory?但是我也没有看见设置父application的方法中有将beanfactory从父applicationcontext提取出来的规程,只有一个merge方法,也看不太懂,所以还想请教一下老师子容器从父容器中获得bean的步骤,谢谢老师!

    作者回复: ApplicationContext这个接口本身就是extends了BeanFactory的,所以ApplicationContext就是BeanFactory。如果你去看ClassPathXmlApplicationContext,初始化时传入parent,最终是调用了setParent()方法,然后获取Bean时,resolveBean()方法在当前上下文没找到Bean定义时会去父上下文找的。

    2019-04-30
    1
  • 晴天
    老师讲讲springboot做了哪些改进,从而不需要再分别指定componentscan啊
    springboot中也有父子上下文吗
    2019-03-22
    1
  • 黄平
    为什么config配置的就是父上下文,而xml配置的就是子上下文呢?
    2019-12-11
  • 刘丹
    请问FooConfig类里的FooAspect这个bean为什么会影响类里另外2个bean(testBeanX、testBeanY)的切面?

    作者回复: 我写了@AfterReturning("bean(testBean*)"),那拦截到testBeanX和testBeanY就是应该的。

    2019-10-06
  • ace
    SpringBoot环境中只有一个容器-AnnotationConfigEmbeddedWebApplicationContext吧?
    2019-09-02
  • 王善鹏
    老师,FooConfig中的fooAspect() 函数的作用是什么

    作者回复: 通过@Bean注解配置了一个FooAspect类型的Bean

    2019-08-29
  • 不能如期而至
    运行老师的示例我的理解是:当切面是在父上下文中时,父上下文和子上下文中匹配的Bean都会被织入增强。但是当切面是在子上下文中时,只有子上下文中匹配的Bean会织入增强。 另外,如果没有设置父子上下文,则SpringBoot中默认只有一个上下文。 不知我理解的对不对。
    2019-08-19
  • york
    两个问题:
    1. bar context(作为foo context的子context)中声明的bean,为何在http://localhost:8080/actuator/beans里面是看不到的?
    2. 如果把bar context的配置,由xml方式改为annotation方式,如何通过代码指定foo context为其父context?

    作者回复: 1. 我们的两个ApplicationContext并不是/beans显示的,所以看不到
    2. 有setParent()方法,你可以试试

    2019-07-30
  • tinys
    SPRING CONTEXT MARK
    父子上下文基于委托机制.若子上下文找不到bean,才会委托父context来寻找bean.
    因此,
    父上下文中的bean的切入仅支持父context的bean,
    子上下文的bean只支持子context的bean.

    ----------
    引用某同学的语录
    代码解释:
    fooContext.getBean("testBeanX"),在父上下文查找 testBeanX,命中直接返回 testBeanX(foo)。
    barContext.getBean("testBeanX"),在子上下文查找 testBeanX,命中直接返回 testBeanX(bar),因为切面是在父context的,因此无aop.
    barContext.getBean("testBeanY"),在子上下文查找 testBeanY,未命中;委托父上下文查找,命中,返回 testBeanY(foo)。

    ----------
    2019-07-29
  • Fortune
    非常感谢老师的课程,有个疑问就是:这节课是不是类似的说明了,在spring中,有个全文上下文ApplicationContext,在配置文件的情况下,通过配置加载对于的xml文件,把bean注入到spring的Ioc里面,然后再mvc这块,有个webApplicationContext,这个负责来加载有关web请求的bean进入Ioc,本人小白,也很感谢老师带我们读了一下源码,真的受益匪浅哈。

    作者回复: 传统的Spring MVC工程的确是有两个上下文的,和你理解的差不多。

    2019-06-27
收起评论
看过的人还看
Java核心技术面试精讲

杨晓峰  前Oracle首席工程师

43讲 | 43409 人已学习

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

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

48讲 | 43528 人已学习

拼团 ¥79 原价 ¥99
Java并发编程实战

王宝令  资深架构师

50讲 | 15315 人已学习

拼团 ¥79 原价 ¥99
从0开始学架构

李运华  资深技术专家

59讲 | 39057 人已学习

¥99