zoukankan      html  css  js  c++  java
  • 一头扎进Spring之---------Spring核心容器----------

    1.什么是 IOC/DI? 

     IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。 
      DI(Dependency Injection)依赖注入:就是指对象是被动接受依赖类而不是自己主动去找,换句话说 
    就是指对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它。

    我们自己如何设计一个IOC容器,会有哪些需要思考呢? 
    1. 对象和对象关系怎么表示? 
    可以用 xml,properties 文件等语义化配置文件表示。 
    2. 描述对象关系的文件存放在哪里? 
    可能是 classpath,filesystem,或者是 URL 网络资源,servletContext 等。

    有了配置文件,还需要对配置文件解析。 
    不同的配置文件对对象的描述不一样,如标准的,自定义声明式的,如何统一?在内部需要有一个统一 
    的关于对象的定义,所有外部的描述都必须转化成统一的描述定义。 
    如何对不同的配置文件进行解析?需要对不同的配置文件语法,采用不同的解析器。

    2.Spring 核心容器体系结构

    (1) BeanFactory

      

      其中 BeanFactory 作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory有三个直接的子类:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。 
    但是从上图中我们可以发现最终的默认实现类是DefaultListableBeanFactory,他实现了所有的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。例如ListableBeanFactory接口表示这些Bean是可列表的,而 HierarchicalBeanFactory表示的是这些Bean是有继承关系的,也就是每个Bean 有可能有父Bean。AutowireCapableBeanFactory接口定义 Bean 的自动装配规则。这四个接口共同定义了Bean的集合、Bean之间的关系、以及 Bean行为.

      最基本的 IOC 容器接口 BeanFactory

      

      //对 FactoryBean 的转义定义,因为如果使用 bean 的名字检索 FactoryBean 得到的对象是工厂生成的对象, //如果需要得到工厂本身,需要转义

    String FACTORY_BEAN_PREFIX = "&";
    

      //根据 bean 的名字,在 IOC 容器中获取 bean 实例

    Object getBean(String name) throws BeansException;
    

      //根据 bean 的名字和 Class 类型来得到 bean 实例,增加了类型安全验证机制。

    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    

      /根据 bean  Class 类型来得到 bean 实例

    <T> T getBean(Class<T> requiredType) throws BeansException;
    

      //根据名字和参数 在IOC容器中获取bean的实例

    Object getBean(String name, Object... args) throws BeansException;
    

      //提供对 bean 的检索,看看是否在 IOC 容器有这个名字的 bean

    boolean containsBean(String name);
    

      //根据 bean 名字得到 bean 实例,并同时判断这个 bean 是不是单例

    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    

      

    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    

      

    boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
    

      //得到Bean实例的Class

    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    

      //得到 bean 的别名,如果根据别名检索,那么其原名也会被检索出来

    String[] getAliases(String name);
    

      

    在 BeanFactory 里只对 IOC 容器的基本行为作了定义,根本不关心你的 Bean 是如何定义怎样加载的。 
    正如我们只关心工厂里得到什么的产品对象,至于工厂是怎么生产这些对象的,这个基本的接口不关心。

      而要知道工厂是如何产生对象的,我们需要看具体的IOC容器实现,Spring 提供了许多 IOC 容器的实现。比如XmlBeanFactory,ClasspathXmlApplicationContext 等。其中XmlBeanFactory就是针对最基本的IOC容器的实现,这个 IOC 容器可以读取 XML 文件定义的 BeanDefinition(XML 文件 
    中对 bean 的描述),如果说XmlBeanFactory是容器中的屌丝,ApplicationContext 应该算容器中的高帅富.不过在Spring5.0中XmlBeanFactory已经标志为废弃。 
      ApplicationContext是Spring提供的一个高级的IOC容器,它除了能够提供 IOC 容器的基本功能外,还为用户提供了以下的附加服务。

    从 ApplicationContext 接口的实现,我们看出其特点: 
    1.支持信息源,可以实现国际化。(实现 MessageSource 接口) 
    2.访问资源。(实现 ResourcePatternResolver 接口) 
    3.支持应用事件。(实现 ApplicationEventPublisher 接口)

    已知所有子类的接口

    1、ApplicationContext

    2、AutowireCapableBeanFactory

    3、ConfigurableApplicationContext

    4、ConfigurableBeanFactory

    5、ConfigurableListableBeanFactory

    6、ConfigurablePortLetApplicationContext

    7、ConfigurableApplecationContext

    8、HierarchicalBeanFactory

    9、ListableBeanFactory

    10、WebApplicationContext

    已知所有的实现类

    1、AbstractApplicationContext

    2、AbstractAutowireCapableBeanFactory

    3、AbstractBeanFactory

    4、AbstractRefreshableApplicationContext

    5、AbstractRefreshableConfigApplicationContext

    6、AbstractRefreshablePortletApplicationContext

    7、AbstractRefreshableWebApplicationContext

    8、AbstractXmlapplicationContext

    9、AnnotationConfigApplicationContext

    10、AnnotationConfigWebApplicationContext

  • 相关阅读:
    CPU,MPU,MCU,SOC,SOPC联系与差别
    中央处理器
    手机CPU
    手机CPU天梯图2018年5月最新版
    Ubuntu输入法切换问题
    说说C与汇编之间的互相联系(转)
    MDK972-EK开发板裸调试设置和裸机程序烧写(转)
    来,打一下五笔的字根表
    64位debian系统下安装inodeClient
    计算机网络——链路层协议
  • 原文地址:https://www.cnblogs.com/hanxue112253/p/9539481.html
Copyright © 2011-2022 走看看