共计 4584 个字符,预计需要花费 12 分钟才能阅读完成。
本文节选自《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 的筹备阶段就到此为止,大家肯定要记得本人入手操作。光看不练假把式。