面试-spring原理分析(一)(根据云析视频总结)

1、 整体流程图

spring mvc流程图

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());
            }
        }

    }

结果:
这里写图片描述

待续。。

猜你喜欢

转载自blog.csdn.net/searlas/article/details/80826038
今日推荐