转载自 https://www.cnblogs.com/chenbenbuyi/p/8166304.html

 上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期。业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协助了,就给Spring说,我想要个对象——于是Spring就很贴心的给你个对象。听起来似乎很简单,使用起来也不难,但是如果仅仅是这样的拿来主义,倒也洒脱,不用费什么脑子。。。可是,你就真的不关心,Spring是从哪里把对象给你的吗?

  如果你想要了解Spring深一些,而不仅仅是拿来用用,那么你就应该好好思考一下上诉问题,不然,这篇博文你还看个铲铲啊。。。你可以这样去思考:Spring既然要负责应用程序中那么多对象的创建管理,就像苹果要生产那么多的手机(对象)一样,肯定有一个专门搞对象的地方。苹果生产手机的地方叫工厂,比如富士康,但放在软件开发中,对于Spring搞对象的地方我们就不叫工厂了,而叫做容器。是的,容器的概念在java中你最熟悉的莫过于Tomcat了,它正是一个运行Servlet的web容器,而Spring要想实现依赖注入功能,就离不开对象生产的容器——如果没有容器负责对象的创建管理,你的程序代码只是喊要对象了,Spring也无处给你啊。实际上,容器是Spring框架实现功能的核心,容器不只是帮我们创建了对象那么简单,它负责了对象整个的生命周期的管理——创建、装配、销毁。关于Spring的这个容器你最常听闻的一个术语就是IOC容器。所谓IOC,是一种叫控制反转的编程思想,网上有很通俗易懂的总结,我就不胡乱阐述了。总之一句话,我的应用程序里不用再过问对象的创建和管理对象之间的依赖关系了,都让IOC容器给代劳吧,也就是说,我把对象创建、管理的控制权都交给Spring容器,这是一种控制权的反转,所以Spring容器才能称为IOC容器。不过这里要厘清一点:并不是说只有Spring的容器才叫IOC容器,基于IOC容器的框架还有很多,并不是Spring特有的。

  好了,终于把Spring的容器概念阐述的差不多了,但有什么卵用呢?光有容器你其实什么都干不了!你以为容器那么科幻,跟叮当猫面前的百宝袋一样,你想要啥它就给你啥?实际上,容器里面什么都没有,决定容器里面放什么对象的是我们自己,决定对象之间的依赖关系的,也是我们自己,容器只是给我们提供一个管理对象的空间而已。那么,我们怎么向容器中放入我们需要容器代为管理的对象呢?这就涉及到Spring的应用上下文了。什么是应用上下文呢,你可以简单的理解成就是将你需要Spring帮你管理的对象放入容器的那么一种。。一种。。额。。一种容器对象——是的,应用上下文即是Spring容器抽象的一种实现;而我们常见的ApplicationContext本质上说就是一个维护Bean定义以及对象之间协作关系的高级接口。额,听起来是不是很抽象拗口?那你再读一遍呢。。。这里,我们必须明确,Spring的核心是容器,而容器并不唯一,框架本身就提供了很多个容器的实现,大概分为两种类型:一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能;还有一种就是继承了BeanFactory后派生而来的应用上下文,其抽象接口也就是我们上面提到的的ApplicationContext,它能提供更多企业级的服务,例如解析配置文本信息等等,这也是应用上下文实例对象最常见的应用场景。有了上下文对象,我们就能向容器注册需要Spring管理的对象了。对于上下文抽象接口,Spring也为我们提供了多种类型的容器实现,供我们在不同的应用场景选择——

    ① AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;

    ② ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;

    ③ FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;

    ④ AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;

    ⑤ XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。

  有了以上理解,问题就很好办了。你只要将你需要IOC容器替你管理的对象基于xml也罢,java注解也好,总之你要将需要管理的对象(Spring中我们都称之问bean)、bean之间的协作关系配置好,然后利用应用上下文对象加载进我们的Spring容器,容器就能为你的程序提供你想要的对象管理服务了。下面,还是贴一下简单的应用上下文的应用实例:

  我们先采用xml配置的方式配置bean和建立bean之间的协作关系:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><bean id="man" class="spring.chapter1.domain.Man"><constructor-arg ref="qqCar" /></bean><bean  id="qqCar" class="spring.chapter1.domain.QQCar"/>
</beans>

  然后通过应用上下文将配置加载到IOC容器,让Spring替我们管理对象,待我们需要使用对象的时候,再从容器中获取bean就ok了:

public class Test {public static void main(String[] args) {//加载项目中的spring配置文件到容器
//        ApplicationContext context = new ClassPathXmlApplicationContext("resouces/applicationContext.xml");//加载系统盘中的配置文件到容器ApplicationContext context = new FileSystemXmlApplicationContext("E:/Spring/applicationContext.xml");//从容器中获取对象实例Man man = context.getBean(Man.class);man.driveCar();}
}

  以上测试中,我将配置文件applicationContext.xml分别放在项目中和任意的系统盘符下,我只需要使用相应的上下文对象去加载配置文件,最后的结果是完全一样的。当然,现在项目中越来越多的使用java注解,所以注解的方式必不可少:

//同xml一样描述bean以及bean之间的依赖关系
@Configuration
public class ManConfig {@Beanpublic Man man() {return new Man(car());}@Beanpublic Car car() {return new QQCar();}
}
public class Test {public static void main(String[] args) {//从java注解的配置中加载配置到容器ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class);//从容器中获取对象实例Man man = context.getBean(Man.class);man.driveCar();}
}

  自此,Spring容器和应用上下文就算阐述的差不多了,具体的技能点在今后的博文中会慢慢的给大家奉上。博主功力也不深厚,博文有阐述欠妥或者不准确的地方,欢迎大神大仙大侠们指正,陈某不胜感激。

Spring基础篇——Spring容器和应用上下文理解相关推荐

  1. Spring系列一:Spring基础篇

    有人说,"Java程序员都是Spring程序员",小叶秋不太赞成这个观点,但是这也可以看出Spring在Java世界里举足轻重的作用.今天叶秋学长带领小伙伴们一起进入Spring学 ...

  2. Spring基础篇:高级注解编程

    文章内容来自于B站孙哥说Spring 第一章:@Configuration 一:配置Bean替换XML细节 二:应用配置Bean工厂对象 三:配置Bean细节分析 1:整合Logback 三:@Com ...

  3. 基础篇--Web容器学习路径

    在开篇词里我提到要成长为一名高级程序员或者架构师,我们需要提高自己知识的广度和深度.你可以先突破深度,再以点带面拓展广度,因此我建议通过深入学习一些优秀的开源系统来达到突破深度的目的. 我会跟你一起在 ...

  4. 【Spring 基础篇三】属性注入与属性编辑器

         上篇我们了解了一下applicationContext.xml的两种注入方式,本篇我们来了解一下关于属性的注入以及操作.      在敲代码的过程中,我们很容易遇到这样的问题,比如一个Lis ...

  5. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  6. 【spring基础】spring 官方下载地址

    2019独角兽企业重金招聘Python工程师标准>>> SPRING官方网站改版后,建议都是通过 Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常 ...

  7. JS基础篇之作用域、执行上下文、this、闭包

    前言:JS 的作用域.执行上下文.this.闭包是老生常谈的话题,也是新手比较懵懂的知识点.当然即便你作为老手,也未必真的能理解透彻这些概念. 一.作用域和执行上下文 作用域: js中的作用域是词法作 ...

  8. docker学习-基础篇6-docker容器数据卷-使用dockerfile

    使用dockerfile进行数据绑定 根目录下 #根目录下(ls /的目录下)创建一个mydocker文件夹 mkdir mydocker#进入mydocker文件夹 cd mydocker#编辑并创 ...

  9. 顶级c程序员之路 基础篇 - 第一章 关键字的深度理解 number-1

    c语言有32个关键字,每个关键字你都理解吗? 今天出场的是: auto ,  register,  static,   extern 为什么他们会一起呢,说到这里不得不谈到c语言对变量的描述. c给每 ...

最新文章

  1. 关于端口聚合或端口聚合称呼的误区
  2. VMware Workstation 重启服务脚本 解决连不上ssh问题
  3. 以系统最高权限运行软件
  4. Numpy_构建列向量
  5. 对于出差的看法_我对于挑选背包的一些小建议
  6. python操作dom_Python Dom 的介绍和使用day1
  7. 数学、物理算法ActionScript实现(2)
  8. Linux centosVMware Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl
  9. 后悔!我早该把这1W字详解的 InnoDB 原理给你!
  10. 远控免杀专题(24)-CACTUSTORCH免杀
  11. windows中的凭据管理
  12. python软件-python 2.7官方版
  13. 最全的Magisk模块下载
  14. Gradle入门教程学习笔记
  15. 1. 无穷维空间的测度论-Wiener测度(二)
  16. 算法设计与分析 ——10-7课程总结
  17. 本科计算机专业学物理力学吗,想读完研就工作,应该选哪个方向,本科物理, - 考研 - 小木虫 - 学术 科研 互动社区...
  18. HTML动态超炫酷的404页面源码
  19. ubuntu18.04 vbox 虚拟机扩容、拷贝、删除快照备份
  20. 应用NMOS和晶体三极管作为基本开关管的相关知识

热门文章

  1. 逆向工程核心原理读书笔记-API钩取之隐藏进程(二)
  2. 【网络编程】之六、选择select
  3. TCP/IP TIME_WAIT状态原理
  4. strace 哇,好多系统调用
  5. 记一次OpenJDK替换java JDK
  6. Linux 写时复制机制原理
  7. JVM 堆内存溢出后,其他线程是否可继续工作?
  8. 混沌系列 | 其实制造“假死”很容易
  9. 二分法如何排查问题版本
  10. 云原生视频时代已开启,华为云准备好了