概括

Spring的核心就是容器,容器是类似工厂的地方,负责创建、管理、销毁程序执行过程中需要的Bean对象。

容器就是我们负责创建、管理、销毁程序执行过程中使用到的Bean对象的。

上下文就相当于执行程序的一个环境,同时用来存储一些变量等,用来给程序的执行提供支持、存储、记忆。

例如Tomcat,是servlet的web容器(同样负责了对象的整个生命周期)。而上下文就和你的大脑一样,用来存储记忆。

什么是应用上下文呢,应用上下文即是Spring容器抽象的一种实现。简单的理解成就是将你需要Spring帮你管理的对象放入容器的那么一种容器对象。

探究

容器的概念

在Spring中,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期。

业务代码只需要按照业务本身的流程,执行到一个需要另外的对象来协助的时候,就向Spring要这个对象——然后Spring就从自己的容器中拿出这个对象给你。

Spring既然要负责应用程序中那么多对象的创建管理,就要提供一个地方来管理这些对象。就像苹果生产手机的地方叫工厂,比如富士康,但放在软件开发中,对于Spring管理对象的地方我们就不叫工厂了,而叫做容器

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

实际上,。

IOC容器的概念

所谓IOC,是一种叫控制反转的编程思想。

这种思想说的是:我们在程序里不用再过问对象的创建和管理对象之间的依赖关系了,都让IOC容器给代劳吧

我们把对象创建、管理的控制权都交给Spring容器(由我们自己在对象中主动控制去直接获取依赖对象,也就是正转。而反转呢则是由容器来完成创建及注入依赖对象),这是一种控制权的反转,所以Spring容器才能称为IOC容器。

Spring应用上下文的概念

实际上,Spring容器里面什么都没有,决定容器里面放什么对象的是我们自己,决定对象之间的依赖关系的,也是我们自己,容器只是给我们提供一个管理对象的空间而已。

那么,我们怎么向容器中放入我们需要容器代为管理的对象呢?这就涉及到Spring的应用上下文了。

划重点:应用上下文是一个帮我们管理对象的对象

也可以理解为spring容器抽象的一种实现,有了上下文对象,我们就能向容器注册需要Spring管理的对象了.因此ApplicationContext是一维护Bean定义以及对象之间协作关第的高级接口.

Spring框架本身就提供了很多个容器的实现,大概分为两种类型,例如:

  • BeanFactory,最简单的容器,只能提供基本的DI功能)

  • 继承了BeanFactory后派生而来的,能提供更多企业级的服务,例如解析配置文本信息等等,这也是应用上下文实例对象最常见的应用场景。

对于上下文抽象接口,Spring也为我们提供了多种类型的容器实现,供我们在不同的应用场景选择:

  • AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;
  • ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;
  • FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载
  • AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;
  • XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。

我们可以通过以上几种方式来配置bean和建立bean之间的协作关系,然后通过上下文对象将配置加载到ioc容器,让Spring帮我们管理对象,带我们需要使用对象的时候,再从容器中获取bean就可以了。

下面,贴一下简单的应用上下文的应用实例:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

public class ContextTest {

    //同xml一样描述bean以及bean之间的依赖关系
    @Configuration
    static class ManConfig {
        @Bean
        public Man man() {
            return new Man(car());
        }

        @Bean
        public Car car() {
            return new Car();
        }
    }

    static class Man {
        public Man(Car car) {
        }

        public void driveCar() {
            System.out.println("开车");
        }
    }

    static class Car {

    }

    public static void main(String[] args) {
        //从java注解的配置中加载配置到容器
        ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class);
        //从容器中获取对象实例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}

运行结果,发现创建了三个Bean:

场景应用:Spring容器是一个什么样的概念?有什么作用?应用上下文呢?-LMLPHP

10-15 07:30