SpringIOC容器源码分析(一)ApplicationContext概述

参考自:https://javadoop.com/post/spring-ioc

首先是一个最基本的启动Spring容器的例子:

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationfile.xml");
}

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationfile.xml");
见名知意,也就是从ClassPath中寻找xml配置文件,并根据其xml的内容创建ApplicationContext对象。

Spring除了通过ClassPath寻找xml的方式,还提供了另外两种方式进行创建ApplicationContext。

  • FileSystemXmlApplicationContext:其构造函数需要一个xml配置文件的系统中的路径
  • AnnotationConfigApplicationContext:基于注解来使用的,它不需要配置文件,采用 java 配置类和各种注解来配置,是比较简单的方式

以下是一个ApplicationContext的继承结构:
SpringIOC容器源码分析(一)ApplicationContext概述_第1张图片
可以看到无论是ClassPathXmlApplicationContext还是FileSystemXmlApplicationContext亦或是AnnotationConfigApplicationContext,追本朔源,都继承自ApplicationContext。

而本文主要采用ClassPathXmlApplication为例进行分析。

废话不多说,接下来是一个简单的IOC例子。
首先定义一个接口:

public interface MessageService {
    String getMessage();
}

定义该接口实现类:

public class MessageServiceImpl implements MessageService {

    public String getMessage() {
        return "hello world";
    }
}

接下来在resources目录下创建xml配置文件:


<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">

    <bean id="messageService" class="com.xxx.MessageServiceImpl"/>
beans>

准备工作完成,接下来我们就可以运行了:

public class App {
    public static void main(String[] args) {
        // 用我们的配置文件来启动一个 ApplicationContext
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
        // 从 context 中取出我们的 Bean,而不是用 new MessageServiceImpl() 这种方式
        MessageService messageService = context.getBean(MessageService.class);
        // 输出: hello world
        System.out.println(messageService.getMessage());
    }
}

以上这个简单的例子说明了ApplicationContext创建过程中,会负责创建Bean实例,往各个Bean中注入依赖等。

BeanFactory简介

BeanFactory,见名知意,也就是创建Bean的工厂,它负责生产和管理各个bean实例。之前的ApplicationContext其实就是一个BeanFactory,若形象一点来描述它们的关系,可以把ApplicationContext看作是汽车,把BeanFactory看作是发动机。

SpringIOC容器源码分析(一)ApplicationContext概述_第2张图片
该继承结构的重点在于:

  1. ApplicationContext继承了ListableBeanFactory,这个Listable的意思就是通过这个接口,我们可以获取多个Bean,通过该结构可以发现,最顶层 BeanFactory 接口的方法都是获取单个 Bean 的。
  2. ApplicationContext继承了HierarchicalBeanFactory,Hierarchical也就是说我们可以在应用中启用多个BeanFactory,然后可以将各个BeanFactory设置为父子关系。
  3. AutoWireCapableBeanFactory,autowired这个注解想必用过spring的都很熟悉,它就是用于装配Bean的。但是继承结构中发现,ApplicationContext并没有继承它,但不用担心,虽然没有继承,但是在ApplicationContext接口中定义了一个getAutowireCapableBeanFactory() 方法会对其进行组合。
  4. ConfigurableListableBeanFactory也是一个特殊的接口,特殊之处在于它继承了第二层所有的三个接口,而 ApplicationContext 没有。这点之后会用到。

你可能感兴趣的:(SpringCore)