设为首页 加入收藏

TOP

Spring中的循环依赖解决详解(二)
2019-09-03 03:40:17 】 浏览:202
Tags:Spring 循环 依赖 解决 详解
;       // Trigger initialization of all non-lazy singleton beans...
        for (String beanName : beanNames) {
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { // 判断为非抽象类、是单例、非懒加载 才给初始化
                if (isFactoryBean(beanName)) {
                    // 无关代码(针对FactoryBean的处理)
                }
                else {
                    // 重要!!!普通bean就是在这里初始化的
                    getBean(beanName);
                }
            }
        }


        // 其他无关代码 
    }


可以看到,就是在此方法中循环Spring容器中所有的bean,依次对其进行初始化,初始化的入口就是getBean方法


3、AbstractBeanFactory的getBean跟doGetBean方法


追踪getBean方法:


1 public Object getBean(String name) throws BeansException {
2        return doGetBean(name, null, null, false);
3    }


可见引用了重载的doGetBean方法,继续追踪之:


protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
            @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {


        final String beanName = transformedBeanName(name);
        Object bean;
             
        // 方法1)从三个map中获取单例类
        Object sharedInstance = getSingleton(beanName);
        // 省略无关代码
        }
        else {
            // 如果是多例的循环引用,则直接报错
            if (isPrototypeCurrentlyInCreation(beanName)) {
                throw new BeanCurrentlyInCreationException(beanName);
            }
            // 省略若干无关代码
            try {
                // Create bean instance.
                if (mbd.isSingleton()) {
                    // 方法2) 获取单例对象
                    sharedInstance = getSingleton(beanName, () -> {
                        try { //方法3) 创建ObjectFactory中getObject方法的返回值
                            return createBean(beanName, mbd, args);
                        }
                        catch (BeansException ex) {
                            // Explicitly remove instance from singleton cache: It might have been put there
          &nbs

首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python类中的魔法方法之 __slots__ 下一篇Spring源码解读之BeanFactoryPost..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目