转: 完全理解 Spring 容器和应用上下文

本文由 简悦 SimpRead 转码, 原文地址 https://mp.weixin.qq.com/s/o11jVTJRsBi998WlgpfrOwjava

有了 Spring 以后,经过依赖注入的方式,咱们的业务代码不用本身管理关联对象的生命周期。业务代码只须要按照业务自己的流程,走啊走啊,走到哪里,须要另外的对象来协助了,就给 Spring 说,我想要个对象——因而 Spring 就很贴心的给你个对象。程序员

听起来彷佛很简单,使用起来也不难,可是若是仅仅是这样的拿来主义,倒也洒脱,不用费什么脑子。。。但是,你就真的不关心,Spring 是从哪里把对象给你的吗?web

若是你想要了解 Spring 深一些,而不只仅是拿来用用,那么你就应该好好思考一下上诉问题,否则,这篇博文你还看个铲铲啊。。。spring

你能够这样去思考:Spring 既然要负责应用程序中那么多对象的建立管理,就像苹果要生产那么多的手机(对象)同样,确定有一个专门搞对象的地方。苹果生产手机的地方叫工厂,好比富士康,但放在软件开发中,对于 Spring 搞对象的地方咱们就不叫工厂了,而叫作容器。编程

是的,容器的概念在 java 中你最熟悉的莫过于 Tomcat 了,它正是一个运行 Servlet 的 web 容器,而 Spring 要想实现依赖注入功能,就离不开对象生产的容器——若是没有容器负责对象的建立管理,你的程序代码只是喊要对象了,Spring 也无处给你啊。微信

实际上,容器是 Spring 框架实现功能的核心,容器不仅是帮咱们建立了对象那么简单,它负责了对象整个的生命周期的管理——建立、装配、销毁。app

关于 Spring 的这个容器你最常听闻的一个术语就是 IOC 容器。所谓 IOC,是一种叫控制反转的编程思想,网上有很通俗易懂的总结,我就不胡乱阐述了。总之一句话,个人应用程序里不用再过问对象的建立和管理对象之间的依赖关系了,都让 IOC 容器给代劳吧,也就是说,我把对象建立、管理的控制权都交给 Spring 容器, 这是一种控制权的反转,因此 Spring 容器才能称为 IOC 容器。框架

不过这里要厘清一点:并非说只有 Spring 的容器才叫 IOC 容器,基于 IOC 容器的框架还有不少,并非 Spring 特有的。dom

好了,终于把 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 之间的协做关系:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">


        
    
    

而后经过应用上下文将配置加载到 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 {
    @Bean
    public Man man() {
        return new Man(car());
    }
    @Bean
    public 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 容器和应用上下文就算阐述的差很少了,具体的技能点在从此的博文中会慢慢的给你们奉上。

原文连接:www.cnblogs.com/chenbenbuyi

****推荐程序员必备微信号 ****

**程序员内参**
微信号:

programmer0001

**推荐理由:**

在这里,咱们分享程序员相关技术,职场生活,行业热点资讯。不按期还会分享 IT 趣文和趣图。这里属于咱们程序员本身的生活,工做和娱乐空间。

 ▼长按下方↓↓↓二维码识别关注
![](https://mmbiz.qpic.cn/mmbiz_jpg/jNmCBexQlC7grRGuAvlTrQKGNVEu7zySj3P6YxicNaicwVnweAeV6ROWsp10kHYj0jn7EhRBbQa60gzHYmloVXkw/640?wx_fmt=jpeg)
相关文章
相关标签/搜索