Spring容器和应用上下文

容器的概念在java中最熟悉的就是Tomcat了,它正是一个运行Servlet的web容器。而Spring要想实现依赖注入功能,就离不开对象生产的容器。容器是Spring框架实现功能的核心,容器不只是帮我们创建了对象那么简单,它负责了对象整个的生命周期的管理——创建、装配、销毁。

关于Spring容器的一个术语就是IOC容器。所谓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注解配置也罢,总之要将需要IOC容器管理的对象(bean)、bean之间的协作关系配置好,然后利用应用上下文对象加载进我们的Spring容器,容器就能为程序提供对象管理服务了。

<bean id="man" class="com.xxx.xxx.Man">
        <constructor-arg ref="person" />
</bean>
<bean  id="person" class="com.xxx.xxx.Person"/>

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

 //加载项目中的spring配置文件到容器
 //ApplicationContext context = new ClassPathXmlApplicationContext("resouces/applicationContext.xml");
 //加载系统盘中的配置文件到容器
 ApplicationContext context = new FileSystemXmlApplicationContext("C:/spring/applicationContext.xml");
 //从容器中获取对象实例
 Man man = context.getBean(Man.class);
 man.say();

以上测试中,配置文件applicationContext.xml分别放在项目中或任意的系统盘符下,只需要使用相应的上下文对象去加载配置文件。

使用注解配置的方式

@Configuration
public class ManConfig {
    @Bean
    public Man man() {
        return new Man(person());
    }
    @Bean
    public Person person() {
        return new Person();
    }
}

//从java注解的配置中加载配置到容器
ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class);
//从容器中获取对象实例
Man man = context.getBean(Man.class);
man.say();

发布于 2019-06-11 15:49