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

时间:2022-10-15 08:00:44

概括

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

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

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

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

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

探究

容器的概念

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

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

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

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

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

IOC容器的概念

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

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

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

值得注意的是:并不是说只有Spring的容器才叫IOC容器,基于IOC容器的框架还有很多,并不是Spring特有的

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容器是一个什么样的概念?有什么作用?应用上下文呢?