> 文章列表 > 0101简单模拟springboot-springboot系列

0101简单模拟springboot-springboot系列

0101简单模拟springboot-springboot系列

1 前言

springboot有以下作用:

  1. 简化配置:Spring Boot提供了一组预定义的自动配置选项,可以快速地配置应用程序,减少了开发人员的配置工作量。
  2. 内嵌服务器:Spring Boot集成了Tomcat、Jetty或Undertow等Web服务器,可以快速启动Web应用程序并进行开发和测试。
  3. 简化依赖:Spring Boot采用了“约定优于配置”的理念,可以减少开发人员在配置依赖项时的复杂度,使应用程序的依赖管理更加容易。
  4. 提供Actuator监控和管理:Spring Boot提供了Actuator框架,可以通过REST API监控和管理应用程序,包括获取应用程序健康状态、查看应用程序运行时信息等。
  5. 可扩展性:Spring Boot可以与许多其他Spring项目(如Spring Data、Spring Security等)无缝集成,从而扩展应用程序的功能。
  6. 易于部署:Spring Boot应用程序可以作为可执行的JAR文件进行打包,可以方便地部署到各种环境中,包括云计算平台、容器等。

所以有了前面spring的基础之后,我们接下来学习spirngboot。学习springboot,我们一边查看源码,一边动手模拟我们自己的springboot。

1 创建我们自己的pringboot模块

这里我们主要先学习下目前主流的springboot2.x版本。

1.1 引入相关依赖

pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>springboot-g2zh</artifactId><groupId>com.gaogzhen</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>springboot</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.25</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.25</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.3.25</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.25</version></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>9.0.60</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><version>9.2.28.v20190418</version><optional>true</optional></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency></dependencies>
</project>
  • JDK或者jar包版本根据需要,自己配置。

1.1 启动类注解

自定义注解SpringBootApplicationG2zh,功能对标@SpringBootApplication

package com.gaogzhen.springboot;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Configuration
@ComponentScan
public @interface SpringBootApplicationG2zh {
}

1.2 启动类

注解定义好之后,就是编写应用入口类SpringApplicationG2zh,代码2-1如下所示:

package com.gaogzhen.springboot;import com.gaogzhen.springboot.server.TomcatWebServer;
import com.gaogzhen.springboot.server.WebServer;
import org.apache.catalina.*;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.core.StandardEngine;
import org.apache.catalina.core.StandardHost;
import org.apache.catalina.startup.Tomcat;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;public class SpringApplicationG2zh {public static void run(Class clazz, String[] args) {AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();applicationContext.register(clazz);applicationContext.refresh();// 启动web服务器startTomcat(applicationContext);// WebServer webServer = getWebServer();// webServer.start();}/*** 启动tomcat* @param applicationContext 应用上下文*/private static void startTomcat(WebApplicationContext applicationContext) {Tomcat tomcat = new Tomcat();Server server = tomcat.getServer();Service service = server.findService("Tomcat");Connector connector = new Connector();connector.setPort(8081);Engine engine = new StandardEngine();engine.setDefaultHost("localhost");Host host = new StandardHost();host.setName("localhost");String contextPath = "";Context context = new StandardContext();context.setPath(contextPath);context.addLifecycleListener(new Tomcat.FixContextListener());host.addChild(context);engine.addChild(host);service.setContainer(engine);service.addConnector(connector);tomcat.addServlet(contextPath, "dispatcher", new DispatcherServlet(applicationContext));context.addServletMappingDecoded("/*", "dispatcher");try {tomcat.start();} catch (LifecycleException e) {e.printStackTrace();}}
}

2 测试模块

创建我们的应用测试模块user 普通的基于我们自定义的springboot的web服务,pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>springboot-g2zh</artifactId><groupId>com.gaogzhen</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>user</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.gaogzhen</groupId><artifactId>springboot</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>
  • 依赖引入我们自定义的springboot。

启动类MyApplicaton代码2-1如下所示:

package com.gaogzhen.user;import com.gaogzhen.springboot.SpringApplicationG2zh;
import com.gaogzhen.springboot.SpringBootApplicationG2zh;@SpringBootApplicationG2zh
public class MyApplication {public static void main(String[] args) {SpringApplicationG2zh.run(MyApplication.class, args);}
}
  • 类上标注的注解 为我们在#1中自定义的注解

UserController类代码2-2如下所示:

package com.gaogzhen.user.controller;import com.gaogzhen.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author gaogzhen*/
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic String getUser() {return userService.getUser();}
}

UserService代码2-3如下所示:

package com.gaogzhen.user.service;import org.springframework.stereotype.Service;@Service
public class UserService {public String getUser() {return "gaogzhen";}
}

这里我们暂时没有其他集成和复杂的业务,随着我们学习的深入一步一步构建添加。

3 启动测试

在这里插入图片描述

测试成功

说明:

  • 在之前的spring学习中,我们没有分析ApplicationContext#refresh()方法。

接下来我们先分析ApplicationContext#refresh()具体做了哪些工作。

结语

如果小伙伴什么问题或者指教,欢迎交流。

❓QQ:806797785

⭐️源代码仓库地址:https://gitee.com/gaogzhen/springboot-custom

参考:

[1]Springboot视频教程[CP/OL].P118-135.

[2]ChatGPT