-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
Comments
写得不错!!!获益匪浅,催更催更 |
作者可以考虑下mini-sprintboot吗? |
后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。 |
目前还差类型转换和解决循环依赖两节,近期会实现。不过还在纠结实现哪一套类型转换机制,spring中有两套类型类型转换机制,一套老的一套新的,偏向于新的。 |
中文版的文档怎么看不了 😢 |
不会啊,打开https://github.com/DerekYRC/mini-spring/blob/main/changelog.md |
网络的问题,好了 👍 |
大佬,AOP那块可以详细讲讲吗?感觉那个地方的类非常多,不理解为什么要那么设计。 |
AOP这块可以多花点时间看看。主流程比较简单,判断哪些类的哪些方法需要代理,然后进行代理,代理只是在JDK动态代理的基础上简单套了一层。aspectJ提供的切点表达式工具,用于捕获需要代理的类的方法。要熟悉JDK动态代理的原理,可先不看cglib代理。至于类多的问题,因为spring要遵循AOP联盟制定的规范,需要实现相关的接口,可不必关注。 |
事务实现这块可以补充下吗,谢谢大佬 |
大佬spring MVC和spring ORM都可以考虑下 |
不是什么大佬了,小开发一个。后续计划写mini-springmvc。 |
不是什么大佬了,小开发一个。事务这块,没有深入研究事务传播行为的代码,但是如果实现spring的事务没有考虑是我传播行为的话就没有灵魂。我先记下,后续研究清楚考虑实现下。 我简单讲下spring事务的实现方式,主要看PlatformTransactionManager接口,有三个重要的方法,可以看为JDBC提供的的实现类DataSourceTransactionManager。 |
这就去点 星 |
老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。 |
谢谢 |
谢谢老哥,没想到真的有小伙伴看完,挺感动的!!! 为了方便理解,循环依赖部分的内容我会拆成两小节来讲解: 第一小节的功能代码已经写好了,待补充changelog,再提交代码。 这周末会全部完成两小节,你可以帮忙review代码补充下。 |
坐等老哥代码,哈哈哈 |
老哥,代码提交了,帮忙review下。 |
review谈不上,主要还是跟老哥学习。spring 支持两种循环依赖方式,A和B都根据setter方法注入,还有一种是如果自然顺序,A注册排在B前面,A使用setter方法注入B,B可以使用构造器方法注入A。这里代码是只支持A、B都使用setter注入的。 老哥你的DefaultSingletonBeanRegistry里面几个方法不加synchronized了吗,addSingleton方法没有删除二、三级缓存里面的内容。 |
谢谢你的建议!本项目侧重于讲解原理部分,不追求功能完备。 |
因为单例Bean是归所有调用者共享的,不是线程安全的。如果多个用户,同时操作同一个Bean,就会出现线程不安全问题,所以getSingleton类似的方法需要加上synchronized。我的理解是,非懒加载的Bean在容器加载完毕就完成了整个生命周期流程,但是懒加载的Bean可能同时被多个用户getBean,就存在并发问题,所以addSingleton、addSingletonFactory也要加上synchronized;多个用户可能通过registerSingleton注册同一个Bean,也要加synchronized。 |
老哥,还有singletonObjects改成ConcurrentHashMap比较好 |
受教了。毕竟是简化版的spring,就不考虑实现懒加载了。 |
我觉得还是写springboot好一点,mvc内容并不多 |
原理性的东西还是看spring吧,springboot在spring的基础上封装了一层。 |
作者我有个问题请教下,我写到了【bean的初始化和销毁方法】 这一节,发现我对于 initialization 初始化 这个的概念的理解有点问题。在我原本的理解中,一个对象应该是分为 实例化和初始化两步,实例化就是创建一个对象,分配内存;初始化就是为这个对象的各个属性赋值。但是在Spring中,好像是将属性赋值这个步骤单独拿出来,分为了 实例化、赋值、初始化 三步,在初始化的时候是对已经完成赋值对象进行操作... |
项目做得真的很不错,获益良多。在阅读时最大的障碍就是项目架构变动之后没有及时说明,很多时候都要不断地切换分支才知道究竟改了哪里。 |
谢谢!!!每个功能对应一个分支的目的是方便对比了解改动点。 |
老哥,跟着你的文章走到@value注解这,发现个问题,比如在配置文件中有给Car的brand属性赋值,然后在.properties文件里面指定brand的值,这个值在创建car对象时是覆盖不了配置文件里面的值的,原因的话是AutowiredAnnotationBeanPostProcessor里没有去操作PropertyValues pvs,老哥看下要不要改一下 |
对,确实有这个问题,AutowiredAnnotationBeanPostProcessor中应该操作PropertyValues中的值,不然后续会被PropertyValues覆盖。可以提个issue,有兴趣可以提个pull request修复下。 |
标题:[动态代理融入bean生命周期] 如果InstantiationAwareBeanPostProcessor处理阶段返回代理对象,会导致短路,不会继续走原来的创建bean的流程,具体实现查看AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation。 代理对象的生成是不是在 AbstractAutowireCapableBeanFactory ->initializeBean ->applyBeanPostProcessorsAfterInitialization 这里。 最上面那个描述是不是有点问题,望解答 |
@xiao-peng-yu 对,这是个bug,在《没有为代理bean设置属性》章节修复了 |
感谢作者大大的回复,还没看到下面修复的部分,所以产生了这个问题。 |
@xiao-peng-yu 不用客气,有问题随时沟通 |
十分十分十分感谢老哥,有更新mini-springmvc的计划吗? |
@WuYiwen97 客气了哈,一起学习。基本学完mini-spring之后,看springmvc和springboot的代码会很轻松,mini-spring-cloud也请支持下,后面有时间可能考虑写个简化版的netty。 |
之前的spring bean 生命周期的图片怎么移除了 |
牛逼,支持,用一句话说:麻雀虽小,但五脏俱全,非常好 |
谢谢支持。保留spring核心功能的前提下尽量精简代码,希望能对你学习spring源码起到帮助,有问题随时沟通。 |
bug都抄袭下来了 |
这个人我看过,他还有公众号,了解过他说他出来框架的源码讲解,具体没去看里面的内容
|
@hexushuang @AldirchEugene 谢谢两位同学,被抄袭特别影响心情。年初跟抄袭者沟通,抄袭者目前已下架图书和注明引用出处。 |
好像我看到过这个文章,好像在公众号发布过
|
大佬,计划什么时候出min-springboot呀,刚看了你的mini-spring,真的是太棒了,受益匪浅 |
不打算写mini-springboot了,学完mini-spring,阅读springboot的源码应该会很轻松,mini-spring-cloud也请支持下 |
大佬,mini-springmvc 啥时候上线啊,给你磕一个 |
谢谢支持。不打算写mini-spring-mvc了哈,看懂spring源码之后再去读mvn源码会很轻松,可以看核心代码DispatcherServlet。 |
大佬你好,请问该如何消化这个项目呢才能更好的理解spring的原理 |
不难的哈,要有信心,可以跟着项目敲一遍代码 |
作者大大 , mini - Spring的文档只有changelog.md,我感觉稍微有点少,有详细的吗,还有B站的视频是你制作的吗 |
@junli02 主要看代码吧,结合changelog看代码应该够了。B站的视频是我授权给别人制作的。 |
如题。如果提bug,请新建issue。
The text was updated successfully, but these errors were encountered: