IOC容器

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值