|
|
|
@ -4,31 +4,41 @@ ClassPathXmlApplicationContext:
|
|
|
|
|
refresh();//13个核心方法
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 前戏,做容器刷新前的准备工作
|
|
|
|
|
* 1、设置容器的启动时间
|
|
|
|
|
* 2、设置活跃状态为true
|
|
|
|
|
* 3、设置关闭状态为false
|
|
|
|
|
* 4、获取Environment对象,并加载当前系统的属性值到Environment对象中
|
|
|
|
|
* 5、准备监听器和事件的集合对象,默认为空的集合
|
|
|
|
|
|
|
|
|
|
* 备注:
|
|
|
|
|
* 准备过程中可以通过实现接口和子类继承做增强工作,修改一些配置,类似于AOP
|
|
|
|
|
前戏,做容器刷新前的准备工作
|
|
|
|
|
1、设置容器的启动时间
|
|
|
|
|
2、设置活跃状态为true
|
|
|
|
|
3、设置关闭状态为false
|
|
|
|
|
4、获取Environment对象,并加载当前系统的属性值到Environment对象中
|
|
|
|
|
5、准备监听器和事件的集合对象,默认为空的集合
|
|
|
|
|
*/
|
|
|
|
|
/**
|
|
|
|
|
备注:
|
|
|
|
|
准备过程中可以通过实现接口和子类继承做增强工作,修改一些配置,类似于AOP
|
|
|
|
|
*/
|
|
|
|
|
prepareRefresh();
|
|
|
|
|
|
|
|
|
|
// Tell the subclass to refresh the internal bean factory.
|
|
|
|
|
// 创建容器对象:DefaultListableBeanFactory
|
|
|
|
|
// 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
|
|
|
|
|
/**************************************************************************/ //备注:
|
|
|
|
|
/*ClassPathXmlApplicationContext重载了多个方法,传不同的参有不同的实现且过程中有环**境变量的替换还可以设置是否循环依赖和是否可以覆盖,修改方法通过集成空的父类重写方法*实现
|
|
|
|
|
*例如MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext
|
|
|
|
|
*重写方法
|
|
|
|
|
*解析过程(loadBeanDefinitions/重载比较多,就是用于解析配置文件的)
|
|
|
|
|
*ClassPathXmlApplicationContext(String[])传入的是string数组
|
|
|
|
|
*String[]-String-resource[]-resource
|
|
|
|
|
*通过resource获取文档document并获取跟节点,循环遍历子节点
|
|
|
|
|
*遍历过程中判断默认命名空间和自定义命名空间进行不同的处理方式解析
|
|
|
|
|
/**备注:
|
|
|
|
|
ClassPathXmlApplicationContext重载了多个方法,传不同的参有不同的实现且过程中有环境变量的替换还可以设置是否循环依赖和是否可以覆盖,修改方法通过集成空的父类重写方法实现。
|
|
|
|
|
例如MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext重写方法解析过程(loadBeanDefinitions/重载比较多,就是用于解析配置文件的)
|
|
|
|
|
ClassPathXmlApplicationContext(String[])传入的是string数组
|
|
|
|
|
String[]-String-resource[]-resource
|
|
|
|
|
通过resource获取文档document并获取跟节点,循环遍历子节点
|
|
|
|
|
遍历过程中判断默认命名空间和自定义命名空间进行不同的处理方式解析
|
|
|
|
|
并且把值注册到beanFactory
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
自定义命名空间(扩展思路):
|
|
|
|
|
首先在spring.handlers中定义自定义标签的K和V,(K:网址,V:对应的类)
|
|
|
|
|
例如:"http://www.springframework.org/schema/context"->"org.springframework.context.config.ContextNamespaceHandler"
|
|
|
|
|
然后在实现的hadler类中继承NamespaceHandlerSupport重写init方法。
|
|
|
|
|
在init方法中指定标签属性对应的parse解析类
|
|
|
|
|
例如:registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());
|
|
|
|
|
然后内部会根据上述扩展获取对应的hadler字符串,再反射生成类,然后在调用重写的init方法,将扩展指定好的parse类注册到map中
|
|
|
|
|
*/
|
|
|
|
|
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
|
|
|
|
|
|
|
|
|
|
// Prepare the bean factory for use in this context.
|
|
|
|
|