zoukankan      html  css  js  c++  java
  • Spring IoC 容器详解 [Spring][IoC 控制反转][BeanFactory][ApplicationContext]

    您的“关注”和“点赞”,是信任,是认可,是支持,是动力......

    如意见相佐,可留言。
    本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。

    1 Spring IoC 概述

    Spring IoC,全称 Spring Inversion of Control ,控制反转。

    IoC(控制反转) 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IoC 思想。

    简单理解,IoC(控制反转)就是控制权的转移,即把创建(new)对象的权利,反转给第三方Spring 框架去创建(new)。也就是把对象的创建的权利及对象的生命周期的管理过程交由Spring 框架来处理,从此在开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要时由 Spring 框架提供,这个由 Spring 框架管理对象创建和生命周期的机制称之为控制反转。而在创建对象的过程中 Spring 可以依据配置对对象的属性进行设置,这个过称之为依赖注入,也即 DI。

    示意如下所示:

    # 以前
    
    User user = new User();  // 由程序员控制 new 对象
    
    # 现在:
    
    现在 Spring 容器来创建对象
    User user = spring容器.get对象("容器中的唯一对象Id");
    

    2 Spring 提供两种 IoC 容器

    2.1 BeanFactory

    BeanFactory 是基础类型的 IoC 容器,它由 org.springframework.beans.facytory.BeanFactory 接口定义,并提供了完整的 IoC 服务支持。

    简单理解,BeanFactory 就是一个管理 Bean 的工厂,它主要负责初始化各种 Bean,并调用它们的生命周期方法。

    BeanFactory 接口有多个实现类,最常见的如下所示:

    • org.springframework.beans.factory.xml.XmlBeanFactory:它是根据 XML 配置文件中的定义装配 Bean 的。

    创建 BeanFactory 实例时,需要提供 Spring 所管理容器的详细配置信息,这些信息通常采用 XML 文件形式管理。

    其加载配置信息的代码具体如下所示:

    BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D://applicationContext.xml"));
    

    2.2 ApplicationContext

    ApplicationContext 接口的全路径为 org.springframework.context.ApplicationContext,它不仅提供了 BeanFactory 的所有功能,还添加了对 i18n(国际化)、资源访问、事件传播等方面的良好支持。

    ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。

    ApplicationContext 接口有两个常用的实现类,具体如下所示:

    • ClassPathXmlApplicationContext
      该类从类路径 ClassPath 中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体如下所示:

      # configLocation 参数:用于指定 Spring 配置文件的名称和位置,如 applicationContext.xml。
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);  
      
    • FileSystemXmlApplicationContext
      该类从指定的文件系统路径中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体如下所示:

      ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
      

      它与ClassPathXmlApplicationContext 的区别:
      在读取 Spring 的配置文件时,FileSystemXmlApplicationContext 不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,它可以获取类路径之外的资源,如"D:/workspaces/applicationContext.xml"

    使用 Spring 框架,当要创建 ApplicationContext 容器时,可以实例化任何一个类(ClassPathXmlApplicationContext 或 FileSystemXmlApplicationContext)。建议如下所示:

    • Java 项目中:通常会采用通过 ClassPathXmlApplicationContext 类实例化 ApplicationContext 容器的方式。
    • Web 项目中:是 Web 服务器完成实例化 ApplicationContext 容器的工作。Web 服务器实例化 ApplicationContext 容器通常使用基于 ContextLoaderListener 实现的方式,它只需要在 web.xml 中添加如下代码:
      <!--指定Spring配置文件的位置,有多个配置文件时,以逗号分隔-->
      <context-param>
      <param-name>contextConfigLocation</param-name>
      <!--spring将加载spring目录下的applicationContext.xml文件-->
      <param-value>
          classpath:spring/applicationContext.xml
      </param-value>
      </context-param>
      <!--指定以ContextLoaderListener方式启动Spring容器-->
      <listener>
       <listener-class>
         	 org.springframework.web.context.ContextLoaderListener
       </listener-class>
      </listener>
      

    3 BeanFactory 和 ApplicationContext 的异同

    • 异:如果 Bean 的某一个属性没有注入,则使用 BeanFacotry 加载后,在第一次调用 getBean() 方法时会抛出异常,而 ApplicationContext 则在初始化时自检,这样有利于检查所依赖的属性是否注入。
    • 同:BeanFactory 和 ApplicationContext 都是通过 XML 配置文件加载 Bean 的。

    介绍到这里,相信大家心里都有一个“理想对象”了吧?
    那就是 ApplicationContext,在日常开发中通常选择使用的都是这个接口,只有在系统资源较少时,才考虑一下 BeanFactory 哦。

    4 文章其他地址

    4.1 微信公众号:码农阿杰

    4.2 CSDN 博客

    5 参考资料

    5.1 spring

    5.2 Artifact Repository Browser

    5.3 Apache Commons

  • 相关阅读:
    asp.net membership 修改密码
    linq直接执行sql语句
    word-wrap,word-break,white-space,text-overflow的区别和用法
    ObjectQuery查询及方法
    HTML 标签的 enctype 属性
    【C#学习笔记】类构造函数使用
    【C#学习笔记】播放wav文件
    【C#学习笔记】类型转换
    【C#学习笔记】函数重载
    【C#学习笔记】读文件
  • 原文地址:https://www.cnblogs.com/manongajie/p/12853308.html
Copyright © 2011-2022 走看看