• 郑大钱
    2020-11-17
    “初级工程师在维护代码,高级工程师在设计代码,资深工程师在重构代码” 依赖注入框架好牛逼呀!当手把手教我设计一个框架之后,才破除了我对框架的权威和迷信。 自己最开始做业务也是在原有框架上面修修补补,回过头来看,发现自己非常能忍,即使原有的框架很难用,自己也能坚持用下去。 转念一想,那不是能忍,那是懒。懒得去理解框架的原理,懒得让它更易用。 像豌豆公主一样保持自己的敏感,是持续改进的动力。

    作者回复: 说的好

    
    12
  • 少年锦时
    2020-07-04
    beanDefinition.isLazyInit() == false 为什么不直接写成!beanDefinition.isLazyInit() 呢

    作者回复: 也可以~

    
    
  • 沈康
    2020-02-18
    默默的掏出了《spring源码深度解析》回顾一番 1、构造器循环依赖 构造器注入的循环依赖是无法解决的,只能抛出bean创建异常使容器无法启动 如何判断是循环依赖? 把正在创建的bean放入到一个(正在创建的map)中,如果依赖创建bean在此map中存在,则抛出异常。 2、setter方法循环依赖 ①单例情况可以解决循环依赖,方法是提前暴露一个返回该单例的工厂方法,让依赖对象可以引用到 ②多例不能解决循环依赖,因为多例不需要缓存
    共 7 条评论
    162
  • undefined
    2020-02-23
    把本文的示例补全成了可执行代码: https://github.com/plusmancn/learn-java/tree/master/src/main/java/Exercise/di 顺便纠正一个笔误: BeansFactory 下 createBean 方法中:singletonObjects.contains 应为 singletonObjects. containsKey
    共 2 条评论
    62
  • javaadu
    2020-02-19
    20200218再次复习: 1. 研究了Spring容器中处理循环依赖的知识点:(1)只能处理单例的、setter注入的循环依赖,其他的注入模式无法处理;(2)依赖缓存处理循环依赖,关键思想是,将正在创建中的对象提前暴露一个单例工厂,让其他实例可以引用到 2. 网上一篇比较好的文章:https://juejin.im/post/5d0d8f64f265da1b7b3193ac
    共 2 条评论
    38
  • 简单猫
    2020-05-14
    不要被这些所谓的专业化名词吓到了 什么三级缓存。a依赖b,b依赖c,c依赖a,d依赖a,b,c什么的,你要解决的核心是不要重复创建。那么你就要把已经创建的对象存起来(map,hashmaps什么的) ,然后再次创建的时候先去缓存map中读取,没有才创建。 创建对象流程:1先反射创建类对象 2然后配置类里面的属性 方法(依赖就在这)。 至于你要怎么利用设计模式解耦 分3级缓存 分别存储完全实例化的对象 未设置属性方法类对象 还是对象工厂 那就看如何好用咯
    共 3 条评论
    36
  • 此鱼不得水
    2020-02-14
    Spring解决循环依赖的办法是多级缓存。
    
    23
  • zhengyu.nie
    2020-04-24
    基本就是Spring源码大体原型了,委托的BeanFactory在Spring源码里是DefaultListableBeanFactory。循环依赖解决是三级缓存,提前暴露还没有初始化结束的bean。检测是Map存一下过程,aba这样顺序判断,有重复(a出现两次)就是环了。 三级缓存源码对应 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton /** * Return the (raw) singleton object registered under the given name. * <p>Checks already instantiated singletons and also allows for an early * reference to a currently created singleton (resolving a circular reference). * @param beanName the name of the bean to look for * @param allowEarlyReference whether early references should be created or not * @return the registered singleton object, or {@code null} if none found */ @Nullable protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) { ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return singletonObject; } /** Cache of singleton objects: bean name to bean instance. */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); /** Cache of singleton factories: bean name to ObjectFactory. */ private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); /** Cache of early singleton objects: bean name to bean instance. */ private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
    展开
    
    15
  • 王先森
    2020-06-16
    php开发者默默的去瞅laravel的DI容器
    
    11
  • 好吃不贵
    2020-02-14
    createBean先用Topology sort看是否有环,然后再按序创建?
    共 1 条评论
    9