回忆一下ApplicationContext与BeanFactory的关系图

接下来讲述AppliactionContext实现的其他的接口与协议

Spring框架内部使用Resource接口作为所有资源的抽象和访问接口。 其中 classPathResource的一个特定类型的实现,代表的是位于Classpath中的实现。如果需要实现自定义的Resource,可以直接扩展AbstractResource抽象类,然后根据当前具体特征,覆盖相应的方法就可以了

ResourceLoader 用来查找和定位资源 ,该接口中最主要的是 Resource getResource(String location) 方法

实现类之一:

DefaultResourceLoader 定位资源规则:

1.查找[Classpath:]打开尝试构造ClasspathResource类资源并返回

2.通过URL定位资源

实现类之二:

FileSysetmResourceLoader 通过覆写了getResourceBPath()方法,使之从我恩件系统加载资源并以FileSystemResource类型返回。

ResourceLoader的扩展实现:ResourcePatternResolver :引入了新的协议前缀[ClassPath*:],同时支持批量查找Resource资源

Resource和ResourceLoader的关系

由于ApplicationContext实现过了ResourceLoader接口,所以ApplicationContext的任何实现都可以看作是一个ResourceLoader甚至ResourcePatternResolver,而这就是ApplicationContext支持Spring内统一资源加载策略的真相

tips:[ApplicationContext类型的容器可以自动识别Aware接口]

国际化信息支持:

Java中的国际化信息处理,主要设计两个类:Locale和Resourcebundle

Spring在Java的国际化支持的基础上,进一步抽象了国际化信息的访问接口即:MessageSource

ApplicationConetxt也实现了该接口,所以ApplicationContext现在也是一个MessageSource

在默认情况下,ApplicationContext将委派容器中的一个名称为messageSource的MessageSource接口实现类来完成该接口应该完成的职责,如果找不到,ApplicationContext内部会默认实例化一个不含任何内容的StaticMessageSource实例。

--可用的MessageSource实现:

1.StaticMessageSource 多用于测试

2.ResourceBundleMessageSource 基于标准的ResourceBundle实现的

3.ReloadableResourceBundleMessageSource,该类可以通过是设置cacheSeconds属性可以指定时间段,以定期刷新并检查底层的properties资源文件是否有变更。

ApplicationContext启动的时候,会自动识别容器中类型为MessageSourceAware的bean定义并将资深作为MessageSource注入相应对象实例中。

容器内部事件发布

Java提供了实现自定义时间发布的基础类:EventObject 和 EventListener 接口 所有的自定义时间类型可以通过扩展EventObject来实现,而事件的监听则扩展自EventListerner。通常情况下,我们会有一个时间发布者(EventPublisher)它本身作为事件源,会在合适的时间点,将相应事件发布给对应的事件监听器

ApplicationContext容器内部允许以ApplicationContextEvent的形式发布事件,容器内注册的ApplicationListener类型的bean会被ApplicationContext容器自动识别,他们负责监听容器内发布的所有ApplicationEvent类型的事件

Spring容器内默认提供的三个ApplicationEvent事件的实现:

ContextClosedEvent 容器即将关闭的时候发布的事件类型

ContextRefreshEvent 在初始化或者刷新的时候发布的事件类型

RequestHandledEvent Web请求处理后发布的事件,它有一个子类ServletRequestHandledEvent提供特定Servlet相关事件

ApplicationContext接口定义还继承了ApplicationEventPublisher接口,所以呢。ApplicationContext容器现在担当的就是时间发布者的角色。

在具体的逻辑处理中ApplicationContext把事件发布的功能全部委托给了ApplicationEventMulticaster来做,默认使用了SyncTaskExecutor进行事件发布,这些事件是同步顺序发布的。

ApplicationContext容器内的事件发布机制,主要用于单一容器内的简单消息通知和处理,并不适合分布式。多进程。多容器之间的时间通知。[虽然可以通过Spring的Remoting支持,但是相对与直接使用第三方技术,实现更为麻烦]

--要让我们的业务类支持容器内的事件发布,需要它又有ApplicationEventPublisher的事件发布支持,所以,需要为其注入publisher实例..两种方式

1.使用ApplicationEventPublisherAware接口

2.使用ApplicationContextAware接口[这个就不需要在说为什么了吧...]

Spring支持基于注解的依赖注入 [为什么AutoWired等注解可以生效]

我们可以提供一个Spring的Ioc容器使用的BeanPostProcessor自定义实现,让这个bean在实例化的过程中,来检查当前对象是否有@autowired标注的依赖需要注入...Spring已经提供了该实现:[AutowiredAnnotationBeanPostProcessor]

@Autowired是基于ByType

---使用JSR250标注依赖注入关系

@Resource是基于ByName

@postConstruct 和 @PreDestory

Spring 支持JSR250的BeanPostProcessor 实现类是 CommonAnnotationBeanPostProcessor

组件扫描<context:component-scan>的name-generator属性可以制定我们自己的BeanNameGenerator实现类来替换掉默认的BeanNameGenerator,也可以改变默认的Bean定义的名称生成规则。

王福强老师的《Spring揭秘》读后感-IOC容器之ApplicationContext相关相关推荐

  1. 王福强老师的《Spring揭秘》读后感-IOC容器之BeanFactory

    该代码基于Spring2.x 其中部分实现 在 Spring 4 中已经变化 但是基础的核心思想是不会变的... 直接上重点... 1.抽象的IOCProvider  这个抽象的理念 :用来管理bea ...

  2. 阿里P8架构师王福强大牛,[Spring boot揭秘]引领程序员成神之路

    前言: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配 ...

  3. 王福强谈微服务:系统化考虑交付效率,掌握技术“手感”

    2014年由Martin Fowler与James Lewis共同提出微服务开始,伴随着以Docker为代表的容器的兴起,微服务+容器时不时被当作一组话题被架构师们提及,既然微服务和容器技术拥有令人兴 ...

  4. 【科创人上海行】扶墙老师王福强:架构师创业要突破思维局限,技术人创业的三种模式,健康第一...

    与上千位科技创业者共同关注科创人的成长心路. 那些曾经在圈内小有名气.被称为"老师"的技术前辈们,他们如何跨越人生转型的鸿沟?经历了多少曲折?如今过得如何? 左耳朵耗子.高春辉.王 ...

  5. 王福强:一名架构师的自我修养

    本文作者为王福强.先后在花旗.阿里等金融和互联网企业担任技术专家和资深架构师.老王与21CTO社区创始人杜江(洛逸)是前同事.他在Java领域不断深耕积粮,终成『砖家』.他将跟大家探(chui)讨(n ...

  6. 挖财首席架构师王福强:架构设计中的6大关键点

    摘要:架构设计的重要性不言而喻,挖财首席架构师王福强日前在一个技术沙龙中分享了挖财架构设计中的6大关键点:系统层级分离:消息传递:异步化处理:信息存储,宁多勿缺:系统安全:存储冗余. 编者按:要开发出 ...

  7. Springboot揭秘-快速构建微服务体系-王福强-2016年5月第一次印刷

    JavaConfig项目: spring IOC有一个非常核心的概念--Bean.由Spring容器来负责对Bean的实例化,装配和管理.XML是用来描述Bean最为流行的配置方式.Spring可以从 ...

  8. 《Spring揭秘》——IOC梳理2(容器启动,bean生命周期)

    IoC容器背后的秘密 主要分为两个阶段:容器启动阶段.Bean实例化阶段. 容器启动阶段: 容器需要依赖某些工具类(BeanDefinitionReader)对加载的Configuration Met ...

  9. 第4章 Spring的IoC容器之BeanFactory(四)

    BeanFactory的XML之旅 bean的继承 假设我们某一天需要对FXNewsProvider使用继承进行扩展,那么可能会声明如下代码所示的子类定义: class SpecificFXNewsP ...

最新文章

  1. MySQL 批量插入:如何不插入重复数据?
  2. Greenplum Hadoop分布式平台大数据解决方案实战教程
  3. 【图像处理】数字图像处理之颜色
  4. 查询成绩小于85且是计算机的一项应用,查询练习2
  5. php 图片系统,Linger
  6. float position的测试案例
  7. unknown chromium error 400
  8. Android 8.0 功能和 API--day01
  9. LVDS之一_理解SerDes
  10. 二十六. Python基础(26)--类的内置特殊属性和方法
  11. 《大数据之路-阿里巴巴大数据实践》第三章 数据同步
  12. 信息检索1.3.学术搜索引擎--谷歌学术搜索引擎
  13. html怎么显示五线谱,CSS3 响应式乐谱 音乐符号 五线谱
  14. 使用电信光猫加路由器实现内网穿透,外网访问内网
  15. poco mysql 安装_linux 下 POCO 安装
  16. Kong 网关 | Rate Limiting 限流
  17. 用Dijkstra算法找到图上两点之间的最短路径
  18. zsh 及 oh-my-zsh 使用
  19. 互联网架构设计 (高并发高可用性)
  20. vijos 、洛谷 —— 珠心算测验(java实现)

热门文章

  1. 商城项目(五)整合Elasticsearch实现商品搜索
  2. android模拟器 uidump,解决Genymotion模拟器不能安装apk
  3. VLC-Android音画同步原理
  4. yolov3 指定gpu_GPU端到端目标检测YOLOV3全过程(中)
  5. Mac软件 装机必备 软件推荐
  6. 爱奇艺校招----回文素数(python)
  7. 2019.1.5【NOIP提高组】模拟B组 JZOJ 3058 火炬手
  8. Privacy Principles
  9. 记录下kurento在内网视频几秒延迟播放
  10. geekbench3 android,iQOO Neo3 GeekBench跑分曝光 预装Android 10系统