(1)创建maven工程,导入以下依赖:
1.8 org.apache.tomcat.embed tomcat-embed-core 8.5.32 org.springframework spring-context 5.0.8.RELEASE org.springframework spring-webmvc 5.0.8.RELEASE org.apache.tomcat.embed tomcat-embed-jasper 8.5.32 org.springframework.boot spring-boot-maven-plugin
(2)创建SpringApplication 类,编写run方法(方法中要求完成tomcat的创建及启动)
public class MySpringApplication {
public static void run(){
//创建tomcat实例
Tomcat tomcat = new Tomcat();
//设置tomcat端口
tomcat.setPort(8080);
try {
//设置项目文件的目录
tomcat.addWebapp("/","D:\myTest");
//启动tomcat
tomcat.start();
//tomcat.start();是非阻塞型的,所以要阻塞一下,不能让服务停止。
tomcat.getServer().await();
} catch (ServletException e) {
e.printStackTrace();
} catch (LifecycleException e) {
e.printStackTrace();
}
}
}
(3)创建spring的配置类 AppConfig该类上要通过@ComponentScan来进行包扫描
@Configuration
@ComponentScan("com.lwq")
public class MyAppConfig {
}
(4)创建MyWebApplicationInitializer实现WebApplicationInitializer接口,重写onstartup方法(WebApplicationInitializer实现web.xml的配置)
public interface MyWebApplicationInitializer{
void onStartup(ServletContext servletContext);
}
public class MyWebApplicationInitializerImpl implements MyWebApplicationInitializer {
public void onStartup(ServletContext servletContext) {
System.out.println("Spring初始化");
//通过注解方式初始化spring上下文
AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext();
//注册spring的配置类
annotationConfigWebApplicationContext.register(MyAppConfig.class);
//刷新
annotationConfigWebApplicationContext.refresh();
//初始化dispatcherServlet
DispatcherServlet dispatcherServlet = new DispatcherServlet(annotationConfigWebApplicationContext);
ServletRegistration.Dynamic myDispatcherServlet = servletContext.addServlet("MyDispatcherServlet", dispatcherServlet);
myDispatcherServlet.setLoadOnStartup(1);
myDispatcherServlet.addMapping("/");
}
}
(5)创建MySpringServletContainerInitializer,实现ServletContainerInitializer接口,重写onstartup方法,方法中调用第4步中MyWebApplicationInitializer的onstartup方法
@HandlesTypes(MyWebApplicationInitializer.class)
public class MySpringServletContainerInitializer implements ServletContainerInitializer {
public void onStartup(Set> set, ServletContext servletContext) throws ServletException {
System.out.println("模拟spring初始化");
if (set != null) {
Iterator var = set.iterator();
while(var.hasNext()) {
Class> waiClass = (Class)var.next();
if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && MyWebApplicationInitializer.class.isAssignableFrom(waiClass)) {
try {
((MyWebApplicationInitializer)waiClass.newInstance()).onStartup(servletContext);
} catch (Throwable var7) {
throw new ServletException("Failed to instantiate WebApplicationInitializer class", var7);
}
}
}
}
}
}
(6)创建文件:meta-INF/services/javax.servlet.ServletContainerInitializer,在该文件中配置ServletContainerInitializer的实现类MySpringServletContainerInitializer
public class MyRunBoot {
public static void main(String[] args){
MySpringApplication.run();
}
}
@RestController
@RequestMapping("/api")
public class TestController {
@GetMapping("/test")
public String test(){
System.out.println("test");
return "test";
}
}
测试结果:



