Spring源码解读之ClassPathXmlApplicationContext(根据Spring最新版本)

下图为ClassPathXmlApplicationContext 类的继承结构

ClassPathXmlApplicationContext的构造方法有:

1、public ClassPathXmlApplicationContext()。默认构造方法,创建一个实例

2、public ClassPathXmlApplicationContext(ApplicationContext parent)。创建一个实例并设置这个实例的父ApplicationContext为parent

3、public ClassPathXmlApplicationContext(String configLocation)。创建一个实例,并且设置一个配置文件的类路径

4、public ClassPathXmlApplicationContext(String... configLocations)创建一个实例,并且设置零个或多个配置文件的类路径

5、public ClassPathXmlApplicationContext(String[] configLocations, @Nullable ApplicationContext parent)。创建一个实例,并且设置零个或多个配置文件的类路径,并设置这个实例的父ApplicationContext为parent

6、public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh)创建一个实例,并且设置零个或多个配置文件的类路径,同时根据refresh来判定是否需要自动刷新这个上下文(ApplicationContext)

7、public ClassPathXmlApplicationContext( String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)创建一个实例,并且设置零个或多个配置文件的类路径,根据refresh来判定是否需要自动刷新这个上下文(ApplicationContext),于此同时设置这个实例的父ApplicationContext为parent

8、public ClassPathXmlApplicationContext(String path, Class<?> clazz) 创建一个实例,并且设置一个配置文件的类路径(根据类clazz所在的位置)

9、public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz)创建一个实例,并且设置零个或多个配置文件的类路径(根据类clazz所在的位置)

10、public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz, @Nullable ApplicationContext parent)创建一个实例,并且设置零个或多个配置文件的类路径(根据类clazz所在的位置),并设置这个实例的父ApplicationContext为parent

ClassPathXmlApplicationContext类文件中只有一个属性Resource[] configResources(配置文件的集合)

一个公有方法用来获取所有的配置文件集合protected Resource[] getConfigResources()。

在上述十个构造方法中主要使用的是public ClassPathXmlApplicationContext( String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)和ClassPathXmlApplicationContext(String[] paths, Class<?> clazz, @Nullable ApplicationContext parent),其他的构造方法主要是调用上述两个方法。前者是根据默认的类路径加载配置文件、后者主要是通过给定类的路径来加载配置文件,并设置该应用上下文(ApplicationContext)的父应用上下文为parent,有所区别的是前者根据refresh参数来决定是否自动加载上下文,后者直接加载上下文。

ClassPathXmlApplicationContext的父类

ClassPathXmlApplicationContext直接继承的类只有AbstractXmlApplicationContext,该类的继承结构为:

该类是一个抽象类,不能直接实例化,其包含的构造方法有

1、public AbstractXmlApplicationContext()默认构造函数

2、public AbstractXmlApplicationContext(@Nullable ApplicationContext parent)设置该上下文的父上下文为parent,ClassPathXmlApplicationContext的除了默认构造方法,其余所有构造方法都会调用该构造方法

AbstractXmlApplicationContext 包含一个private boolean validating = true,xml配置文件是否需要校验,默认为true。

AbstractXmlApplicationContext包含的方法有:

1、protected Resource[] getConfigResources()返回所有的配置文件资源,ClassPathXmlApplicationContext有进行重写,默认为null。

2、protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) 从给定的beanFactory加载bean的定义,即从xml或者其他文件中加载配置文件,这里值得是xml配置文件

3、protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader)初始化给定的reader,这里主要是设置reader需要验证xml的格式。loadBeanDefinitions在执行的时候会调用该方法。

4、protected void loadBeanDefinitions(XmlBeanDefinitionReader reader)使用reader来加载配置文件中bean的定义。loadBeanDefinitions在执行的时候会调用该方法。

AbstractXmlApplicationContext的父类

AbstractXmlApplicationContext类也只有一个父类AbstractRefreshableConfigApplicationContext,其继承结构为

AbstractRefreshableConfigApplicationContext同样也是一个抽象类,他所拥有的构造方法为

1、public AbstractRefreshableConfigApplicationContext()默认构造方法

2、public AbstractRefreshableConfigApplicationContext(@Nullable ApplicationContext parent)设置父上下文为parent,ClassPathXmlApplicationContext初始化时会调用该构造方法。

该类包含的属性有:

1、private String[] configLocations 配置文件路径

2、private boolean setIdCalled = false,是否需要设置该上下文的名字

该类包含的方法:

1、public void setConfigLocation(String location),设置配置文件,多个配置文件以,;\t\n作为分割符

2、public void setConfigLocations(@Nullable String... locations),设置配置文件ClassPathXmlApplicationContext初始化时会调用该方法

3、protected String[] getConfigLocations()获取所有配置文件路径

4、protected String[] getDefaultConfigLocations()默认配置文件默认为null

5、public void setBeanName(String name)设置该bean的name,此方法为实现继承的BeanNameAware接口

6、public void setId(String id)设置该上下文的id

7、public void afterPropertiesSet()该方法为初始化完成该bean之后,执行该方法,此方法为实现接口InitializingBean中的方法。

8、protected String resolvePath(String path)替换path中的占位符(${})

AbstractRefreshableConfigApplicationContext的父类

 

AbstractRefreshableConfigApplicationContext也只有一个父类AbstractRefreshableApplicationContext,但是实现了两个接口BeanNameAware和InitializingBean,AbstractRefreshableApplicationContext的继承结构为:

AbstractRefreshableApplicationContext同样也是一个抽象类、其构造函数包括:

1、public AbstractRefreshableApplicationContext()默认构造方法

2、public AbstractRefreshableApplicationContext(@Nullable ApplicationContext parent)设置该上下文的父上下文为parent,ClassPathXmlApplicationContext实例化的时候会调用该方法

AbstractRefreshableApplicationContext包含的属性:

1、private Boolean allowBeanDefinitionOverriding 是否允许覆盖注册的bean定义

2、private Boolean allowCircularReferences;是否允许循环依赖

3、private DefaultListableBeanFactory beanFactory 当前上下文的bean工厂

4、private final Object beanFactoryMonitor = new Object()内部 bean工厂监视器

AbstractRefreshableApplicationContext包含的方法有:

1、public void setAllowBeanDefinitionOverriding(boolean allowBeanDefinitionOverriding)设置是否允许有相同名字的bean定义

2、public void setAllowCircularReferences(boolean allowCircularReferences)设置是否允许循环依赖

3、protected final void refreshBeanFactory()重新刷新上下文,首先关闭之前的上下文、然后创建新的

4、protected void cancelRefresh(BeansException ex)取消上下文刷新

5、protected final void closeBeanFactory()关闭bean工厂

6、protected final boolean hasBeanFactory()上下文是否有bean工厂

7、public final ConfigurableListableBeanFactory getBeanFactory()获取bean工厂

8、protected DefaultListableBeanFactory createBeanFactory()创建bean工厂

9、protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory)设置bean工厂

10、protected abstract void loadBeanDefinitions从配置文件中加载bean的定义AbstractXmlApplicationContext中有实现

 

AbstractRefreshableApplicationContext的父类

AbstractRefreshableApplicationContext的父类只有AbstractApplicationContext,AbstractApplicationContext的继承结构为:

AbstractApplicationContext是抽象类,其构造函数有:

1、public AbstractApplicationContext()默认构造方法

2、public AbstractApplicationContext(@Nullable ApplicationContext parent) 设置父上下文为parent,ClassPathXmlApplicationContext初始化时会调用该方法

AbstractApplicationContext的属性包含:

1、private ApplicationContext parent上下文(层级结构)的父想上下文

2、private ConfigurableEnvironment environment环境变量主要是properties文件中配置的参数

3、private final List<BeanFactoryPostProcessor> beanFactoryPostProcessors bean工厂的后置处理器列表

4、private long startupDate 上下文启动时间

5、private final AtomicBoolean active 上下文是否已经启动

6、private final AtomicBoolean closed 上下文是否关闭

7、private final Object startupShutdownMonitor保证启动和销毁线程安全的对象

AbstractApplicationContext包含的方法有:

1、public ApplicationContext getParent()返回该上下文的父上下文

2、protected ConfigurableEnvironment createEnvironment()创建环境变量实例,如果环境变量为空则创建

3、public AutowireCapableBeanFactory getAutowireCapableBeanFactory()获取拥有自动注入的bean工厂

4、public long getStartupDate() 获取上下文启动时间

5、public void publishEvent(ApplicationEvent event)发布ApplicationEvent类型的事件给所有的listener

6、public void publishEvent(Object event)发布事件给所有的listener

7、protected void publishEvent(Object event, @Nullable ResolvableType eventType)发布事件给所有的listener

8、ApplicationEventMulticaster getApplicationEventMulticaster()获取上下文的ApplicationEventMulticaster

9、LifecycleProcessor getLifecycleProcessor()获取上下文的LifecycleProcessor

10、protected ResourcePatternResolver getResourcePatternResolver()资源解析器

11、public void setParent(@Nullable ApplicationContext parent)设置上下文的父上下文

12、public void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor)添加BeanFactoryPostProcessor

13、public void addApplicationListener(ApplicationListener<?> listener)添加listener

14、public void refresh()整个加载的核心逻辑

15、protected void prepareRefresh()核心逻辑之前的操作

16、protected ConfigurableListableBeanFactory obtainFreshBeanFactory()获取ConfigurableListableBeanFactory

17、protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)初始化bean工厂前执行

18、protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)调用bean工厂的后置处理器

19、protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory)注册bean后置处理器

20、protected void initMessageSource()初始化消息资源

21、protected void finishBeanFactoryInitialization完成bean工厂的初始化操作

22、protected void finishRefresh()完成刷新后的操作

AbstractApplicationContext的父类

AbstractApplicationContext只继承了DefaultResourceLoader和实现接口:ConfigurableApplicationContext

DefaultResourceLoader的继承结构为:

此为资源的加载

 

ConfigurableApplicationContext的继承结构为:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值