目前我在互联网行业已经工作5年以上了,回想起刚毕业时刚刚接触Spring框架,做了一个专利管理系统,后续工作中负责过交易型业务,贷前和贷后业务,支付业务等。现在主要深耕营销活动领域,不管是自己开发还是依赖别人的中间件,对于java研发来说,Spring已经成为开发中必不可少的框架。
相信大家对于Spring的使用一定非常熟悉。那么我们想一想,如果没有Spring框架的话,我们在开发一个web接口,或者是一个数据库事物,我们又是如何去实现的呢?在本专栏中让我们带着这些问题去探究Spring框架是如何把这些功能实现的?
本章内容是Spring的开篇,该专栏的学习方式是带着问题找答案,大家可以把自己想象成一个侦探,给自己多提问题,寻找答案的过程就是在破案,我尽量把内容做的生动好理解,希望大家在读完文章后能有所收获。
我是这样思考这个问题的,首先我们在做一件事情之前,一定会去想做这件事帮助我们解决了什么问题,带来什么好处,我为什么要去做。就比如我要看源码,我为什么要看源码?如果不看源码,只关注相关功能,一样能够满足工作要求。
但是如果只关注功能,不了解背后的运行原理,我们很难在技术上有所提升,阅读优秀的源码能让技术有质的提升,还能在阅读中学习新的想法和方案。
所以在后面Spring框架源码学习的过程中,我都会做一个开篇提问的步骤,这样做呢,能够在后面学习内容的时候,我们能够紧紧的扣住问题。让自己多去想问题,多思考才会有启发,让知识融会贯通。
下面就进入到Spring的正文内容,让我们开启学习Spring源码的之旅吧!
如果没有Spring框架加持的话,我们使用servlet编程暴露一个接口,估计很多人在一开始就接触Spring的话,如果Servlet不知道是什么。咳咳……这得补补课去啦。
注意,因为使用servlet容器,项目需要打成war包
目录结构
对外暴露HelloServletController
类,重点注意WEB-INF/web.xml
文件,该文件中映射接口访问路径,这样才能在浏览器中访问到
可以参考下图tomcat官方的servlet和tomcat、jdk版本对照表,我在项目中使用的是tomcat8.5x,jdk1.8,所以选择servlet是3.1版本
官方链接:https://tomcat.apache.org/whichversion.html
maven依赖
注意打包时,指定war包
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>xtol-parentartifactId>
<groupId>com.xtolgroupId>
<version>0.0.1-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>servlet-demoartifactId>
<packaging>warpackaging>
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
<version>3.9version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.83version>
dependency>
dependencies>
project>
使用Servlet暴露接口需要继承HttpServlet,HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,其中包括doPost,doGet等方法。子类实现这些方法可以做相关操作,代码中以doGet为例。
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 集成Servlet接口,实现需要的方法
*
* @author: gyl
* @datetime: 2022-08-27 12:10
*/
public class HelloServletController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(req.getParameter("name") + ",欢迎使用Servlet!");
}
}
一个接口要写一个标签定义服务映射路径,再写一个定义服务映射的类,从而对外暴露接口
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Servlet Applicationdisplay-name>
<servlet>
<servlet-name>helloServletControllerservlet-name>
<servlet-class>com.xtol.servlet.HelloServletControllerservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloServletControllerservlet-name>
<url-pattern>/hello/*url-pattern>
servlet-mapping>
web-app>
配置tomcat应用,指定服务版本,一定要保证tomcat+servlet+jdk
三个版本保持跟上面对照图的关系一致,否则出现不兼容问题就很棘手了
配置好tomcat后,引入war包,一定注意右侧红框中的Application context的内容跟浏览器要保持输入一致,如果只有左斜杠“/
”的话,按照上面接口映射关系,访问路径是:http://localhost:8080/hello?name=无敌银
。
如果把左斜杠换成/aaa
,那么在访问时在8080端口后面需要把/aaa
也加上,例如:http://localhost:8080/aaa/hello?name=无敌银
因为我们暴露的是get请求方式的接口,所以直接在浏览器模拟就行,这样一个Servlet暴露的接口就完成了
先使用spring boot搭建项目,这样可以减少很多默认的配置,因为spring boot的思想是约定大于配置,这样也可以减少引用jar包解决版本冲突问题。
目录结构
对外暴露HelloController
类,在使用Spring框架后,因为在类中使用@RequestMapping
、@RestController
、@GetMapping
三个注解就完成接口暴露,所以不再需要web.xml
中编写接口映射关系
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>xtol-parentartifactId>
<groupId>com.xtolgroupId>
<version>0.0.1-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>spring-demoartifactId>
<packaging>jarpackaging>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.2.4.RELEASEversion>
dependency>
dependencies>
project>
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: gyl
* @datetime: 2022-08-27 14:32
*/
@RequestMapping
@RestController
public class HelloController {
@GetMapping("/spring_hello")
public String hello(String name) {
return name + ",你好";
}
}
通过使用Servlet
和Spring
框架对外暴露一个Controller接口,Servlet需要配置一个web.xml
,增加一个接口就需要增加一个映射关系,一个系统中接口很多,维护起来会很复杂。另外Servlet的接口类需要继承HttpServlet
操作不友好,一个Controller类只能提供一个接口,这些问题在Spring中都不存在了,不需要维护web.xml文件,一个类中写不同的方法就可以提供多个接口了
参考对比:
综上由此可见,Spring框架帮助开发同学解放双手,把一些复杂的编码操作变得简单容易。当然上面内容只是Spring框架功能中的冰山一角。从此片文章开始入门。