1、 整体流程图
2、 注解
annotation
注解只是一种标记,在代码上带上标记
转:java中元注解有四个: @Retention @Target @Document @Inherited;@Retention:注解的保留位置
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
一般用这个:@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
- @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) ///包
- 例子:
@Target({ElementType.TYPE,ElementType.METHOD})//函数和类上面都可以使用
@Target(ElementType.Type)//java类 是源注解 用于注解其他注解
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
开发人员对这些注解标注的类进行了特殊管理
配置扫描包,就是把这些类扫描出来然后通过反射技术获取注解,controller就列入控制器类。
3、 DispatcherServlet
以前spring有两种方式,其中一种就是DispatcherServlet,另外一种就是listener。
因为在web.xml里面配置了信息
tomcat在容器初始化之前就会初始化这个DispatcherServlet
web.xml里面的配置信息
<servlet>
<display-name>DispatcherServlet</display-name>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>com.searlas.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
第一步,包扫描
在DispatcherServlet的init函数里面调用包扫描函数
@Override
public void init() throws ServletException {
System.out.println("------ init DispatcherServlet ------");
System.out.println("1 - 包扫描");
scanPackage("com.searlas");
}
protected void scanPackage(String basePackage) {
//com.searlas -> com/searlas
String path = basePackage.replace(".", "/");
System.out.println(path);
URL url = getClass().getClassLoader().getResource("/" + path);
String filepath = url.getFile();
File[] files = new File(filepath).listFiles();
for (File file : files) {
if (file.isDirectory()) {
scanPackage(basePackage + "." + file.getName());
} else {
fileList.add(file.getName());
}
}
}
结果:
待续。。