ClassPathXmlApplicationContext源码分析

ClassPathXmlApplicationContext源码解读

入口函数

通过ClassPathXmlApplicationContext类构造方法启动父类AbstractApplicationContext的函数refresh方法

ClassPathXmlApplicationContext源码:

package org.springframework.context.support;?import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.Resource;import org.springframework.lang.Nullable;import org.springframework.util.Assert;?public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext {    @Nullable    private Resource[] configResources;?    public ClassPathXmlApplicationContext() {    }?    public ClassPathXmlApplicationContext(ApplicationContext parent) {        super(parent);    }?    public ClassPathXmlApplicationContext(String configLocation) throws BeansException {        this(new String[]{configLocation}, true, (ApplicationContext)null);    }?    public ClassPathXmlApplicationContext(String... configLocations) throws BeansException {        this(configLocations, true, (ApplicationContext)null);    }?    public ClassPathXmlApplicationContext(String[] configLocations, @Nullable ApplicationContext parent) throws BeansException {        this(configLocations, true, parent);    }?    public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh) throws BeansException {        this(configLocations, refresh, (ApplicationContext)null);    }?    public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, @Nullable ApplicationContext parent) throws BeansException {        super(parent);        this.setConfigLocations(configLocations);        if (refresh) {            this.refresh();        }?    }?    public ClassPathXmlApplicationContext(String path, Class<?> clazz) throws BeansException {        this(new String[]{path}, clazz);    }?    public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz) throws BeansException {        this(paths, clazz, (ApplicationContext)null);    }?    public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz, @Nullable ApplicationContext parent) throws BeansException {        super(parent);        Assert.notNull(paths, "Path array must not be null");        Assert.notNull(clazz, "Class argument must not be null");        this.configResources = new Resource[paths.length];?        for(int i = 0; i < paths.length; ++i) {            this.configResources[i] = new ClassPathResource(paths[i], clazz);        }?        this.refresh();    }?    @Nullable    protected Resource[] getConfigResources() {        return this.configResources;    }}?

ClassPathXmlApplicationContext(String configLocation) 一般使用这个方法,传入一个string类型的xml文件名,通过xml配置文件指定特定的组件,实例化到bean工厂里,即DefaultSingletonBeanRegistry 下的Map集合里

ClassPathXmlApplicationContext(String... configLocations):可传入多个xml,装配到spring,bean工厂

public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh) :传入String数组

@Test    public void TestXmlBean(){        ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("classpath:xmlRegBean.xml");        Animal cat =context.getBean("cat", Cat.class);        cat.getName();    }?    @Test    public void TestMultiXml(){            ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("classpath:xmlRegBean.xml","classpath:xmlRegBean2.xml");            Animal cat =context.getBean("cat", Cat.class);            cat.getName();            System.out.println(cat);            Animal cat2 =context.getBean("cat2", Cat.class);            cat2.getName();            System.out.println(cat2);    }     @Test    public void TestArrayXml(){        String[] arrXml = {"classpath:xmlRegBean.xml","classpath:xmlRegBean2.xml"};        ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext(arrXml,true);        Animal cat =context.getBean("cat", Cat.class);        cat.getName();        System.out.println(cat);        Animal cat2 =context.getBean("cat2", Cat.class);        cat2.getName();        System.out.println(cat2);    }

原文地址:https://www.cnblogs.com/nicklin/p/12095885.html

时间: 2024-10-23 21:06:15

ClassPathXmlApplicationContext源码分析的相关文章

【Spring源码分析】Bean加载流程概览

代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已,Spring的加载过程相对是不太透明的,不太好去找加载的代码入口. 下面有很简单的一段代码可以作为Spring代码加载的入口: 1 ApplicationContext ac = new Clas

【Spring源码分析】配置文件读取流程

前言 Spring配置文件读取流程本来是和http://www.cnblogs.com/xrq730/p/6285358.html一文放在一起的,这两天在看Spring自定义标签的时候,感觉对Spring配置文件读取流程还是研究得不够,因此将Spring配置文件读取流程部分从之前的文章拆出来单独成为一文. 为了看一下Spring配置文件加载流程,先定义一个bean.xml: 1 <?xml version="1.0" encoding="UTF-8"?>

spring启动component-scan类扫描加载过程---源码分析

有朋友最近问到了 spring 加载类的过程,尤其是基于 annotation 注解的加载过程,有些时候如果由于某些系统部署的问题,加载不到,很是不解!就针对这个问题,我这篇博客说说spring启动过程,用源码来说明,这部分内容也会在书中出现,只是表达方式会稍微有些区别,我将使用spring 3.0的版本来说明(虽然版本有所区别,但是变化并不是特别大),另外,这里会从WEB中使用spring开始,中途会穿插自己通过newClassPathXmlApplicationContext 的区别和联系.

Spring Core Container 源码分析三:Spring Beans 初始化流程分析

前言 本文是笔者所著的 Spring Core Container 源码分析系列之一: 本篇文章主要试图梳理出 Spring Beans 的初始化主流程和相关核心代码逻辑: 本文转载自本人的私人博客,伤神的博客: http://www.shangyang.me/2017/04/01/spring-core-container-sourcecode-analysis-beans-instantiating-process/ 本文为作者的原创作品,转载需注明出处: 源码分析环境搭建 参考 Sprin

Spring Core Container 源码分析七:注册 Bean Definitions

前言 原本以为,Spring 通过解析 bean 的配置,生成并注册 bean defintions 的过程不太复杂,比较简单,不用单独开辟一篇博文来讲述:但是当在分析前面两个章节有关 @Autowired.@Component.@Service 注解的注入机制的时候,发现,如果没有对有关 bean defintions 的解析和注册机制彻底弄明白,则很难弄清楚 annotation 在 Spring 容器中的底层运行机制:所以,本篇博文作者将试图去弄清楚 Spring 容器内部是如何去解析 b

springAOP源码分析

SpringAop实现为动态代理进行实现的,实现方式有2种,JDK动态代理和CGlib动态代理先写一个AOP的案列加以说明配置文件代码为: <bean id="userDao" class="com.spring.aop.service.UserDaoImpl"/> <bean id="logger" class="com.spring.aop.log.Logger" /> <!-- 切面:切入点

Spring IOC 容器源码分析

前言: Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题. 阅读建议:读者至少需要知道怎么配置 Spring,了解 Spring 中的各种概念,少部分内容我还假设读者使用过 SpringMVC.本文要说的 IOC

【spring源码分析】IOC容器初始化(一)

前言:spring主要就是对bean进行管理,因此IOC容器的初始化过程非常重要,搞清楚其原理不管在实际生产或面试过程中都十分的有用.在[spring源码分析]准备工作中已经搭建好spring的环境,并利用xml配置形式对类进行了实例化.在test代码中有一个非常关键的类ClassPathXmlApplicationContext,在这个类中实现了IOC容器的初始化,因此我们从ClassPathXmlApplicationContext入手开始研究IOC的初始化过程. 1.ClassPathXm

Spring IOC源码分析之-刷新前的准备工作

目录 ClassPathXmlApplicationContext的注册方式 加载父子容器 配置路径解析 容器刷新 刷新容器之刷新预处理 ClassPathXmlApplicationContext的注册方式 源码分析基于Spring4.3 从ClassPathXmlApplicationContext入口,最终都会调用到 /* * 使用给定父级创建新的ClassPathXmlApplicationContext,从给定的XML文件加载定义信息. * 加载所有的bean 定义信息并且创建所有的单