• aksonic
    2020-01-13
    小马哥,通过视频我了解了ApplicationContext和BeanFactory之间的关系,也知道了DefaultListableBeanFactory被组合到了AbstractRefreshableApplicationContext,但好像视频并没有回答一个问题:UserRepository中的BeanFactory beanFactory属性为什么通过autowired=“byType”,注入的是DefaultListableBeanFactory,而不是ClassPathXmlApplicationContext?既然他们两者属于BeanFactory接口,按type注入,为什么不是ClassPathXmlApplicationContext?是框架哪里设置的吗?

    作者回复: 答案在 org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory 方法中,其中:

            beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
            beanFactory.registerResolvableDependency(ResourceLoader.class, this);
            beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
            beanFactory.registerResolvableDependency(ApplicationContext.class, this);

    以上代码明确地指定了 BeanFactory 类型的对象是 ApplicationContext#getBeanFactory() 方法的内容,而非它自生。

    
     4
  • 甘乐
    2020-02-04
    总结:
    1.xml中自定义bean中注入的BeanFactory是DefaultListableBeanFactory,是我们在创建ClassPathXmlApplicationContext时,构造函数再次创建的一个组合对象,即使他们的顶级接口都是BeanFactory,但是它们根本不是同一个对象
    创建组合对象是在
    org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory方法中的createBeanFactory()方法中明确创建了DefaultListableBeanFactory()
    2.在我们操作Bean(getBean())时,其实调用的都是组合对象的getBean()方法org.springframework.context.support.AbstractApplicationContext#getBean(java.lang.String)
    麻烦马老师看下我的总结有误么:)
    展开

    作者回复: 总结到位~

    
     1
  • 静水流深
    2020-02-04
    这是我看到过的最好的spring课程!

    作者回复: 感谢夸奖,我们一起加油~

    
     1
  • 飞翔
    2020-02-06
    老师 那到底谁是真正的spring ioc 容器? 是beanfactory嘛

    作者回复: IoC 实际容器是 BeanFactory 的实现

    
    
  • 轻描淡写
    2020-01-29
    小马哥,为什么spring需要做这么一层代理实现呢,直接用ApplicationContext继承某个BeanFactory,然后提供新的能力的方式不好吗,是因为太耦合了吗,

    作者回复: 这样设计相对简单,将 ApplicationContext 作为 Facade 提供一个大而全的 API

    
    
  • Geek_f544a9
    2020-01-11
    小马哥的视频是我唯一不敢倍速播放的。。。

    作者回复: 那就是 1/2 速度呗

    
    
  • 皇影1993
    2020-01-10
    ApplicationContext是BeanFactory的子接口,那UserRepository的beanFactory自动装配的时候不就有多个类型为BeanFactory的bean了吗,一个是我们创建的ApplicationContext,另一个是它内部的DefaultListableBeanFactory,为什么没有报错,而是直接装配了内部的DefaultListableBeanFactory

    作者回复: 参考一下我给 aksonic 回复的内容,里面已经提到了,它是一种特殊的依赖注入。

    
    
  • wang
    2020-01-09
    有点像委派,直接调用底层BeanFactory实现类的方法

    作者回复: 是的,就是委派

    
    
  • 写给三月
    2020-01-09
    第一遍有点难懂,

    作者回复: 慢慢来,Spring 确实很复杂,尤其是 BeanFactory 和 ApplicationContext 的细节,需要一定的记忆~

    
    
我们在线,来聊聊吧