项目地址在:https://github.com/hjx601496320/aMvc 。
测试代码在:https://github.com/hjx601496320/amvc-test 。
怎么写呢?
因为在之前写代码的时候,我把每个类要做的事情分的比较清楚,所以在添加这个功能的时候写起来还是比较简单的,需要修改的地方也比较小。
这一章里我们需要干的事情有:
定义一个注解,标识某一个class中的被添加注解的方法是一个UrlMethodMapping。
修改配置文件,添加需要扫描的package。
写一个方法,根据package中值找到其中所有的class。
在UrlMethodMapping的工厂类UrlMethodMappingFactory中新加一个根据注解创建UrlMethodMapping的方法。
在Application中的init()方法中,根据是否开启注解支持,执行新的工厂类方法。
完了。
多么简单呀~~~
现在开始写
定义一个注解Request
关于怎样自定义注这件事,大家可以上网搜一下,比较简单。我这里只是简单的说一下。我先把代码贴出来:
import com.hebaibai.amvc.RequestType; import java.lang.annotation.*; /** * 表示这个类中的,添加了@Request注解的method被映射为一个http地址。 * * @author hjx */ @Documented @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Request { /** * 请求类型 * 支持GET,POST,DELETE,PUT * * @return */ RequestType[] type() default {RequestType.GET, RequestType.POST, RequestType.DELETE, RequestType.PUT}; /** * 请求地址 * 添加在class上时,会将value中的值添加在其他方法上的@Request.value()的值前,作为基础地址。 * * @return */ String value() default "https://www.jb51.net/"; }
定义一个注解,需要用到一下几个东西:
1:@interface:说明这个类是一个注解。
2:@Retention:注解的保留策略,有这么几个取值范围:
代码
说明
@Retention(RetentionPolicy.SOURCE)
注解仅存在于源码中
@Retention(RetentionPolicy.CLASS)
注解会在class字节码文件中存在
@Retention(RetentionPolicy.RUNTIME)
注解会在class字节码文件中存在,运行时可以通过反射获取到
因为我们在程序中需要取到自定义的注解,所以使用:RetentionPolicy.RUNTIME。
3:@Target:作用目标,表示注解可以添加在什么地方,取值范围有:
代码
说明
@Target(ElementType.TYPE)
接口、类、枚举、注解
@Target(ElementType.FIELD)
字段、枚举的常量
@Target(ElementType.METHOD)
方法
@Target(ElementType.PARAMETER)
方法参数
@Target(ElementType.CONSTRUCTOR)
构造函数
@Target(ElementType.LOCAL_VARIABLE)
局部变量
@Target(ElementType.ANNOTATION_TYPE)
注解
@Target(ElementType.PACKAGE)
包
3:@Documented:这个主要是让自定义注解保留在文档中,没啥实际意义,一般都给加上。
4:default:是给注解中的属性(看起来像是一个方法,也可能就是一个方法,但是我就是叫属性,略略略~~~)一个默认值。
上面大致上讲了一下怎么定义一个注解,现在注解写完了,讲一下这个注解的用处吧。
首先这个注解可以加在class和method上。加在class上的时候表示这个类中会有method将要被处理成为一个UrlMethodMapping,然后其中的value属性将作为这个class中所有UrlMethodMapping的基础地址,type属性不起作用。加在method上的时候,就是说明这个method将被处理成一个UrlMethodMapping,注解的两个属性发挥其正常的作用。
注解写完了,下面把配置文件改一改吧。
修改框架的配置文件
只需要添加一个属性就好了,修改完的配置文件这个样子:
{ "annotationSupport": true, "annotationPackage": "com.hebaibai.demo.web", // "mapping": [ // { // "url": "/index", // "requestType": [ // "get" // ], // "method": "index", // "objectClass": "com.hebaibai.demo.web.IndexController", // "paramTypes": [ // "java.lang.String", // "int" // ] // } // ] }
1:annotationSupport 值是true的时候表示开启注解。
2:annotationPackage 表示需要扫描的包的路径。
3:因为开了注解支持,为了防止重复注册 UrlMethodMapping,所以我把下面的配置注释掉了。
写一个包扫描的方法
这个方法需要将项目中jar文件和文件夹下所有符合条件的class找到,会用到递归,代码在ClassUtils.java中,由三个方法构成,分别是:
1:void getClassByPackage(String packageName, Set