实现一个简单的SpringBoot

本文通过模仿SpringBoot启动流程实现一个简单的SpringBoot,其实就是比葫芦画瓢。

目录结构:
在这里插入图片描述

1、加上maven依赖

因为我们要启动一个tomcat所以需要有相关的依赖
我们直接用springboot里的tomcat就行

<properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.2.1.RELEASE</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

2、模仿@SpringBootApplication注解

@SpringBootApplication
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

}

我们看到启动时根据@SpringBootApplication注解来的,所以我们打开这个注解照着他的样子自己写一个类似的注解CustomSprintBootApplication

@Target(ElementType.TYPE) // 可以写到 类上
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@ComponentScan// 默认从声明此注释的类的包进行扫描
public @interface CustomSprintBootApplication {
}

3、模仿SpringApplication.run(SpringbootApplication.class, args);

SpringApplication.run(SpringbootApplication.class, args);

CustomSpringBootApplication

package com.yuan.springboot.autoconfigure;

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;

/**
 * @author liuyuan on 2024/8/17
 */
public class CustomSpringBootApplication {


    /**
     *
     * @param clazz 这个是配置类 传入到 AnnotationConfigWebApplicationContext中 开始解析配置
     */
    public static void run(Class clazz){
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.register(clazz);

        startTomcat(applicationContext);

    }

    /**
     *
      依赖是这个
     <dependency>
     <groupId>org.apache.tomcat.embed</groupId>
     <artifactId>tomcat-embed-core</artifactId>
     <version>9.0.33</version>
     </dependency>


     */
    private static void startTomcat(WebApplicationContext webApplicationContext){
        Tomcat tomcat=new Tomcat();
        Service service = tomcat.getService();

        Connector connector=new Connector();
        connector.setPort(8090);
        connector.setURIEncoding("UTF-8");

        Engine engine=new StandardEngine();
        engine.setDefaultHost("localhost");

        Host host=new StandardHost();
        host.setName("localhost");

        Context context=new StandardContext();
        context.setPath("");
        context.addLifecycleListener(new Tomcat.FixContextListener());

        host.addChild(context);
        engine.addChild(host);

        service.setContainer(engine);
        service.addConnector(connector);

        //
        tomcat.addServlet("","dispatcher",new DispatcherServlet(webApplicationContext));
        context.addServletMappingDecoded("/*","dispatcher");

        try {
            tomcat.start();
        } catch (LifecycleException e) {
            e.printStackTrace();
        }


    }
}

4、模仿启动类

@CustomSprintBootApplication
public class MyselfSpringBootApplication {

    public static void main(String[] args) {
        // 仿照 springboot  传入当前的 配置类
        CustomSpringBootApplication.run(MyselfSpringBootApplication.class);
    }
}

5、编写测试案例启动

@Controller
public class BasicController {

    // http://127.0.0.1:8090/hello?name=lisi
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {
        return "Hello " + name;
    }

    // http://127.0.0.1:8090/user
    @RequestMapping("/user")
    @ResponseBody
    public User user() {
        User user = new User();
        user.setName("theonefx");
        user.setAge(666);
        return user;
    }

    // http://127.0.0.1:8090/save_user?name=newName&age=11
    @RequestMapping("/save_user")
    @ResponseBody
    public String saveUser(User u) {
        return "user will save: name=" + u.getName() + ", age=" + u.getAge();
    }

    // http://127.0.0.1:8090/html
    @RequestMapping("/html")
    public String html() {
        return "index.html";
    }

    @ModelAttribute
    public void parseUser(@RequestParam(name = "name", defaultValue = "unknown user") String name
            , @RequestParam(name = "age", defaultValue = "12") Integer age, User user) {
        user.setName("zhangsan");
        user.setAge(18);
    }
}

执行

 curl 'http://127.0.0.1:8090/html'
<html>
<body>
<h1>hello word!!!</h1>
<p>this is a html page</p>
</body>
</html>

curl 'http://127.0.0.1:8090/user'
{"name":"theonefx","age":666}

这样就完成一个SpringBoot简单的启动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值