30个类手写Spring核心原理之环境准备(1)
本文节选自《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弹架构 』可获取更多技术干货!
原创不易,坚持很酷,都看到这里了,小伙伴记得点赞、收藏、在看,一键三连加关注!如果你觉得内容太干,可以分享转发给朋友滋润滋润!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
基于 RUM 的前端优化理论与实践 - 性能篇(一)
作者:李振,腾讯云前端性能监控负责人 前言 对于前端来说,最重要的是体验,而在前端体验中,最为核心的就是性能。 腾讯云前端性能监控 RUM 是腾讯云的大前端领域页面质量和性能监控平台,聚焦提升用户体验。 RUM 可以为我们提供什么? 通俗点说,某用户想了解页面访问速度快,是否快,究竟有多快?怎么衡量?需要一个中立的裁判来裁决,而 RUM 的角色正是这个裁判。 本文会结合前端监控 SDK 源码 - Aegis 和 Google 最新的页面性能规范为大家讲解下列三大个主题: 前端页面性能关键指标的规范和计算规则。 如何看懂 RUM 可视化图表?并通过图表数据进行项目优化? 参与 腾讯云前端性能优化大赛,进行项目优化实践,同时还能赢取千元大奖! 页面性能指标有哪些? 在前端监控中指标众多繁杂,例如:白屏时间、首屏时间、FCP、FMP、LCP、FID、TTFB 等等,一般人难以把握。我们从中抽取一些最常见,最实用的规范跟大家一一解释。 网络连接瀑布图(TL;DR) 要解释这些指标,还是要先祭出网络连接瀑布图,想必只要对页面性能稍有了解的用户都见过这张图。 与这张图一一对应的,是浏览器里面的 p...
- 下一篇
Istio 实践手册 | 服务网格介绍
作者:xcbeyond 博客:https://xcbeyond.cn/ 公众号:程序猿技术大咖 《Istio实践手册》,从服务网格概念出发,将逐步渗透到Istio具体细节中来,旨在帮助Istio学习者、使用者快速掌握相关知识点,可作为 Istio 学习、实践手册,建议收藏!(不断更新中……) 在上一节《迎接新一代微服务架构》中,我们知道服务网格经历了 4 个重要阶段: 耦合阶段:高度耦合、重复实现、维护困难,在耦合架构设计中体现的最为突出,单体架构就是典型的代表。 公共 SDK:让基础设施功能设计成为公共 SDK,提高利用率,是解藕最有效的途径,比如 Spring Cloud 就是类似的方式。但学习成本高、特定语言实现,却将一部分人拦在了门外。 Sidecar 模式:再次深度解藕,不单单功能解藕,更从跨语言、更新发布和运维等方面入手,实现对业务服务的零侵入,更解藕于开发语言和单一技术栈,实现了完全隔离,为部署、升级带来了便利,做到了真正的基础设施层与业务逻辑层的彻底解耦。另一方面,Sidecar 可以更加快速地为应用服务提供更灵活的扩展,而不需要应用服务的大量改造。 Service ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS关闭SELinux安全模块
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7