手写SpringBoot框架

1.Maven依赖


	4.0.0
	com.weichai
	SpringBoot_Write
	0.0.1-SNAPSHOT
	SpringBoot_Write Maven Webapp
	http://maven.apache.org
	

		
		
			org.apache.tomcat.embed
			tomcat-embed-core
			9.0.10
		

		
		
			org.apache.tomcat
			tomcat-jasper
			9.0.10
		

		
			org.springframework
			spring-webmvc
			5.1.0.RELEASE
			compile
		

		
			org.springframework
			spring-web
			5.1.0.RELEASE
			compile
		

		
			junit
			junit
			3.8.1
			test
		
	
	
		SpringBoot_Write
	

2.创建tomcat容器启动类

package com.weichai.springboot;

import java.io.File;

import javax.servlet.ServletException;

import org.apache.catalina.LifecycleException;
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;

/**
    *    手写SpringBoot App启动类
 * @author linhaiy
 * @date 2019.02.13
 */
public class App {

	public final static int PORT = 8090;
	
	public static void main(String[] args) throws ServletException, LifecycleException {
		// TODO Auto-generated method stub
		start();
	}

	public static void start() throws ServletException, LifecycleException {
		// 创建Tomcat容器
		Tomcat tomcatServer = new Tomcat();
		// 端口号设置
		tomcatServer.setPort(PORT);
		// 读取项目路径 加载静态资源
		StandardContext ctx = (StandardContext) tomcatServer.addWebapp("/", new File("src/main").getAbsolutePath());
		// 禁止重新载入
		ctx.setReloadable(false);
		// class文件读取地址
		File additionWebInfClasses = new File("target/classes");
		// 创建WebRoot
		WebResourceRoot resources = new StandardRoot(ctx);
		// tomcat内部读取Class执行
		resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes", additionWebInfClasses.getAbsolutePath(), "/"));
		tomcatServer.start();
		// 异步等待请求执行
		tomcatServer.getServer().await();
	}
}

3.根配置类

package com.weichai.springboot.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
    *   根配置
 * @author linhaiy
 * @date 2019.02.13
 */
@Configuration
@ComponentScan("com.weichai.springboot")
public class RootConfig {

}

4.SpringMVC配置信息加载类

package com.weichai.springboot.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.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**
 * SpringMVC配置信息
 * @author linhaiy
 * @date 2019.02.13
 */

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.weichai.springboot.controller"})
public class WebConfig extends WebMvcConfigurerAdapter {

	/**
	 * springboot 整合jsp 最好是war
	 * InternalResourceViewResolver
	    *     创建SpringMVC视图解析器
	 * @return
	 */
	@Bean
	public ViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		viewResolver.setPrefix("/WEB-INF/views/");
		viewResolver.setSuffix(".jsp");
		// 可以在JSP页面中通过 ${} EL表达式访问beans
		viewResolver.setExposeContextBeansAsAttributes(true);
		return viewResolver;
	}
}

5.SpringMVC DispatcherServlet加载类

package com.weichai.springboot.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
    *    加载SpringMVC DispatcherServlet
 * @author linhaiy
 *
 */
public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	/**
	    *   加载根配置信息 spring核心
	 */
	@Override
	protected Class[] getRootConfigClasses() {
		// TODO Auto-generated method stub
		return new Class[] {RootConfig.class};
	}

	/**
	 * springmvc 加载 配置信息
	 */
	@Override
	protected Class[] getServletConfigClasses() {
		// TODO Auto-generated method stub
		return new Class [] {WebConfig.class};
	}

	/**
	 * SpringMVC 拦截url映射 拦截所有请求
	 */
	@Override
	protected String[] getServletMappings() {
		// TODO Auto-generated method stub
		return new String[] {"/"};
	}

}

6.业务逻辑层

package com.weichai.springboot.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

	public String index() {
		return "springboot 2.0  我正在加载UserService";
	}
}

7.控制层测试

package com.weichai.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
    *     跳转页面
 * @author linhaiy
 * @date 2019.02.13
 */
@Controller
public class UserController {

	@RequestMapping("/pageIndex")
	public String pageIndex() {
		return "pageIndex";
	}
}
package com.weichai.springboot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.weichai.springboot.service.UserService;

@RestController
public class IndexController {

	@Autowired
	private UserService userService;
	
	@RequestMapping(value = "/index", produces = "text/html;charset=UTF-8")
	public String index() {
		return userService.index();
	}
}

8.测试映射页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>




手写SpringBoot



	

纯手写SpringBoot框架,感谢支持海哥!

 

你可能感兴趣的:(源码学习分析)