springboot有以下作用:
所以有了前面spring的基础之后,我们接下来学习spirngboot。学习springboot,我们一边查看源码,一边动手模拟我们自己的springboot。
这里我们主要先学习下目前主流的springboot2.x版本。
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>
自定义注解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 {
}
注解定义好之后,就是编写应用入口类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();
}
}
}
创建我们的应用测试模块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>
启动类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);
}
}
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";
}
}
这里我们暂时没有其他集成和复杂的业务,随着我们学习的深入一步一步构建添加。
测试成功
说明:
接下来我们先分析ApplicationContext#refresh()具体做了哪些工作。
如果小伙伴什么问题或者指教,欢迎交流。
❓QQ:806797785
⭐️源代码仓库地址:https://gitee.com/gaogzhen/springboot-custom
参考:
[1]Springboot视频教程[CP/OL].P118-135.
[2]ChatGPT