Spring源码分析-2 Spring的简单使用和原理分析

Posted 鮀城小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring源码分析-2 Spring的简单使用和原理分析相关的知识,希望对你有一定的参考价值。

导读:

  1. 案例分析Spring最基础的容器XmlBeanFactory
  2. 对比Spring基础容器XmlBeanFactory和Spring高级容器ApplicationContext
  3. 分析Spring的工作原理是怎样的,初步了解这一个过程

1. Spring基础容器XmlBeanFactory的简单使用

从一个简单的demo开始,作为Spring源码分析的入口,首先,在IDEA中创建一个简单的Maven工程,引入如下依赖:

        <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.2.6.RELEASE</version>
		</dependency>

众所周知,Spring其实就是一个容器,容器中装的就是一个个的bean。Spring的初衷就是想要让bean成为一个简单的java对象。这里我们创建一个Student类作为Spring的bean:

public class Student 

    private String name = "ruyuan";

    public String getName() 
        return name;
    

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

Student这个bean创建好之后,想要将其添加到Spring容器中。需要在Resource目录下,创建一个xml文件 applicationContext.xml ,然后在 applicationContext.xml 中通过bean 标签配置 Student类:

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="student" class="com.spring.entity.Student"></bean>
</beans>

可以看到,通过 bean 标签中的 class 属性,我们配置了 Student 类的全限定名,而 id 属性的值就是告诉 Spring 容器这个 bean 名称是什么,方便后续从 Spring 容器中获取这个 bean。

@SuppressWarnings("all")
public class BeanFactoryDemo 

    public static void main(String[] args) 
        XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
        Student student = (Student) beanFactory.getBean("student",Student.class);
        System.out.println(student.getName());
    

可以看到,首先通过 ClassPathResource 封装了 applicationContext.xml 配置文件,然后将 ClassPathResource 作为 XmlBeanFactory 的构造方法的参数创建 XmlBeanFactory,XmlBeanFactory 可以理解为就是 Spring 的容器,是用来存放 bean 的地方。

接着,从 XmlBeanFactory 容器中,获取名称为 student 的 bean,运行一下就可以在控制台上打印出“ruyuan”,Spring容器XmlBeanFactory最基础的使用也就是这样了。

2. XmlBeanFactory 和 ApplicationContext 的对比

在公司开发过程中,一般以ApplicationContext 作为Spring 的容器,而XmlBeanFactory 则比较陌生。这里可以将 XmlBeanFactory 理解为一个基础的 bean 容器,它的功能比较简单,而 ApplicationContext 相对于 XmlBeanFactory 而言算是一个高级的容器了

3. XmlBeanFactory 的工作原理分析

首先,通过ClassPathResource 将 applicationContext.xml 配置文件封装起来,我们可以知道的是,ClassPathResource 肯定会从 resource 目录下解析配置文件,从配置文件中解析 bean 标签,并获取 bean 标签上的 id 属性和 class 属性的值。

通过 class 属性的值即全限定名称,就可以通过反射创建 bean,也就是创建了一个 Student对象出来,然后再将 Student 对象放到 Spring 容器当中,Student 对象在容器中的名称为属性 id 的值,Spring 容器的初始化简单来说就是干这些事。

然后,当我们调用 getBean 方法时就会从 Spring 容器中加载 bean 了,Spring 会根据给定 bean 的名称到 Spring容器中获取bean,比如,demo中就是通过student这个名称,从Spring容器中获取Student对象。

以上,就是Spring的核心功能的简述。但,不管是配置文件的解析,还是从Spring容器中获取bean,每个步骤都是非常复杂的流程。

以上是关于Spring源码分析-2 Spring的简单使用和原理分析的主要内容,如果未能解决你的问题,请参考以下文章

spring源码分析之BeanfFactory

MyBatis结合Spring使用源码分析

Spring IOC 源码简单分析 01 - BeanFactory

Spring源码分析 之浅谈设计模式

Spring事务源码分析专题Mybatis的使用及跟Spring整合原理分析

Spring源码分析FactoryBean的使用