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如下:


<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-g2zhartifactId>
        <groupId>com.gaogzhengroupId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>springbootartifactId>

    <properties>
        <maven.compiler.source>17maven.compiler.source>
        <maven.compiler.target>17maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>5.3.25version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webartifactId>
            <version>5.3.25version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aopartifactId>
            <version>5.3.25version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>5.3.25version>
        dependency>
        <dependency>
            <groupId>org.apache.tomcat.embedgroupId>
            <artifactId>tomcat-embed-coreartifactId>
            <version>9.0.60version>
        dependency>
        <dependency>
            <groupId>org.eclipse.jettygroupId>
            <artifactId>jetty-serverartifactId>
            <version>9.2.28.v20190418version>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>4.0.1version>
        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内容如下:


<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-g2zhartifactId>
        <groupId>com.gaogzhengroupId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>userartifactId>

    <properties>
        <maven.compiler.source>17maven.compiler.source>
        <maven.compiler.target>17maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>
        <dependency>
            <groupId>com.gaogzhengroupId>
            <artifactId>springbootartifactId>
            <version>1.0-SNAPSHOTversion>
        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 启动测试

0101简单模拟springboot-springboot系列_第1张图片

测试成功

说明:

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

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

结语

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

❓QQ:806797785

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

参考:

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

[2]ChatGPT

你可能感兴趣的:(#,spring全家桶,spring,boot,spring,java)