写点什么

30 个类手写 Spring 核心原理之环境准备(1)

作者:Tom弹架构
  • 2021 年 12 月 09 日
  • 本文字数:3273 字

    阅读完需:约 11 分钟

本文节选自《Spring 5 核心原理》

1 IDEA 集成 Lombok 插件

1.1 安装插件

IntelliJ IDEA 是一款非常优秀的集成开发工具,功能强大,而且插件众多。Lombok 是开源的代码生成库,是一款非常实用的小工具,我们在编辑实体类时可以通过 Lombok 注解减少 getter、setter 等方法的编写,在更改实体类时只需要修改属性即可,减少了很多重复代码的编写工作。首先需要安装 IntelliJ IDEA 中的 Lombok 插件,打开 IntelliJ IDEA 后单击菜单栏中的 File→Settings(如下图所示),或者使用快捷键 Ctrl+Alt+S 进入设置界面。



单击设置界面中的 Plugins 进行插件的安装,在右侧单击 Browse repositories 按钮,如下图所示。



然后在搜索界面中输入 lombok 可以查询到下方的 Lombok Plugin,单击 Lombok Plugin 可在右侧看到 Install 按钮,单击该按钮便可开始安装,如下图所示。



我们在如下安装界面可以看到 Lombok 支持的所有注解。



在安装过程中有 Downloading Plugins 的提示,安装过程中进度条会变化。需要提醒的是,在安装过程中一定要保证网络连接可用且良好,否则可能会安装失败。安装成功后可以看到下图右侧的 Restart IntelliJ IDEA 按钮,此时可先不操作,因为还有后续的配置工作。



回到 Plugins,此时在下图右侧可以搜索到 Lombok(而安装前搜索不到)。


1.2 配置注解处理器

在如下设置界面单击 Build, Execution, Deployment→Compiler→Annotation Processors,然后在右侧勾选 Enable annotation processing 复选项即可。


1.3 使用插件

使用前需要说明的是,安装的插件只是一个调用,就像我们使用 maven 插件一样,本机需要安装 maven 才行。我们在使用 Lombok 前也需要在 pom.xml 文件中添加 Lombok 的依赖。



#托管的类扫描包路径#<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version></dependency>
复制代码


接下来编辑一个 Config 测试类,添加两个属性,最后在类上添加 @Data 属性,这个注解可以帮我们在.class 文件中生成类中所有属性的 get/set、equals、canEqual、hashCode、toString 方法等,如下图所示。



我们还可以通过下面的方式查看 Lombok 生成的方法。在菜单栏中单击 View→Tool Windows→Structure,便可以看到类中所有的方法,这些都是 Lombok 自动生成的,如下面两图所示。



2 从 Servlet 到 ApplicationContext

在“用 300 行代码手写提炼 Spring 核心原理”一章中,我们已经了解 Spring MVC 的入口是 DispatcherSerlvet,并实现了 DispatcherServlet 的 init()方法,在 init()方法中完成了 IoC 容器的初始化。而在使用 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()方法,初始化 Spring MVC 的九大组件。其实,通过上面复杂的调用关系可以得出一个结论:在 Servlet 的 init()方法中初始化了 IoC 容器和 Spring MVC 所依赖的九大组件。在手写之前先将框架类关系画出来,如下图所示,顺便也回顾一下我们之前讲过的 IoC 容器结构。


3 准备基础配置

在开始手写之前我们先做一个约定,所有的手写类都以 GP 开头,以区别于 Spring 框架中的原生类,方便对比理解。如 DispatcherServlet 在这个 Mini 版本中会命名为 GPDispatcherServlet,所有的方法名尽量和原生 Spring 保持一致,可能有些参数列表会做一些微调,主要目的是理解设计思路。

3.1 application.properties 配置

还是先从 application.properties 文件开始,用 application.properties 来代替 application.xml,具体配置如下:



#托管的类扫描包路径#scanPackage=com.gupaoedu.vip.spring.demo
复制代码

3.2 pom.xml 配置

接下来看 pom.xml 的配置,主要关注 jar 包依赖:



<properties> <!-- dependency versions --> <servlet.api.version>2.4</servlet.api.version></properties>
<dependencies> <!-- requied start --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet.api.version}</version> <scope>provided</scope> </dependency> <!-- requied end -->
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency>
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
</dependencies>
复制代码

3.3 web.xml 配置

web.xml 配置如下:



<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Gupao Spring Application</display-name>
<servlet> <servlet-name>gupaomvc</servlet-name> <servlet-class>com.gupaoedu.vip.spring.formework.webmvc.servlet.GPDispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>gupaomvc</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
</web-app>
复制代码

3.4 GPDispatcherServlet

GPDispatcherServlet 代码如下:



package com.gupaoedu.vip.spring.formework.webmvc.servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;//Servlet只是作为一个MVC的启动入口public class GPDispatcherServlet extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }}
复制代码


用 30 个类手写一个 Spring 的准备阶段就到此为止,大家一定要记得自己动手操作。光看不练假把式。


关注微信公众号『 Tom 弹架构 』回复“Spring”可获取完整源码。


本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。关注微信公众号『 Tom 弹架构 』可获取更多技术干货!


原创不易,坚持很酷,都看到这里了,小伙伴记得点赞、收藏、在看,一键三连加关注!如果你觉得内容太干,可以分享转发给朋友滋润滋润!

发布于: 1 小时前阅读数: 4
用户头像

Tom弹架构

关注

不只做一个技术者,更要做一个思考者 2021.10.22 加入

畅销书作者,代表作品:《Spring 5核心原理》、《Netty 4核心原理》、《设计模式就该这样学》

评论

发布
暂无评论
30个类手写Spring核心原理之环境准备(1)