Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

各位小伙伴,我是本项目的作者,想收集下问题和建议,欢迎畅所欲言,会回复每一条信息。 #4

Open
DerekYRC opened this issue Dec 31, 2020 · 103 comments
Labels
discussion discussion good first issue Good for newcomers

Comments

@DerekYRC
Copy link
Owner

DerekYRC commented Dec 31, 2020

如题。如果提bug,请新建issue。

@boykaa
Copy link

boykaa commented Jan 3, 2021

写得不错!!!获益匪浅,催更催更

@kerwin89
Copy link

kerwin89 commented Jan 4, 2021

作者可以考虑下mini-sprintboot吗?

@DerekYRC
Copy link
Owner Author

DerekYRC commented Jan 4, 2021

作者可以考虑下mini-sprintboot吗?

后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。
不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。

@DerekYRC
Copy link
Owner Author

DerekYRC commented Jan 4, 2021

写得不错!!!获益匪浅,催更催更

目前还差类型转换和解决循环依赖两节,近期会实现。不过还在纠结实现哪一套类型转换机制,spring中有两套类型类型转换机制,一套老的一套新的,偏向于新的。

@caixiaomao
Copy link

中文版的文档怎么看不了 😢

@DerekYRC
Copy link
Owner Author

DerekYRC commented Jan 5, 2021

中文版的文档怎么看不了 😢

不会啊,打开https://github.com/DerekYRC/mini-spring/blob/main/changelog.md

@caixiaomao
Copy link

中文版的文档怎么看不了 😢

不会啊,打开https://github.com/DerekYRC/mini-spring/blob/main/changelog.md

网络的问题,好了 👍

@yftan
Copy link

yftan commented Jan 6, 2021

大佬,AOP那块可以详细讲讲吗?感觉那个地方的类非常多,不理解为什么要那么设计。

@DerekYRC
Copy link
Owner Author

DerekYRC commented Jan 6, 2021

大佬,AOP那块可以详细讲讲吗?感觉那个地方的类非常多,不理解为什么要那么设计。

AOP这块可以多花点时间看看。主流程比较简单,判断哪些类的哪些方法需要代理,然后进行代理,代理只是在JDK动态代理的基础上简单套了一层。aspectJ提供的切点表达式工具,用于捕获需要代理的类的方法。要熟悉JDK动态代理的原理,可先不看cglib代理。至于类多的问题,因为spring要遵循AOP联盟制定的规范,需要实现相关的接口,可不必关注。

@liaobei
Copy link

liaobei commented Jan 11, 2021

事务实现这块可以补充下吗,谢谢大佬

@V0idk
Copy link

V0idk commented Jan 11, 2021

大佬spring MVC和spring ORM都可以考虑下

@DerekYRC
Copy link
Owner Author

大佬spring MVC和spring ORM都可以考虑下

不是什么大佬了,小开发一个。后续计划写mini-springmvc。

@DerekYRC
Copy link
Owner Author

事务实现这块可以补充下吗,谢谢大佬

不是什么大佬了,小开发一个。事务这块,没有深入研究事务传播行为的代码,但是如果实现spring的事务没有考虑是我传播行为的话就没有灵魂。我先记下,后续研究清楚考虑实现下。

我简单讲下spring事务的实现方式,主要看PlatformTransactionManager接口,有三个重要的方法,可以看为JDBC提供的的实现类DataSourceTransactionManager。
第一步调用getTransaction方法,获取到一个数据库的连接,然后绑定到当前线程(ThreadLocal),
第二步操作数据库,获取绑定到当前线程的数据库的连接,使用该连接操作数据库,
第三步,获取绑定到当前线程的数据库的连接,使用该连接commit或者rollback
第四步,归还该连接到连接池

@wardseptember
Copy link

老哥把这些加个链接吧
image
一看老哥就是讲究人,准备好好学习学习。

@DerekYRC
Copy link
Owner Author

老哥把这些加个链接吧
image
一看老哥就是讲究人,准备好好学习学习。

哈哈,没问题,记下了,有空改下。

@wanglewoba
Copy link

作者可以考虑下mini-sprintboot吗?

后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。
不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。

这就去点 星

@wardseptember
Copy link

老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。

@DerekYRC
Copy link
Owner Author

作者可以考虑下mini-sprintboot吗?

后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。
不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。

这就去点 星

谢谢

@DerekYRC
Copy link
Owner Author

老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。

谢谢老哥,没想到真的有小伙伴看完,挺感动的!!!

为了方便理解,循环依赖部分的内容我会拆成两小节来讲解:
1、没有代理对象的循环依赖
2、有代理对象的循环依赖

第一小节的功能代码已经写好了,待补充changelog,再提交代码。

这周末会全部完成两小节,你可以帮忙review代码补充下。

@wardseptember
Copy link

老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。

谢谢老哥,没想到真的有小伙伴看完,挺感动的!!!

为了方便理解,循环依赖部分的内容我会拆成两小节来讲解:
1、没有代理对象的循环依赖
2、有代理对象的循环依赖

第一小节的功能代码已经写好了,待补充changelog,再提交代码。

这周末会全部完成两小节,你可以帮忙review代码补充下。

坐等老哥代码,哈哈哈

@DerekYRC
Copy link
Owner Author

老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。

谢谢老哥,没想到真的有小伙伴看完,挺感动的!!!
为了方便理解,循环依赖部分的内容我会拆成两小节来讲解:
1、没有代理对象的循环依赖
2、有代理对象的循环依赖
第一小节的功能代码已经写好了,待补充changelog,再提交代码。
这周末会全部完成两小节,你可以帮忙review代码补充下。

坐等老哥代码,哈哈哈

老哥,代码提交了,帮忙review下。

@wardseptember
Copy link

老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。

谢谢老哥,没想到真的有小伙伴看完,挺感动的!!!
为了方便理解,循环依赖部分的内容我会拆成两小节来讲解:
1、没有代理对象的循环依赖
2、有代理对象的循环依赖
第一小节的功能代码已经写好了,待补充changelog,再提交代码。
这周末会全部完成两小节,你可以帮忙review代码补充下。

坐等老哥代码,哈哈哈

老哥,代码提交了,帮忙review下。

review谈不上,主要还是跟老哥学习。spring 支持两种循环依赖方式,A和B都根据setter方法注入,还有一种是如果自然顺序,A注册排在B前面,A使用setter方法注入B,B可以使用构造器方法注入A。这里代码是只支持A、B都使用setter注入的。

老哥你的DefaultSingletonBeanRegistry里面几个方法不加synchronized了吗,addSingleton方法没有删除二、三级缓存里面的内容。

@DerekYRC
Copy link
Owner Author

老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。

谢谢老哥,没想到真的有小伙伴看完,挺感动的!!!
为了方便理解,循环依赖部分的内容我会拆成两小节来讲解:
1、没有代理对象的循环依赖
2、有代理对象的循环依赖
第一小节的功能代码已经写好了,待补充changelog,再提交代码。
这周末会全部完成两小节,你可以帮忙review代码补充下。

坐等老哥代码,哈哈哈

老哥,代码提交了,帮忙review下。

review谈不上,主要还是跟老哥学习。spring 支持两种循环依赖方式,A和B都根据setter方法注入,还有一种是如果自然顺序,A注册排在B前面,A使用setter方法注入B,B可以使用构造器方法注入A。这里代码是只支持A、B都使用setter注入的。

老哥你的DefaultSingletonBeanRegistry里面几个方法不加synchronized了吗,addSingleton方法没有删除二、三级缓存里面的内容。

谢谢你的建议!本项目侧重于讲解原理部分,不追求功能完备。
1、对于有构造器方法的循环依赖,如你说的A使用setter方法注入,B使用构造器方法注入,A先于B实例化,其实原理跟只有setter方法注入的循环依赖解决一样的,所以只拿setter方法注入的循环依赖来讲解
2、spring中DefaultSingletonBeanRegistry的几个方法加了synchronized做并发控制,这一点我还不是很明白,因为容器加载bean都是单线程的,没有多线程并发的问题。搜了下也没有相关资料,此处请教你回答下。
3、addSingleton方法加了删除二、三级缓存的代码,已提交。

@wardseptember
Copy link

老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。

谢谢老哥,没想到真的有小伙伴看完,挺感动的!!!
为了方便理解,循环依赖部分的内容我会拆成两小节来讲解:
1、没有代理对象的循环依赖
2、有代理对象的循环依赖
第一小节的功能代码已经写好了,待补充changelog,再提交代码。
这周末会全部完成两小节,你可以帮忙review代码补充下。

坐等老哥代码,哈哈哈

老哥,代码提交了,帮忙review下。

review谈不上,主要还是跟老哥学习。spring 支持两种循环依赖方式,A和B都根据setter方法注入,还有一种是如果自然顺序,A注册排在B前面,A使用setter方法注入B,B可以使用构造器方法注入A。这里代码是只支持A、B都使用setter注入的。
老哥你的DefaultSingletonBeanRegistry里面几个方法不加synchronized了吗,addSingleton方法没有删除二、三级缓存里面的内容。

谢谢你的建议!本项目侧重于讲解原理部分,不追求功能完备。
1、对于有构造器方法的循环依赖,如你说的A使用setter方法注入,B使用构造器方法注入,A先于B实例化,其实原理跟只有setter方法注入的循环依赖解决一样的,所以只拿setter方法注入的循环依赖来讲解
2、spring中DefaultSingletonBeanRegistry的几个方法加了synchronized做并发控制,这一点我还不是很明白,因为容器加载bean都是单线程的,没有多线程并发的问题。搜了下也没有相关资料,此处请教你回答下。
3、addSingleton方法加了删除二、三级缓存的代码,已提交。

因为单例Bean是归所有调用者共享的,不是线程安全的。如果多个用户,同时操作同一个Bean,就会出现线程不安全问题,所以getSingleton类似的方法需要加上synchronized。我的理解是,非懒加载的Bean在容器加载完毕就完成了整个生命周期流程,但是懒加载的Bean可能同时被多个用户getBean,就存在并发问题,所以addSingleton、addSingletonFactory也要加上synchronized;多个用户可能通过registerSingleton注册同一个Bean,也要加synchronized。

@wardseptember
Copy link

老哥,还有singletonObjects改成ConcurrentHashMap比较好
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

@DerekYRC
Copy link
Owner Author

老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。

谢谢老哥,没想到真的有小伙伴看完,挺感动的!!!
为了方便理解,循环依赖部分的内容我会拆成两小节来讲解:
1、没有代理对象的循环依赖
2、有代理对象的循环依赖
第一小节的功能代码已经写好了,待补充changelog,再提交代码。
这周末会全部完成两小节,你可以帮忙review代码补充下。

坐等老哥代码,哈哈哈

老哥,代码提交了,帮忙review下。

review谈不上,主要还是跟老哥学习。spring 支持两种循环依赖方式,A和B都根据setter方法注入,还有一种是如果自然顺序,A注册排在B前面,A使用setter方法注入B,B可以使用构造器方法注入A。这里代码是只支持A、B都使用setter注入的。
老哥你的DefaultSingletonBeanRegistry里面几个方法不加synchronized了吗,addSingleton方法没有删除二、三级缓存里面的内容。

谢谢你的建议!本项目侧重于讲解原理部分,不追求功能完备。
1、对于有构造器方法的循环依赖,如你说的A使用setter方法注入,B使用构造器方法注入,A先于B实例化,其实原理跟只有setter方法注入的循环依赖解决一样的,所以只拿setter方法注入的循环依赖来讲解
2、spring中DefaultSingletonBeanRegistry的几个方法加了synchronized做并发控制,这一点我还不是很明白,因为容器加载bean都是单线程的,没有多线程并发的问题。搜了下也没有相关资料,此处请教你回答下。
3、addSingleton方法加了删除二、三级缓存的代码,已提交。

因为单例Bean是归所有调用者共享的,不是线程安全的。如果多个用户,同时操作同一个Bean,就会出现线程不安全问题,所以getSingleton类似的方法需要加上synchronized。我的理解是,非懒加载的Bean在容器加载完毕就完成了整个生命周期流程,但是懒加载的Bean可能同时被多个用户getBean,就存在并发问题,所以addSingleton、addSingletonFactory也要加上synchronized;多个用户可能通过registerSingleton注册同一个Bean,也要加synchronized。

受教了。毕竟是简化版的spring,就不考虑实现懒加载了。

@oryxJeek
Copy link

oryxJeek commented Feb 2, 2021

作者可以考虑下mini-sprintboot吗?

后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。
不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。

我觉得还是写springboot好一点,mvc内容并不多

@DerekYRC
Copy link
Owner Author

DerekYRC commented Feb 2, 2021

作者可以考虑下mini-sprintboot吗?

后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。
不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。

我觉得还是写springboot好一点,mvc内容并不多

原理性的东西还是看spring吧,springboot在spring的基础上封装了一层。

@mqb618
Copy link

mqb618 commented Feb 3, 2021

作者我有个问题请教下,我写到了【bean的初始化和销毁方法】 这一节,发现我对于 initialization 初始化 这个的概念的理解有点问题。在我原本的理解中,一个对象应该是分为 实例化和初始化两步,实例化就是创建一个对象,分配内存;初始化就是为这个对象的各个属性赋值。但是在Spring中,好像是将属性赋值这个步骤单独拿出来,分为了 实例化、赋值、初始化 三步,在初始化的时候是对已经完成赋值对象进行操作...

@wardseptember
Copy link

作者我有个问题请教下,我写到了【bean的初始化和销毁方法】 这一节,发现我对于 initialization 初始化 这个的概念的理解有点问题。在我原本的理解中,一个对象应该是分为 实例化和初始化两步,实例化就是创建一个对象,分配内存;初始化就是为这个对象的各个属性赋值。但是在Spring中,好像是将属性赋值这个步骤单独拿出来,分为了 实例化、赋值、初始化 三步,在初始化的时候是对已经完成赋值对象进行操作...

属性赋值阶段主要完成xml文件配置的属性赋值和注解上值的赋值,初始化阶段完成一些BeanNameAware\BeanClassLoaderAware\BeanFactoryAware等XXXAware工作和一些初始化方法,这些初始化方法可以在属性赋值后再对Bean做一些修改,有些功能需要这样加吧。而且初始化方法前后有BeanPostProcessor.postProcessBeforeInitialization()和BeanPostProcessor.postProcessAfterInitialization()方法也可以做一些特别的工作,如完成aop。初始化和销毁方法一般有三对,作用顺序如下图。属性赋值和初始化为什么分成两个阶段,我的理解是,这样设计职责清晰,而且可以完成一些特别的工作。

@DerekYRC
Copy link
Owner Author

发现一个问题,AbstractApplicationContext 中这个地方写死了。 图片

只能感知ApplicationContextAwareProcessor这个接口的实现类。 spring中采用的是注册的方式。 图片

希望改正捏

看不太懂,能补充说明下你的问题吗?

@kylinlingh
Copy link

项目做得真的很不错,获益良多。在阅读时最大的障碍就是项目架构变动之后没有及时说明,很多时候都要不断地切换分支才知道究竟改了哪里。

@DerekYRC
Copy link
Owner Author

项目做得真的很不错,获益良多。在阅读时最大的障碍就是项目架构变动之后没有及时说明,很多时候都要不断地切换分支才知道究竟改了哪里。

谢谢!!!每个功能对应一个分支的目的是方便对比了解改动点。

@Rocmy2021
Copy link

老哥,跟着你的文章走到@value注解这,发现个问题,比如在配置文件中有给Car的brand属性赋值,然后在.properties文件里面指定brand的值,这个值在创建car对象时是覆盖不了配置文件里面的值的,原因的话是AutowiredAnnotationBeanPostProcessor里没有去操作PropertyValues pvs,老哥看下要不要改一下

@DerekYRC
Copy link
Owner Author

DerekYRC commented Oct 9, 2022

老哥,跟着你的文章走到@value注解这,发现个问题,比如在配置文件中有给Car的brand属性赋值,然后在.properties文件里面指定brand的值,这个值在创建car对象时是覆盖不了配置文件里面的值的,原因的话是AutowiredAnnotationBeanPostProcessor里没有去操作PropertyValues pvs,老哥看下要不要改一下

对,确实有这个问题,AutowiredAnnotationBeanPostProcessor中应该操作PropertyValues中的值,不然后续会被PropertyValues覆盖。可以提个issue,有兴趣可以提个pull request修复下。

@xiao-peng-yu
Copy link

标题:[动态代理融入bean生命周期] 如果InstantiationAwareBeanPostProcessor处理阶段返回代理对象,会导致短路,不会继续走原来的创建bean的流程,具体实现查看AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation。

代理对象的生成是不是在 AbstractAutowireCapableBeanFactory ->initializeBean ->applyBeanPostProcessorsAfterInitialization 这里。
我看 DefaultAdvisorAutoProxyCreator 这个类只有重写了这个方法postProcessAfterInitialization,才对类进行了代理。
postProcessBeforeInstantiation 这个方法返回空对象 和其他方法没什么区别。

最上面那个描述是不是有点问题,望解答

@DerekYRC
Copy link
Owner Author

@xiao-peng-yu 对,这是个bug,在《没有为代理bean设置属性》章节修复了
image

@xiao-peng-yu
Copy link

@xiao-peng-yu 对,这是个bug,在《没有为代理bean设置属性》章节修复了 image

感谢作者大大的回复,还没看到下面修复的部分,所以产生了这个问题。

@DerekYRC
Copy link
Owner Author

@xiao-peng-yu 不用客气,有问题随时沟通

@DerekYRC DerekYRC added good first issue Good for newcomers discussion discussion labels Nov 24, 2022
@WuYiwen97
Copy link

十分十分十分感谢老哥,有更新mini-springmvc的计划吗?

@DerekYRC
Copy link
Owner Author

DerekYRC commented Mar 2, 2023

十分十分十分感谢老哥,有更新mini-springmvc的计划吗?

@WuYiwen97 客气了哈,一起学习。基本学完mini-spring之后,看springmvc和springboot的代码会很轻松,mini-spring-cloud也请支持下,后面有时间可能考虑写个简化版的netty。

@ych5680
Copy link

ych5680 commented Mar 9, 2023

之前的spring bean 生命周期的图片怎么移除了

@DerekYRC
Copy link
Owner Author

DerekYRC commented Mar 9, 2023

之前的spring bean 生命周期的图片怎么移除了

哪张?changelog里边的吗?
image

@AldirchEugene
Copy link

AldirchEugene commented Mar 20, 2023

牛逼,支持,用一句话说:麻雀虽小,但五脏俱全,非常好

@DerekYRC
Copy link
Owner Author

牛逼,支持,用一句话说:麻雀虽小,但五脏俱全,非常好

谢谢支持。保留spring核心功能的前提下尽量精简代码,希望能对你学习spring源码起到帮助,有问题随时沟通。

@hexushuang
Copy link

image
small-spring这个三个还作为付费的。看了下纯抄袭啊

@hexushuang
Copy link

bug都抄袭下来了

@AldirchEugene
Copy link

AldirchEugene commented Mar 23, 2023 via email

@DerekYRC
Copy link
Owner Author

DerekYRC commented Mar 23, 2023

@hexushuang @AldirchEugene 谢谢两位同学,被抄袭特别影响心情。年初跟抄袭者沟通,抄袭者目前已下架图书和注明引用出处。

image

@AldirchEugene
Copy link

AldirchEugene commented Mar 23, 2023 via email

@yuexiaying
Copy link

大佬,计划什么时候出min-springboot呀,刚看了你的mini-spring,真的是太棒了,受益匪浅

@DerekYRC
Copy link
Owner Author

大佬,计划什么时候出min-springboot呀,刚看了你的mini-spring,真的是太棒了,受益匪浅

不打算写mini-springboot了,学完mini-spring,阅读springboot的源码应该会很轻松,mini-spring-cloud也请支持下

@tfcCode
Copy link

tfcCode commented Oct 9, 2023

大佬,mini-springmvc 啥时候上线啊,给你磕一个

@DerekYRC
Copy link
Owner Author

大佬,mini-springmvc 啥时候上线啊,给你磕一个

谢谢支持。不打算写mini-spring-mvc了哈,看懂spring源码之后再去读mvn源码会很轻松,可以看核心代码DispatcherServlet。

@Donleave
Copy link

大佬你好,请问该如何消化这个项目呢才能更好的理解spring的原理

@DerekYRC
Copy link
Owner Author

大佬你好,请问该如何消化这个项目呢才能更好的理解spring的原理

不难的哈,要有信心,可以跟着项目敲一遍代码

@Junlixing
Copy link

Junlixing commented Apr 1, 2024

作者可以考虑下mini-sprintboot吗?

后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。 不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。

作者大大 , mini - Spring的文档只有changelog.md,我感觉稍微有点少,有详细的吗,还有B站的视频是你制作的吗

@DerekYRC
Copy link
Owner Author

DerekYRC commented Apr 1, 2024

@junli02 主要看代码吧,结合changelog看代码应该够了。B站的视频是我授权给别人制作的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
discussion discussion good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests