Spring 总览及 IOC 容器的使用 —— Spring 官方文档解读

Posted dragondove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 总览及 IOC 容器的使用 —— Spring 官方文档解读相关的知识,希望对你有一定的参考价值。

Spring 总览及 IOC 容器的使用 —— Spring 官方文档解读(一)

什么是 Spring?

spring 这个词在不同情况下有不同意义。可以指 Spring 框架本身,但更多地被用来表示 Spring 整个家族的产品。

设计理念

学习框架必须要知道它的设计理念,Spring 框架有着以下的理念:

  • Spring 让你在架构种的各个层面有更多的选择,并且允许你尽晚的做出决策。比如,你在项目完成后可以通过更改配置来切换持久层的提供者。
  • Spring 具有强大的灵活性,它不在意你是如何完成工作的,它尽可能多地支持不同的应用需求。
  • Spring 具有强大的向后兼容性。Spring 的更新都是精心设计的,而且它对 JDK 的版本要求也是经过精心挑选的,这让你很容易就能更新你的产品。
  • Spring 团队对 API 的设计十分谨慎,这使得这些 API 在很多版本种都是完全通用的,而且可以使用好几年。
  • Spring 本身的代码非常简洁,而且具有非常易于阅读的 javadoc,它是极少数只写有意义的代码的项目,而且它的包之间,没有循环依赖。

控制反转容器(IOC Container)

IOC 介绍

IOC 也被称为依赖注入(dependency injection (DI)),程序员通过设定构造参数、工厂方法的参数等手段来确立各个对象之间的关系,这样,当程序员创建 bean 的时候,相应的依赖会被容器自动的注入到 bean 中,不需要程序员在创建 bean 的时候手动新建那些对象。这使得依赖更容易被管理。(被称为控制反转是因为不再是程序员去将依赖手动注入到相应 bean 中,而是通过容器自动地注入)

org.springframework.beansorg.springframework.context 这两个包是 Spring IOC 容器地基础。接口 BeanFactory 提供了一种能够管理任何类型对象的高级配置机制。ApplicationContextBeanFactory 的一个子接口,它多出了这些功能:

  • 更容易与 Spring 的 AOP 进行集成
  • 消息资源处理(用于国际化)
  • 事件发布
  • 特定的 Context(例如 web 应用中的 WebApplicationContext

总而言之,BeanFactory 提供了基础的功能,而 ApplicationContext 提供了特定的高级功能,是 BeanFacotry 的超集。(通常只有在与其他框架整合的时候才会使用 BeanFactory

容器总览

org.springframework.context.ApplicationContext 接口代表了 Spring IOC 容器,它负责通过读取配置元素据来对 bean 进行实例化、组装、配置。元数据的编写方式有三种:XML,Java 注解或者 Java 代码。你可以通过它来构建复杂的对象间依赖关系。

Spring 提供了不少 ApplicationContext 的实现,在独立应用中,最常见的有 ClassPathXmlApplicationContextFileSystemXmlApplicationContext。XML 是最常用的编写元数据的格式。你也可以通过编写少量的 XML 配置使得它可以支持读取来自注解或者代码的元数据。

在大部分场景下,用户不用显示地实例化一个或多个 IOC 容器。

编写元数据配置并使用

通过上述的内容,我们可以知道 Spring IOC 容器是通过元数据来了解各个对象之间的关系的。最传统的编写元数据的方法为使用 XML 配置文件。(当然这不是唯一的方式,现在更多的人会使用注解或者代码来编写元数据)。当然,你也可以配合 AOP 来配置 IOC 管理之外的对象。(这部分将在后续内容出现。)

现在,我们来看下基于 XML 的元数据的基本编写方式:

<?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/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">
        <!-- id 属性用于指定该 bean 的名字,而 class 属性需要写入一个完整的 classname 来确定为那个类的对象,比如 top.dragondove.demo.bean.Hero -->
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>

编写完之后,我们该实例化这个容器并且获取容器中的内容了,下面是一个例子。

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
Hero dove = context.getBean("dove", Hero.class);
System.out.println(dove);

以上是 Spring 容器的简单使用,下一章节将会讲解更多的元数据配置内容及配置方式。本次内容的完整代码在下面列出,至于 Spring 项目的初始化可以直接使用 Spring Boot (采用官网的 spring boot initializr 即可,依赖全都不选即可):

// src/main/java/top/dragondove/demo/bean/Hero.java
package top.dragondove.demo.bean;

// 普通的 javabean
public class Hero 

    private String name;
    private Integer age;

    public String getName() 
        return name;
    

    public Integer getAge() 
        return age;
    

    public void setName(String name) 
        this.name = name;
    

    public void setAge(Integer age) 
        this.age = age;
    

    @Override
    public String toString() 
        return "Name: " + name + ", Age: " + age;
    
<!-- src/main/resources/applicationContext.xml -->
<?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/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 配置 bean 的元数据 -->
    <bean id="dove" class="top.dragondove.demo.bean.Hero">
        <property name="name" value="Dove" />
        <property name="age" value="18" />
    </bean>
</beans>
// src/main/java/top/dragondove/demo/DemoApplication.java
package top.dragondove.demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import top.dragondove.demo.bean.Hero;

public class DemoApplication 

    private static ApplicationContext context;

    public static void main(String[] args) 
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Hero dove = context.getBean("dove", Hero.class); // 获取容器中 id 为 dove 的对象并确定其类型为 Hero 类型。
        System.out.println(dove);
    

运行 DemoApplication 里的 main 方法即可看到效果。

以上是关于Spring 总览及 IOC 容器的使用 —— Spring 官方文档解读的主要内容,如果未能解决你的问题,请参考以下文章

Spring第二篇:Spring容器的基本使用及原理

spring IOC 分析及实现

Spring源码分析之-加载IOC容器

Spring学习笔记IOC容器及Spring配置详解

Spring基础IOC容器及常见注解

《Spring揭秘》---- IoC容器及Bean的生命周期