手写SpringBoot

添加pom依赖
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhouzj</groupId>
<artifactId>my-spring-boot-1.0</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.28</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>8.5.28</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
新建ServletConfig.java 配置视图解析器
package com.zhouzj.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
/**
* SpringMVC 配置信息 </br>
*
* @EnableWebMvc 开启SpringMVC功能 </br>
*
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午9:52:46 </br>
*
*/
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.zhouzj.controller"})
public class ServletConfig implements WebMvcConfigurer {
//配置视图解析器
//创建SpringMVC视图解析器
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
//配置jsp页面可以通过${}访问beans
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
}
新建RootConfig.java 根配置
/**
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午10:12:38 </br>
*/
package com.zhouzj.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 根配置 </br>
*
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午10:12:38 </br>
*
*/
@Configuration
@ComponentScan(basePackages = {"com.zhouzj"})
public class RootConfig {
}
新建DispatcherServletInitializerApp.java 创建DispatcherServlet
package com.zhouzj.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* 加载SpringMVC---DispatcherServlet </br>
*
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午10:02:17 </br>
*
*/
public class DispatcherServletInitializerApp extends AbstractAnnotationConfigDispatcherServletInitializer {
// 加载根配置信息 Spring 核心
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {RootConfig.class};
}
// SpringMVC 加载配置信息
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {ServletConfig.class};
}
// SpringMVC拦截url的映射
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
新建SpringBootApp.java 使用java代码创建tomcat
/**
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午10:16:15 </br>
*/
package com.zhouzj.boot;
import java.io.File;
import javax.servlet.ServletException;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;
/**
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午10:16:15 </br>
*
*/
public class SpringBootApp {
private static int PORT = 8080;
private static String PATH = "target/classes";
public static void start() {
//创建Tomcat容器
Tomcat tomcat = new Tomcat();
//设置tomcat端口号
tomcat.setPort(PORT);
//添加项目读取路径
StandardContext standardContext = null;
try {
standardContext = (StandardContext) tomcat.addWebapp("/", new File("src/main").getAbsolutePath());
} catch (ServletException e) {
e.printStackTrace();
}
//禁止重新载入
standardContext.setReloadable(false);
//创建WebRoot
StandardRoot standardRoot = new StandardRoot(standardContext);
//获取class文件读取地址
File fileClasses = new File(PATH);
//tomcat读取classes执行
standardRoot.addPreResources(new DirResourceSet(standardRoot, "/WEB-INF/classes", fileClasses.getAbsolutePath(), "/"));
try {
tomcat.start();
} catch (LifecycleException e) {
e.printStackTrace();
}
//异步等待请求执行
tomcat.getServer().await();
}
}
扩展------使用注解方式启动
新建SpringBootApplication.java 编写自定义注解类
/**
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午11:20:15 </br>
*/
package com.zhouzj.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 定义启动类注解
*
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午11:20:15 </br>
*
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SpringBootApplication {
}
新建SpringApplication.java 编写注解业务
package com.zhouzj.boot;
import org.springframework.util.StringUtils;
import com.zhouzj.annotation.SpringBootApplication;
/**
*
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午11:45:05 </br>
*/
public class SpringApplication {
public static void run(Class<?> classes, String[] args) {
SpringBootApplication annotation = classes.getDeclaredAnnotation(SpringBootApplication.class);
if (!StringUtils.isEmpty(annotation)) {
SpringBootApp.start();
}
}
}
新建SpringBootApp.java SpringBoot启动类
package com.zhouzj.boot;
import org.springframework.util.StringUtils;
import com.zhouzj.annotation.SpringBootApplication;
/**
*
* @author 作者 :zhouzj </br>
* @version 创建时间:2019年5月26日 上午11:45:05 </br>
*/
public class SpringApplication {
public static void run(Class<?> classes, String[] args) {
SpringBootApplication annotation = classes.getDeclaredAnnotation(SpringBootApplication.class);
if (!StringUtils.isEmpty(annotation)) {
SpringBootApp.start();
}
}
}