Jay
多谢老师,这是极客上第一门一直坚持每周完成学习的课程,自己动手实现确实比看介绍原理的文章效率高很多了。有个问题请教老师,spring框架代码已经变化很大了,未来如果要持续学习其原理,应该从哪个方向深入呢?比如是继续学习Ioc mvc...的最新代码,还是去探索spring cloud的原理呢?
作者回复:我个人的建议,自己写一个应用框架,实战中遇到问题再回头学Spring框架源代码。之后,再学Spring cloud(不是使用,也是动手写一个简单的),再之后,自己做一个低代码平台。
2023-05-01
1
peter
感谢老师的精彩讲解,期待能够再次相遇。
Q1:可以开Tomcat的课程吗?
Q2:本专栏侧重spring的核心技术。除了核心模块外,还有很多模块。其他模块是以插件的形式集成到系统中吗?
Q3:怎么阅读spring源码?用sourceInsight还是Idea?有的人说直接在Idea中就可以。Spring源码阅读,有什么好的文字或视频资料?
Q4:没有请求的情况下怎么访问数据库?
SpringBoot项目,controller中自动注入service,service中自动注入Mapper。请求来了之后,由controller处理,controller调用自动注入的service,service再调用自动注入的Mapper,这是典型的ssm流程。
但是,现在有一个需求:软件启动后,需要访问数据库,此时并没有用户请求。
软件启动后,采用上面所说的典型ssm方法,失败了,原因好像是controller中注入的service是null,不知道为什么没有成功注入。(或者是service中自动注入的mappter是null,两年前做的,有点记不清楚了)。
Ssm方法失败后,我现在的实现方法是:controller的构造函数中使用JDBC访问数据库,能够成功访问。
问题:软件启动后,controller的构造函数执行了,说明controller被实例化了,此时service会自动注入吗?
作者回复:感谢Peter的耐心,学到了最后。
Tomcat的课程,得跟平台商量,现在还是未知。
别的模块都是插件式的,可以一个一个分别学习,直接在Idea中就好。
Q4你这是第二次问的,首先你没有弄清楚controller-service的分层结构是干什么的,controller这层的目的是为了对外部客户端的访问,系统内部不需要使用。因此,启动的时候,进行初始化,根本不应该涉及到controller这一层。出现的问题,应该是mapper为null,但是至于为什么会是null,得看配置,是不是没有扫描到mapper文件,是不是手工指定了bean的加载order或者是lazy方式。
一般为了初始化,在ApplicationRunner 的run()中写。
2023-05-03
4
张申傲
跟着老师一起,系统拆解下 Spring 的底层原理
2023-05-05
兔2🐰🍃
感谢郭屹老师,
本节完整代码如下,需要的同学可以照着敲。
https://gitee.com/rabbit2/mini-spring/commit/1bf7247dd8568b5ce33134078efa2e4824816cf8
作者回复:善事。记得注明原始出处。感谢你的热心。
2023-04-12
1
Geek_320730
https://github.com/kuifir/practice/tree/master/miniSpring 跟着老师每节课程跟着学完都很有收获,完成一个课程的内容并且测试成功后也很有成就感。
作者回复:动手是诀窍,事情要经过手才行。
2023-04-11
4
人老实话不多
在属性注入之前,我们不能都把用到的Bean实例化吗?反正都是单例的,到最后所有的属性都会赋完值的,是吧老师?这样会有什么问题吗?还是说这样违背了Spring管理Bean生命周期的理念?
作者回复:我认为这样违背了bean生命周期。
2023-04-13
Michael
Resource抽象挺好的,但是XmlBeanDefinitionReader的loadBeanDefinition依赖了Resource抽象,到这儿都没问题,但是XmlBeanDefinitionReader.loadBeanDefinition的实现里面直接转型 Element那这个貌似就不对了吧,这样的话抽象就没用了,还是跟XML实现绑死了,是不是应该定义一系列自己的了类来抽象不同的格式?这样Resource直接操作的就是自己定义的类,Resource抽象才能发挥作用?
仅仅是自己的想法,望老师斧正!
作者回复:认识不同。要我用另一种格式,我会用另一个与xmlbeandefinitionreader并列的类。
2023-04-15
梦某人
打卡成功,从理解上这节课并不难,虽然很多代码(主要是User类和一些辅助)需要参考GitHub不然无法进行。但是调整环境浪费了接近2个小时,因为访问jsp一直报404的错误,后来意识到是没在idea的Project Structe 中的 Module设置资源文件夹。。。。另外目前的返回来讲,string包装成了 ModelAndView,但是这样做在reander的时候无法辨别,导致最基础的 /test反而无法访问。思考题来说,View的两个类,一个负责分析内容,一个负责渲染内容,将 ViewResolver 进行扩展就可以解决相关问题了。
2023-04-18
1
胡多多
老师太棒了,送爱心
作者回复:感谢感谢
2023-04-19
KernelStone
两三天时间,这节课内容断续思考和动手。终于算清楚了。用户“姐姐”总结得的很好!我尝试做额外的补充。
首先是设计模式方面的问题,看评论区有同学在纠结。如果先前看过相关的资料,应该可以反应过来这里是工厂方法,其目的就是将创建和使用两部分代码解耦分离。这是大前提。而内容后半段,抽取出了XmlBeanDefinitionReader,其实是出于“单一职责”的设计思想。这样有利于代码可读,也有利于可复用。
之所以取名为SimpleBeanFactory,而不是什么XmlBeanFactory,因为它的主要职责是不区分Resource,只提供getBean()和registerBeanDefinition()这两个方法。这一点结合BeanDefinition和beans.xml文件去看,会发现,id其实是“对象的名称”,而class其实是“生成该对象的模板”,二者共同存储在一个HashMap中。两行重要的代码如下:
1 singleton=Class.forName(`bd.getClassName()`).newInstance();
2 singletons.put(`bd.getId()`,singleton);
总而言之,我们是通过id,找到class这个单例的。id就像是引用,接口作为引用,class就是具体实现,生成单例的模板。
话说回来,BeanFactory不区分Resource,那对各种不同Resource的处理,就应该放在XXXApplicationContext上下文和XXXBeanDefinitionReader读取器中。就是具体资源的上下文,以及具体资源的读取器,才需要负责具体资源的注入。这也很合理。
----
个人理解,可能有误,不过这么整理下来,感觉内容就很清晰了,没有一开始看的时候感觉那么多!anyway谢谢老师。我继续加油往后学习
作者回复:大赞👍🏻
2023-04-19
编辑推荐
讲师的其他课程
包含这门课的学习路径
Java工程师
29门课程 154.8w人学习
看过的人还看了