手写SpringMVC IOC,让自己爽一爽(一)

手写SpringMVC中的IOC,让自己爽一爽


要手写SpringMVC  IOC就要先对SpringMCV 的后台模式有个了解,首先是根据web.xml配置最关键的DispatcaherServlet,DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点。SpringMVC 实现WEB访问的顺序如下:


在访问时,先由DispatcherServlet 获取到请求,然后去容器中寻找所对应的具体请求类和方法。

要想实现上面的内容,所以要新建一个Maven Web Project 具体的实现方法自行百度。

由于是要实现Servlet,所以要在POM 文件需要引入一个jar包:


  	javax.servlet
  	servlet-api
  	2.5
  

开始手动创建DispatcherServlet,为了与之前的区分开,所以我新建的Servlet叫ZyxDispatcherServlet,创建好之后要extends HttpServlet ,并且重写doGet,doPost 和init(ServletConfig) 方法。代码如下:



web.xml配置如下:



从配置中可以看到 ,我新建的是application.properties,并非之前的application.xml ,也是为了和之前的区分开。

下面开始准备搭建项目框架,Spring MVC是如何区分层次和逻辑的呢,很明显是利用的注解,常用的注解有这几个:

@Controller(在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示)

@RequestMapping (RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。)

@AutoWired(注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用)

@Service

@RequestParam(主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

springMCV 常用注解详细说明如下:点击打开链接

所以我也对应创建了这几个注解,Controller注解内容如下:

package com.zyx.demo;

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;

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ZyxController {
	String value() default "";
}



设置默认值为空,另外可以看到我上面添加了三个注解

Documented 注解

Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中。

Target 注解

Target Annotation表示的是这个Annotation可以应用在哪里,是对Annotation应用的限制,如果没有这个标识的话,Annotation可以用在任何地方,比如类上,方法上,变量、属性上等,可以从java.lang.Enum.ElementType这个枚举里选择 ElementType。

Retention注解

Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:

1.RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略

2.RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略

3.RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.

其余的所有注解都按照Controller差不多的写法,注意好修改target。


下面开始搭建项目,我自己搭建的目录结构如下(请忽略项目报错):

手写SpringMVC IOC,让自己爽一爽(一)_第1张图片

两个action处理不同的请求,Service做对应的请求处理,action代码如下:

package com.zyx.demo.mvc.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zyx.demo.service.IDemoService;
import com.zyx.mvcframework.annotation.ZyxAutowired;
import com.zyx.mvcframework.annotation.ZyxController;
import com.zyx.mvcframework.annotation.ZyxRequestMapping;
import com.zyx.mvcframework.annotation.ZyxRequestParam;
@ZyxController
@ZyxRequestMapping("/demo")
public class TestAction {

	@ZyxAutowired IDemoService demoService;
	
	@ZyxRequestMapping("/edit.json")
	public void edit(HttpServletRequest request, HttpServletResponse response, @ZyxRequestParam("name") String name) {
		System.out.println(demoService.sayHello(name));
	}
}
service代码:

package com.zyx.demo.service.impl;

import com.zyx.demo.service.IDemoService;
import com.zyx.mvcframework.annotation.ZyxService;

@ZyxService
public class DemoService  implements IDemoService{

	@Override
	public String sayHello(String name) {
		System.out.println("DemoService : hello "+name+"!");
		return "hello";
	}

}
其中Controller和Service对应引入相应的Annotation。

下面开始进入最重要的环节啦!手写DispatcherServlet!

放在第二节


注明:本人尽量把感悟和想法贴出来,但是由于平时上班时间忙,没时间更新,还望见谅(尬聊QQ 1004811281)。



你可能感兴趣的:(JAVA,spring,mvc,ioc)