mini-spring
mini-spring copied to clipboard
各位小伙伴,我是本项目的作者,想收集下问题和建议,欢迎畅所欲言,会回复每一条信息。
如题。如果提bug,请新建issue。
写得不错!!!获益匪浅,催更催更
作者可以考虑下mini-sprintboot吗?
作者可以考虑下mini-sprintboot吗?
后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。 不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。
写得不错!!!获益匪浅,催更催更
目前还差类型转换和解决循环依赖两节,近期会实现。不过还在纠结实现哪一套类型转换机制,spring中有两套类型类型转换机制,一套老的一套新的,偏向于新的。
中文版的文档怎么看不了 😢
中文版的文档怎么看不了 😢
不会啊,打开https://github.com/DerekYRC/mini-spring/blob/main/changelog.md
中文版的文档怎么看不了 😢
不会啊,打开https://github.com/DerekYRC/mini-spring/blob/main/changelog.md
网络的问题,好了 👍
大佬,AOP那块可以详细讲讲吗?感觉那个地方的类非常多,不理解为什么要那么设计。
大佬,AOP那块可以详细讲讲吗?感觉那个地方的类非常多,不理解为什么要那么设计。
AOP这块可以多花点时间看看。主流程比较简单,判断哪些类的哪些方法需要代理,然后进行代理,代理只是在JDK动态代理的基础上简单套了一层。aspectJ提供的切点表达式工具,用于捕获需要代理的类的方法。要熟悉JDK动态代理的原理,可先不看cglib代理。至于类多的问题,因为spring要遵循AOP联盟制定的规范,需要实现相关的接口,可不必关注。
事务实现这块可以补充下吗,谢谢大佬
大佬spring MVC和spring ORM都可以考虑下
大佬spring MVC和spring ORM都可以考虑下
不是什么大佬了,小开发一个。后续计划写mini-springmvc。
事务实现这块可以补充下吗,谢谢大佬
不是什么大佬了,小开发一个。事务这块,没有深入研究事务传播行为的代码,但是如果实现spring的事务没有考虑是我传播行为的话就没有灵魂。我先记下,后续研究清楚考虑实现下。
我简单讲下spring事务的实现方式,主要看PlatformTransactionManager接口,有三个重要的方法,可以看为JDBC提供的的实现类DataSourceTransactionManager。 第一步调用getTransaction方法,获取到一个数据库的连接,然后绑定到当前线程(ThreadLocal), 第二步操作数据库,获取绑定到当前线程的数据库的连接,使用该连接操作数据库, 第三步,获取绑定到当前线程的数据库的连接,使用该连接commit或者rollback 第四步,归还该连接到连接池
老哥把这些加个链接吧
一看老哥就是讲究人,准备好好学习学习。
老哥把这些加个链接吧
一看老哥就是讲究人,准备好好学习学习。
哈哈,没问题,记下了,有空改下。
作者可以考虑下mini-sprintboot吗?
后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。 不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。
这就去点 星
老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。
作者可以考虑下mini-sprintboot吗?
后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。 不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。
这就去点 星
谢谢
老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。
谢谢老哥,没想到真的有小伙伴看完,挺感动的!!!
为了方便理解,循环依赖部分的内容我会拆成两小节来讲解: 1、没有代理对象的循环依赖 2、有代理对象的循环依赖
第一小节的功能代码已经写好了,待补充changelog,再提交代码。
这周末会全部完成两小节,你可以帮忙review代码补充下。
老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。
谢谢老哥,没想到真的有小伙伴看完,挺感动的!!!
为了方便理解,循环依赖部分的内容我会拆成两小节来讲解: 1、没有代理对象的循环依赖 2、有代理对象的循环依赖
第一小节的功能代码已经写好了,待补充changelog,再提交代码。
这周末会全部完成两小节,你可以帮忙review代码补充下。
坐等老哥代码,哈哈哈
老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。
谢谢老哥,没想到真的有小伙伴看完,挺感动的!!! 为了方便理解,循环依赖部分的内容我会拆成两小节来讲解: 1、没有代理对象的循环依赖 2、有代理对象的循环依赖 第一小节的功能代码已经写好了,待补充changelog,再提交代码。 这周末会全部完成两小节,你可以帮忙review代码补充下。
坐等老哥代码,哈哈哈
老哥,代码提交了,帮忙review下。
老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个PR。
谢谢老哥,没想到真的有小伙伴看完,挺感动的!!! 为了方便理解,循环依赖部分的内容我会拆成两小节来讲解: 1、没有代理对象的循环依赖 2、有代理对象的循环依赖 第一小节的功能代码已经写好了,待补充changelog,再提交代码。 这周末会全部完成两小节,你可以帮忙review代码补充下。
坐等老哥代码,哈哈哈
老哥,代码提交了,帮忙review下。
review谈不上,主要还是跟老哥学习。spring 支持两种循环依赖方式,A和B都根据setter方法注入,还有一种是如果自然顺序,A注册排在B前面,A使用setter方法注入B,B可以使用构造器方法注入A。这里代码是只支持A、B都使用setter注入的。
老哥你的DefaultSingletonBeanRegistry里面几个方法不加synchronized了吗,addSingleton方法没有删除二、三级缓存里面的内容。
老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个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方法加了删除二、三级缓存的代码,已提交。
老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个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。
老哥,还有singletonObjects改成ConcurrentHashMap比较好
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
老哥,循环依赖有在写吗?没有在写的话,我想写一下,提个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,就不考虑实现懒加载了。
作者可以考虑下mini-sprintboot吗?
后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。 不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。
我觉得还是写springboot好一点,mvc内容并不多
作者可以考虑下mini-sprintboot吗?
后续有可能。springboot基于spring,原理性的东西主要看spring,个人觉得springboot最大的改进是为了方便使用引入了自定义的SPI(Service Provider Interface)。 不过优先实现简化版的spring mvc,立个flag,等到本项目达到 1k star时开始写mini-springmvc。
我觉得还是写springboot好一点,mvc内容并不多
原理性的东西还是看spring吧,springboot在spring的基础上封装了一层。
作者我有个问题请教下,我写到了【bean的初始化和销毁方法】 这一节,发现我对于 initialization 初始化 这个的概念的理解有点问题。在我原本的理解中,一个对象应该是分为 实例化和初始化两步,实例化就是创建一个对象,分配内存;初始化就是为这个对象的各个属性赋值。但是在Spring中,好像是将属性赋值这个步骤单独拿出来,分为了 实例化、赋值、初始化 三步,在初始化的时候是对已经完成赋值对象进行操作...
作者我有个问题请教下,我写到了【bean的初始化和销毁方法】 这一节,发现我对于 initialization 初始化 这个的概念的理解有点问题。在我原本的理解中,一个对象应该是分为 实例化和初始化两步,实例化就是创建一个对象,分配内存;初始化就是为这个对象的各个属性赋值。但是在Spring中,好像是将属性赋值这个步骤单独拿出来,分为了 实例化、赋值、初始化 三步,在初始化的时候是对已经完成赋值对象进行操作...
属性赋值阶段主要完成xml文件配置的属性赋值和注解上值的赋值,初始化阶段完成一些BeanNameAware\BeanClassLoaderAware\BeanFactoryAware等XXXAware工作和一些初始化方法,这些初始化方法可以在属性赋值后再对Bean做一些修改,有些功能需要这样加吧。而且初始化方法前后有BeanPostProcessor.postProcessBeforeInitialization()和BeanPostProcessor.postProcessAfterInitialization()方法也可以做一些特别的工作,如完成aop。初始化和销毁方法一般有三对,作用顺序如下图。属性赋值和初始化为什么分成两个阶段,我的理解是,这样设计职责清晰,而且可以完成一些特别的工作。