# springboot-homework **Repository Path**: hwangrq/springboot-homework ## Basic Information - **Project Name**: springboot-homework - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-03 - **Last Updated**: 2021-03-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## SpringBoot作业题 #### 作业要求: 自定义简易版SpringBoot,实现SpringBoot MVC及内嵌Tomcat启动、DispatcherServlet注册和组件扫描功能。 - 程序通过main方法启动,可以自动启动tomcat服务器 - 可以自动创建和加载DispatcherServlet组件到ServletContext中 - 可以自动通过@ComponentScan扫描Controller等组件 - Controller组件可以处理浏览器请求,返回响应结果 #### 作业提示: 当实现了Servlet3.0规范的容器(比如Tomcat7及以上版本)启动时,会通过SPI扩展机制自动扫描所有jar包里META-INF/services/javax.servlet.ServletContainerInitializer文件中指定的全路径类(该类需实现ServletContainerInitializer接口),并实例化该类,并回调类中的onStartup方法。 传统SpringMVC框架web.xml的配置内容: ```xml org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/app-context.xml app org.springframework.web.servlet.DispatcherServlet contextConfigLocation 1 app /app/* ``` Spring官方文档中给出了基于Servlet3.0规范如何使用Java代码实现web.xml配置的example ```java public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletCxt) { // Load Spring web application configuration //通过注解的方式初始化Spring的上下文 AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext(); //注册spring的配置类(替代传统项目中xml的configuration) ac.register(AppConfig.class); ac.refresh(); // Create and register the DispatcherServlet //基于java代码的方式初始化DispatcherServlet DispatcherServlet servlet = new DispatcherServlet(ac); ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet); registration.setLoadOnStartup(1); registration.addMapping("/app/*"); } } ``` 以上知识点为作业实现基础,以此为基础,完成简易版SpringBoot,并创建Controller,能够完成方法访问。 #### 作业实现过程: (1)创建maven工程,导入以下依赖: ```xml 1.8 org.springframework spring-web 5.0.8.RELEASE 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.springframework.boot spring-boot-maven-plugin ``` (2)创建SpringApplication 类,编写run方法(方法中要求完成tomcat的创建及启动) (3)创建spring的配置类 AppConfig该类上要通过@ComponentScan来进行包扫描 (4)创建MyWebApplicationInitializer实现WebApplicationInitializer接口,重写onstartup方法(WebApplicationInitializer实现web.xml的配置) ``` 提示:仿写上面Spring官方给出的例子,完成AppConfig的注册,并基于java代码的方式初始化DispatcherServlet ``` (5)创建MySpringServletContainerInitializer,实现ServletContainerInitializer接口,重写onstartup方法,方法中调用第4步中MyWebApplicationInitializer的onstartup方法 ``` 提示:Servlet 3.0+容器启动时将自动扫描类路径以查找实现Spring的Webapplicationinitializer接口的所有实现,将其放进一个Set集合中,提供给ServletContainerInitializer中onStartup方法的第一个参数。 ``` (6)创建文件:META-INF/services/javax.servlet.ServletContainerInitializer,在该文件中配置ServletContainerInitializer的实现类MyWebApplicationInitializer (7)编写一个Controller测试类及目标方法,响应输出“hello”即可 (8)编写一个启动类MyRunBoot,通过执行main方法启动服务 ``` 提示:main方法调用第2步中SpringApplication的run方法启动 ``` (9)通过浏览器对目标方法进行方法 ![img](https://s0.lgstatic.com/i/image2/M01/07/BC/CgpVE2AJF9-ATGt6AABAdRXrB9g029.png)