当前位置: 首页 > 科技观察

30手写Spring核心原理环境准备

时间:2023-03-16 19:03:55 科技观察

1IDEA集成Lombok插件1.1安装插件IntelliJIDEA是一款非常不错的集成开发工具,功能强大,插件众多。Lombok是一个开源代码生成库。这是一个非常实用的工具。我们在编辑实体类时可以使用Lombok注解来减少getters和setters等方法的编写。在更改实体类时,我们只需要修改属性即可,减少了很多重复的代码编写工作。首先需要在IntelliJIDEA中安装Lombok插件。打开IntelliJIDEA后,点击菜单栏中的File→Settings(如下图),或者使用快捷键Ctrl+Alt+S进入设置界面。在设置界面点击Plugins安装插件,点击右侧的Browserepositories按钮,如下图。然后在搜索界面输入lombok查询下面的LombokPlugin,点击LombokPlugin可以看到右边的Install按钮,点击这个按钮开始安装,如下图。我们可以在如下安装界面看到Lombok支持的所有注解。安装过程中有DownloadingPlugins的提示,安装过程中进度条会发生变化。需要提醒的是,安装过程中网络连接必须可用且良好,否则可能会安装失败。安装成功后,可以看到下图右侧的RestartIntelliJIDEA按钮。此时不能操作,因为还有后续的配置工作。回到Plugins,在下图右侧可以找到Lombok(但安装前没有)。1.2配置注解处理器在如下设置界面点击Build、Execution、Deployment→Compiler→AnnotationProcessors,然后勾选右侧的Enableannotationprocessing选项。1.3使用插件在使用之前需要说明一下,安装的插件只是一个调用,就像我们使用maven插件一样,需要机器安装maven。在使用Lombok之前,我们还需要在pom.xml文件中添加Lombok依赖项。#托管类扫描包路径#org.projectlomboklombok1.16.10接下来编辑一个Config测试类,添加两个属性,最后给类加上@Data属性。这个注解可以帮助我们在.class文件中为类中的所有属性生成get/set、equals、canEqual、hashCode、toString方法,如下图所示。我们也可以通过以下方式查看Lombok生成的方法。点击菜单栏中的View→ToolWindows→Structure,可以看到类中的所有方法,都是Lombok自动生成的,如下两图所示。2从Servlet到ApplicationContext在《300行代码手写提炼Spring核心原理》一章中,我们了解到SpringMVC的入口是DispatcherServet,实现了DispatcherServlet的init()方法,完成了IoC在init()方法中初始化容器。在使用Spring的过程中,看到最多的就是ApplicationContext。似乎所有Spring管理的实例bean都可以通过调用getBean()方法获取。那么ApplicationContext从何而来呢?从Spring源码可以看出,DispatcherServlet的类图如下图所示。DispatcherServlet继承FrameworkServlet,FrameworkServlet继承HttpServletBean,HttpServletBean继承HttpServlet。在HttpServletBean的init()方法中,调用了FrameworkServlet的initServletBean()方法,在initServletBean()方法中初始化了WebApplicationContext实例。在initServletBean()方法中调用了DispatcherServlet重写的onRefresh()方法。在DispatcherServlet的onRefresh()方法中,调用了initStrategies()方法对SpringMVC的九个组件进行初始化。其实从上面复杂的调用关系可以得出一个结论:在Servlet的init()方法中,初始化了IoC容器和SpringMVC所依赖的九个组件。手写之前先画出框架类关系,如下图,顺便回顾一下我们之前讲的IoC容器结构。3.准备基本配置。在开始手写之前,我们先约定好所有手写类都以GP开头,以区别于Spring框架中的原生类,方便对比理解。例如,DispatcherServlet在这个Mini版本中将被命名为GPDispatcherServlet。所有的方法名尽量和原生Spring一致。有些参数表可能会微调,主要是为了理解设计思路。3.1application.properties的配置从application.properties文件开始,将application.xml替换为application.properties。具体配置如下:#Hosted类扫描包路径#scanPackage=com.gupaoedu.vip.spring.demo3.2pom.xml配置接下来看pom.xml的配置,主要关注jar包依赖:2.4javax.servletservlet-api${servlet.api.version}providedorg.projectlomboklombok1.16.10/dependency>org.slf4j资源slf4j-api1.7.25ch.qos.logbacklogback-classic1.2.33.3web.xml配置web.xml配置如下:GupaoSpringApplicationgupaomvccom.gupaoedu.vip.spring.formework.webmvc.servlet.GPDispatcherServletcontextConfigLocationclasspath:application.properties1gupaomvc/*3.4GPDispatcherServletGPDispatcherServlet代码如下:packagecom.gupaoedu.vip.spring.formework.webmvc.servlet;importjavax.servlet.ServletConfig;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;//Servlet只是作为一个MVC的启动接口publicclassGPDispatcherServletextendsHttpServlet{@Overridepublicvoidinit(ServletConfigconfig)throwsServletException{}@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{this.doPost(req,resp);}@OverrideprotectedvoiddoPostrep(HtpServletRequestreq,HttpServletResponseresp)letResponseresp)throwsServletException,IOException{}}30个类手写一个Spring的准备阶段到此结束。大家一定要记得自己动手。