Spring源码学习--04(简单容器与高级容器)

目录

1. Spring 中的bean ,Bean的定义,创建bean的方式

2.Spring中的一等公民--Bean

3.容器初始化 主要脉络

4.Spring的简单容器

    4.1 BeanFactory 

4.2 ListableBeanFactory:可以批量列出工厂生产的实例信息。

 4.3AutowireCapableBeanFactory:

4.4 DefaultListableBeanFactory:第一个真正可以独立运行的IOC容器

4.5   ConfigurableBeanFactory(非重点接口)

4.6 ConfigurableListableBeanFactory  该接口整合了所有BeanFactory体系的二级接口

5.Spring高级容器

5.1.ApplicationContext

 5.2 它实现了EnvironmentCapable接口,

5.3它实现了ListableBeanFactory接口,

5.4它实现了HierarchicalBeanFactory接口,

5.5它实现了ResourcePatternResolver接口

5.6它实现了MessageSource,

5.7他实现了ApplicationEventPublisher,

5.8 常用实现

5.9ConfigurableApplicationContext     

5.10 Lifecycle

5.11   AbstractApplicationContext  Spring 高级容器中最重要的一个类 

6.Resource

6.1 EncodedResource

6.2 AbstractResource

6.3 ServletContextResource

6.4 ClassPathResource

6.5 FileSystemResource

6.6 选择正确的资源加载器

  7.ResourceLoader

  7.1DefaultResourceLoader

7.2 ResourcePatternResolver

7.3 和容器的关系  

8.BeanDefinitionReader

8.1AbstractBeanDefinitionReader



1. Spring 中的bean ,Bean的定义,创建bean的方式

   

 为了让Spring学习起来更加简单,先掌握核心接口和类

2.Spring中的一等公民--Bean

   

 

  Spring中bean的作用域主要有五个(最重要的是singleton(表示在Bean的生命周期中只会存在一个bean的实例),prototype(可以存在多个bean的实例))

  

 Spring创建Bean的三种方式的配置:

第一种:通过无参构造函数创建时候的bean类

 

第二种:通过静态工厂创建时候的bean类

第三种 :第三种通过实例工厂创建时候的bean类

3.容器初始化 主要脉络

BeanDefinition是一个接口:

Spring里面定义的Bean之间的继承关系,不是通过extends或者implements来实现的,而是通过在BeanDefinition里面设置parent来实现的。

  通用的BeanDefinition实现:

GenericBeanDefinition

4.Spring的简单容器

    4.1 BeanFactory 

     所有的IOC容器都要求实现BeanFactory这个接口

     容器的顶级接口:

&是什么意思呢?比如一个对象实现了FactoryBean接口,那么根据beanid获取到的实例的是getObject方法返回的实例,那么想要获取FactoryBean的实例,就需要转义,比如:

FactoryBean的本质也是Bean,不是用来注入用的,他的主要作用就是用来生成普通bean用的。

用法:

 

  Spring中的容器分为以BeanFactory(Spring用的)接口为核心的简单容器,和以ApplicationContext(开发者用的)接口为核心的高级容器,高级容器也是我们广泛使用的容器。

根据单一职责的原则,每个较顶层的接口职责都是比较单一的。

  

4.2 ListableBeanFactory:可以批量列出工厂生产的实例信息。

 

 4.3AutowireCapableBeanFactory:

 @Autowire标签最后就是调用这个接口的这个方法来实现自动装配的逻辑

Autowire自动装配的策略共五种:

 装配策略:默认使用的是根据类型进行装配

还有就是执行BeanPostProcessor的方法。

4.4 DefaultListableBeanFactory:第一个真正可以独立运行的IOC容器

  是整个Spring 加载的核心部分,是Spring注册及加载的默认实现。

他实现了BeanDefinitionRegistry bean Definition的注册接口,还有一个重要的成员变量 beanDefinitionMap,存储容器里所有已经注册了beanDefinition实例的载体。

 整个Spring容器中也只有两个地方定义了beanDefinitionMap

我们比较熟悉的XmlBeanFactory,就是对DefaultListableBeanFactory进行了继承,并扩展了一个XmlBeanDefinitionReader,XmlBeanDefinitionReader就是自定义的XML读取器,

Spring的默认实现类,抽象类 接口都放在support包的下面

4.5   ConfigurableBeanFactory(非重点接口)

 提供了在运行运行期间向容器注册单例实例bean的能力 

4.6 ConfigurableListableBeanFactory  该接口整合了所有BeanFactory体系的二级接口

 注意一下这个方法:void ignoreDependencyInterface(Class<?> ifc); 这个是忽略自动装配的方法,这个是忽略给定接口的自动配装。这样做的目的是什么?会产生什么效果呢?

如果A中依赖了B,那么Spring在获取A的bean的实例的时候,会自动初始化B,这也是Spring的一个重要的特性,有些情况下B不会被初始化,典型应用是通过其他方式解析Application 上下文注册依赖,比如BeanFactroy通过BeanFactoryAware进行注入的,其中一种情况就是Bean实现了BeanNameAware接口。

5.Spring高级容器

  高级容器都实现了ApplicationContext,通常简称为context或者上下文。可以看到ApplicationContext相较于BeanFactory提供了更多的扩展功能。简单来说就是ApplicationContext包含了BeanFactory的所有的功能。

5.1.ApplicationContext

  ApplicationContext比BeanFactory多了哪些功能呢?国际化信息支持,事件发布,统一资源加载策略等等。

 5.2 它实现了EnvironmentCapable接口,

该方法主要用来获取Environment,Environment指的就是容器的一些启动参数,比如java -jar 后面可以指定参数,那么就可以通过返回一个配置的Env,然后调用其相应的方法就可以获取参数。对于web容器来讲,我们可以通过Environment访问到Servlet的一些配置信息。

5.3它实现了ListableBeanFactory接口,

可以通过列表的方式来管理bean,

5.4它实现了HierarchicalBeanFactory接口

即可以支持多层级的容器来实现对每一层bean的管理。

5.5它实现了ResourcePatternResolver接口

 在java中,将不同来源的资源抽象成URL,通过注册不同的handler来处理不同来源的资源的读取逻辑,一般使用不同的前缀来识别,如:"file:" ,"jar:","http:" 等,但是没有定义相对于ClassPath或者ServletContext等资源的handler,URL也没有提供一些基本的方法,例如检查当前资源是否存在,检查当前资源是否可读等方法,所以Spring就自己抽象了一套资源结构,Recource接口封装底层资源,Recoure在封装读取底层资源后,就会交给BeanDefinitionReader来处理。

ResourcePatternResolver可以实现对资源文件的加载。,ResourcePatternResolver对ResourceLoader做了扩展,查找和定位资源是ResourceLoader的职责,但是他只能根据路径返回单个的Resource实例,

 

 而ResourceLoader可以批量查找资源。还引入了一种新的协议前缀classpath*:

 Resource资源的协议总共有这么多种。

 在ApplicationContext的子类中具体使用的Recource实现类是PathMatchingResourcePatternResolver,

 PathMatchingResourcePatternResolver的构造函数的参数类型是ResourceLoader,而AbstractApplicationContext继承了DefaultResourceLoader,所以上面传了一个this

 PathMatchingResourcePatternResolver里面持有的ResourceLoader的默认实现是DefaultResourceLoader

5.6它实现了MessageSource

能实现一些国际化的功能。

java中处理国际化信息主要通过两个类java.util.Locale,java.util.ResourceBundle,按照规定properties文件的类容是ISO-8859-1编码的,所以中文应该使用native2ascii工具转码。

5.7他实现了ApplicationEventPublisher,

具备事件发布的能力。

5.8 常用实现

         

对于web容器来讲:

      

  两类高级容器的共性:

      refresh()方法:可以看做是IOC容器的启动方法,完成容器的初始化,配置的解析,

     

      

5.9ConfigurableApplicationContext     

ApplicationContext都是get类型的方法,不可以配置,但是我们使用的context通常都是可以配置的,所以需要子接口来赋予其配置能力,ConfigurableApplicationContext就是这样的一个接口,可以设置一些属性值了

5.10 Lifecycle

      Lifecycle 接口主要对容器生命周期的管理,Closeable接口主要用于在关闭容器的时候关闭相关的资源。

5.11   AbstractApplicationContext  Spring 高级容器中最重要的一个类 

     主要的功能有容器工厂的处理,事件的发送与广播,监听器的注册,容器初始化操作的refresh方法,getBean方法的实现等等

模板方法模式:

6.Resource

   

  在java中资源会被抽象成URL,Spring将资源抽象成Resource, 有对资源的基本操作,本身不提供资源访问的实现,具体的实现由该接口的实现类来实现,不同资源访问的策略不一样。

                       

6.1 EncodedResource

主要实现对资源文件的编码操作,当我们给资源使用编码属性后,Spring会使用相应的编码作为输入流的编码。

6.2 AbstractResource

    提供了对Resource接口大部分方法的公共实现。如果想要实现自定义的Resource,那就应该实现AbstractResource。

6.3 ServletContextResource

 为访问web容器中上下中文资源而设计的类。负责web引用程序根路径的相对路径加载资源,支持以流和URL的形式访问,可以访问war,jar包中的资源。

6.4 ClassPathResource

   主要访问类路径下的资源,对于web应用来说,可自动搜索classes路径下的资源文件

6.5 FileSystemResource

  相对于前面的支持写操作,能编辑文件。

6.6 选择正确的资源加载器

   不显示使用资源的实现类,仅通过资源地址的特殊标识符就能访问资源。

  

    

  

  7.ResourceLoader

   

       

      根据资源的路径返回资源加载的实例:

  7.1DefaultResourceLoader

这里用到的是策略模式,策略接口就是Resource,然后他有几个策略的实现子类,即策略类:ServletContextResource,ClassPathResource,FileSystemResource,然后通过DefaultResourceLoader来决定具体返回是哪一个策略。

7.2 ResourcePatternResolver

支持多个路径匹配模式返回多个实例。

实现:PathMatchingResourcePatternResolver

7.3 和容器的关系  

   这也是高级容器支持加载资源的原因

之前说过ApplicationContext实现了ResourcePatternResolver,所以他的实例可以看成是ResourceLoader的实例。

8.BeanDefinitionReader

    

   ResourcePatternResolver是加载资源的利器,但是利器也要配上好的使用者。这个使用者就是BeanDefinitionReader,资源读取器将配置信息解析成一个个的BeanDefinition,BeanDefinitionReader读取BeanDefinition,并且借助一个BeanDefinitionRegistry的注册器将其注册到容器里面。

   

  主要加载beanDefinition,将资源文件转换成BeanDefinition

 里面有个方法是获得 BeanDefinitionRegistry,BeanDefinitionRegistry这个对象是将BeanDefinition注册到BeanDefinition的注册表中,

8.1AbstractBeanDefinitionReader

   他实现了BeanDefinitionReader的公共处理逻辑,

XML加载成

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值