目录
1. Spring 中的bean ,Bean的定义,创建bean的方式
4.2 ListableBeanFactory:可以批量列出工厂生产的实例信息。
4.3AutowireCapableBeanFactory:
4.4 DefaultListableBeanFactory:第一个真正可以独立运行的IOC容器
4.5 ConfigurableBeanFactory(非重点接口)
4.6 ConfigurableListableBeanFactory 该接口整合了所有BeanFactory体系的二级接口
5.4它实现了HierarchicalBeanFactory接口,
5.5它实现了ResourcePatternResolver接口
5.7他实现了ApplicationEventPublisher,
5.9ConfigurableApplicationContext
5.11 AbstractApplicationContext Spring 高级容器中最重要的一个类
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加载成