ClassPathXmlApplicationContext–>refresh()
refresh
(1)ConfigurableListableBeanFactory beanFactory =obtainFreshBeanFactory();注册(核心是一个 beanName-> beanDefinition 的 map)
1.// 关闭旧的 BeanFactory (如果有),创建新的 BeanFactory,加载 Bean 定义、注册 Bean 等等
refreshBeanFactory();
1.1 // 初始化一个 DefaultListableBeanFactory
DefaultListableBeanFactory beanFactory = createBeanFactory();
1.2// 设置 BeanFactory 的两个配置属性:是否允许 Bean 覆盖、是否允许循环引用
customizeBeanFactory(beanFactory);
1.3// 加载 Bean 到 BeanFactory 中
loadBeanDefinitions(beanFactory);
1.3.1// 给这个 BeanFactory 实例化一个 XmlBeanDefinitionReader
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
1.3.2 初始化的 Reader 开始来加载 xml 配置
loadBeanDefinitions(beanDefinitionReader);
1.3.2.1 DOM树,解析 Bean 定义
doRegisterBeanDefinitions
1.3.2.1.1核心解析方法
parseBeanDefinitions
(1)默认的element(<import />、<alias />、<bean />、<beans />)
parseDefaultElement(ele, delegate)
1.1将 <bean /> 节点中的信息提取出来,然后封装到一个 BeanDefinitionHolder 中
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
1.1.1创建 BeanDefinition,然后把配置中的信息都设置到实例中
parseBeanDefinitionElement(ele, beanName, containingBean);
1.2注册Bean
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
// 将 BeanDefinition 放到这个 map 中,这个 map 保存了所有的 BeanDefinition
this.beanDefinitionMap.put(beanName, beanDefinition);
// 这是个 ArrayList,所以会按照 bean 配置的顺序保存每一个注册的 Bean 的名字
this.beanDefinitionNames.add(beanName);
(2)自定义element(<mvc />、<task />、<context />、<aop />)
delegate.parseCustomElement(ele)
(2)prepareBeanFactory(factory)准备 Bean 容器
(3)finishBeanFactoryInitialization(beanFactory);初始化所有的 singleton beans(lazy-init 的除外)
3.1开始初始化剩下的
beanFactory.preInstantiateSingletons();
--> getBean(beanName)
-->createBean(beanName, mbd, args)
--> doCreateBean(beanName, mbdToUse, args)
-->instanceWrapper = createBeanInstance(beanName, mbd, args)实例化 Bean,java 反射进行实例化
-->populateBean(beanName, mbd, instanceWrapper);属性装配,设值
--> initializeBean回调方法
sample 根据对象查询
addOrder 根据字段排序
Restrictions根据sql语句查询,eq
Projections调用avg、count