手撸一个简易版SpringBoot
前言
提示 :本次作者使用的环境是Windows10+jdk1.8+maven3.6.1 + idea2020.03
注:本版本只是一个简易版本的Springboot,更多功能可以自己自己去扩充,新手上路,老鸟勿喷,欢迎所有热爱java的朋友加作者wx:W979578444一起探讨
一、导入maven相关依赖(pom.xml)
代码如下(示例):
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<!-- spring上下文-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!--文件上传依赖的两个jar包-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<!--tomcat-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>9.0.30</version>
</dependency>
</dependencies>
二、新建自定义注解
代码如下(示例):
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@ComponentScan
public @interface XiaowangSpringBootApplication {
}
三、配置Tomcat相关
代码如下(示例):
3.1 配置文件application.properties
server.port=9090
3.2创建Tomcat启动所需的相关配置
public class XiaowangSpringApplication {
private static Integer PORT;
static {
//读取配置文件设置tomcat启动端口,其他相关配置可另行扩展service.port=9090
InputStream is = XiaowangSpringApplication.class.getClassLoader().getResourceAsStream("application.properties");
Properties props = new Properties();
try {
props.load(is);
String port = props.getProperty("server.port");
PORT = Integer.parseInt(port);
} catch (Exception e) {
e.printStackTrace();
}
}
public static ConfigurableApplicationContext run(Class config) {
//创建web应用上下文对象
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.register(config);
applicationContext.refresh();
startTomcat(applicationContext);
return applicationContext;
}
private static Tomcat startTomcat(AnnotationConfigWebApplicationContext applicationContext) {
//创建一个tomcat对象
Tomcat tomcat = new Tomcat();
Server server = tomcat.getServer();
Service service = server.findService("Tomcat");
Connector connector = new Connector();
//加载配置文件,如果配置文件没有设置端口号默认8080
if (null == PORT) {
connector.setPort(8080);
} else {
connector.setPort(PORT);
}
Engine engine = new StandardEngine();
//设置默认的主机localhost
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添加一个dispatcher前端控制器,tomcat中的web.xml
tomcat.addServlet(contextPath, "dispatcher", new DispatcherServlet(applicationContext));
context.addServletMappingDecoded("/*", "dispatcher");
try {
tomcat.start();
} catch (LifecycleException e) {
e.printStackTrace();
}
return tomcat;
}
}
四、创建一个启动类入口
@XiaowangSpringBootApplication
public class XiaowangApplication{
public static void main(String[] args) {
XiaowangSpringApplication.run(XiaowangBoot.class);
}
}
五、创建一个控制器入口Controller
@RestController
@RequestMapping("/xiaowang")
public class XIaowangController {
@RequestMapping("/test")
public String test() {
return "xiaowangSpringboot";
}
}
五、启动应用
六、测试接口
地址栏:http://localhost:9090/xiaowang/test
最后来一张包目录结构