前言
为了巩固学习Spring框架,我尝试通过手写spring,实现SpringMVC基本功能来学习Spring源码。
实现功能
这次先写了一个简易的框架,实现了最基本的IoC功能,以及springmvc中常用的注解,具体如下:
@Controller
@RequestMapping
@RequestParam
@Autowired
@Bean
代码
内嵌服务器
采用了apache的embed-core
包在项目中内置了一个tomcat服务器,直接调用一个自己写的start()方法即可启动。本包在gradle中依赖如下:
// https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-corecompile
group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '8.5.23'
下面是TomcatServer类:
/**
* Created by makersy on 2019
*/
public class TomcatServer {
private Tomcat tomcat;
private String[] args;
public TomcatServer(String[] args) {
this.args = args;
}
//启动类
public void startTomcat() throws LifecycleException {
tomcat = new Tomcat();
tomcat.setPort(6699);
tomcat.start();
Context context = new StandardContext();
context.setPath("");
context.addLifecycleListener(new Tomcat.FixContextListener()); //默认监听器
DispatcherServlet servlet = new DispatcherServlet(); //前端控制器
Tomcat.addServlet(context, "dispatcherServlet", servlet).setAsyncSupported(true); //支持异步的servlet
context.addServletMappingDecoded("/", "dispatcherServlet"); //为Servlet绑定映射,/表示可以处理所有uri
tomcat.getHost().addChild(context);
Thread awaitThread = new Thread("tomcat_await_thread"){
@Override
public void run() {
TomcatServer.this.tomcat.getServer().await(); //声明该线程一直在等待
}
};
//设置为非守护线程
awaitThread.setDaemon(false);
//使该线程等待
awaitThread.start();
}
}
DispatcherServlet(用来维护Servlet)
DispatcherServlet类进行servlet的维护,实现请求分发。
/**
* Created by makersy on 2019
*/
public class DispatcherServlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
for (MappingHandler mappingHandler : HandlerManager.mappingHandlerList) {
try {
if (mappingHandler.handle(req, res)) {
return;
}
} catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace