本文通过模仿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简单的启动。