文章目录
- 1 前言
- 1 创建我们自己的pringboot模块
- 1.1 引入相关依赖
- 1.1 启动类注解
- 1.2 启动类
- 2 测试模块
- 3 启动测试
- 结语
1 前言
springboot有以下作用:
- 简化配置:Spring Boot提供了一组预定义的自动配置选项,可以快速地配置应用程序,减少了开发人员的配置工作量。
- 内嵌服务器:Spring Boot集成了Tomcat、Jetty或Undertow等Web服务器,可以快速启动Web应用程序并进行开发和测试。
- 简化依赖:Spring Boot采用了“约定优于配置”的理念,可以减少开发人员在配置依赖项时的复杂度,使应用程序的依赖管理更加容易。
- 提供Actuator监控和管理:Spring Boot提供了Actuator框架,可以通过REST API监控和管理应用程序,包括获取应用程序健康状态、查看应用程序运行时信息等。
- 可扩展性:Spring Boot可以与许多其他Spring项目(如Spring Data、Spring Security等)无缝集成,从而扩展应用程序的功能。
- 易于部署: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 {
@Autowired
private UserService userService;
@GetMapping
public 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