本文节选自《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的筹备阶段就到此为止,大家肯定要记得本人入手操作。光看不练假把式。