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
这个方法接收两个参数,一个是包名packageName,一个是一个空的Set(不是null),在方法执行完毕会将包下的所有class填充进Set中。这里主要是判断了一下这个包中有那些类型的文件,并根据文件类型分别处理。
注意:如果是jar文件的类型,获取到的filePath是这样的:
file:/home/hjx/idea-IU/lib/idea_rt.jar!/com
需要去掉头和尾,然后就可以吃了,鸡肉味!嘎嘣脆~~ 处理之后的是这个样子:
/home/hjx/idea-IU/lib/idea_rt.jar
下面是方法代码:
/**
* 从给定的报名中找出所有的class
*
* @param packageName
* @param classes
*/
@SneakyThrows({IOException.class})
public static void getClassByPackage(String packageName, Set<Class> classes) {
Assert.notNull(classes);
String packagePath = packageName.replace(DOT, SLASH);
Enumeration<URL> resources = ClassUtils.getClassLoader().getResources(packagePath);
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
//文件类型
String protocol = url.getProtocol();
String filePath = URLDecoder.decode(url.getFile(), CHARSET_UTF_8);
if (TYPE_FILE.equals(protocol)) {
getClassByFilePath(packageName, filePath, classes);
}
if (TYPE_JAR.equals(protocol)) {
//截取文件的路径
filePath = filePath.substring(filePath.indexOf(":") + 1, filePath.indexOf("!"));
getClassByJarPath(packageName, filePath, classes);
}
}
}








