springmvc架构案例+依赖传递+idea将项目打成jar并且放入本地仓库+自定义注解+实训+day0801

day0801

  • springmvc,ioc,io,反射,注解,maven

springmvc复习

  • 核心组件:dispatcherServlet

  • 复习sprinmvc的复习机制

  • 思维:客户端发起服务请求–> 前端控制器(DispatcherServlet)–> 拿到请求去找handlermaping对象(k–v),找到handler–》返回DispatcherServlet–>去找适配器(handlerAdapter)–>执行handler对象的方法,返回值(ModelAndView)————》返回前端控制器–》去找视图解析器–>返回给DispaterServlet–》返回用户给响应

  • @Override 是重写方法,给我们当注释用的,并且如果方法名字修改了,那么会报错(其实就是当个注释用的)

Demo



package com.neuedu.mvc.framework.utils;

import com.neuedu.mvc.framework.Controller;
import com.neuedu.mvc.framework.Mapping;
import com.neuedu.mvc.framework.RequestMapping;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 描述     : MVC的工具类
 */
public class MVCUtil {


    /**
     * 根据包名,扫描包
     * @param pack
     * @return
     */
    public static List<String> scanPackage(String pack){

        List<String> classNames = new ArrayList<>();
        //类加载器
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
       // System.out.println("classLoader:"+loader);

        //找到指定包下的资源
        URL url = loader.getResource(pack.replace(".","/"));

        //System.out.println("文件夹的名字:" + url);

        File packDir = new File(url.getPath());
        File[] files = packDir.listFiles();
        for (File file : files) {
            //System.out.println(file.getName());//文件名
            String className = file.getName().substring(0, file.getName().lastIndexOf("."));
          // System.out.println(pack+"."+className);//文件名
            classNames.add(pack+"."+className);
        }
        return classNames;
    }


    /**
     * 根据给定的类,查找是否包含@Controller注解
     * @param classNames
     * @return
     */
    public static  List<Class> scanController(List<String> classNames) throws ClassNotFoundException {

        List<Class> classList = new ArrayList();
        for (String className : classNames) {

            //现在只知道类名, className
            Class clazz = Class.forName(className);
            //System.out.println(clazz);
            //根据Class类型获取类的基础信息
            boolean isController = clazz.isAnnotationPresent(Controller.class);
            //System.out.println(className +" is Controller  "+isController);
            if(isController){
                classList.add(clazz);
            }
        }
        return classList;
    }


    /**
     *      * 根据类 Class 扫描 方法 有@RequestMapping
     *      *
     *      *  url  --  {
     *      *      class
     *      *      Method
     *      *
     *      *  }
     * @return
     */
    public static Map<String, Mapping> handlerMapping(List<Class> controllers){


        Map<String,Mapping> handlerMapping = new HashMap();

        for (Class controller : controllers) {

//            controller.getAnnotations()  所有注解
//            controller.getDeclaredFields();// 类直接声明的属性
            Method[] methods = controller.getDeclaredMethods();// 类声明的方法
            System.out.println("类:"+controller.getCanonicalName());
            for (Method method : methods) {
                //System.out.println("\t"+method.getName());
                boolean isRequestMapping = method.isAnnotationPresent(RequestMapping.class);
                if(isRequestMapping){
                    //获取注解
                    RequestMapping rm = method.getAnnotation(RequestMapping.class);
                    //System.out.print("\t"+rm.value()+"---->");
                    handlerMapping.put(rm.value(),new Mapping(controller,method));
                    //System.out.println(handlerMapping);
                }
            }
        }

        return handlerMapping;
    }


    public static void main(String[] args) throws ClassNotFoundException {
        String pack = "com.neuedu.controller";//待扫描的包
        //1
        List<String> classNames = scanPackage(pack);

        //2 扫描Controller
        List<Class> classList = scanController(classNames);

        //3 根据Controller注册Url
        Map handlerMappings = handlerMapping(classList);
        System.out.println(handlerMappings);
    }


}



  • 注意还有自定义注解的开发,上面代码是为了了解一些工具类的使用

依赖的传递

  • 就近原则和最短路径原则
  • 最短路径原则: a->b->3.0
    a->3.11
    最短路径原则,选择a->3.11

a->b->3.11
a->b->3.10
就近原则,选择3.11

day下午

  • spring复习

  • maven jar包管理和项目构建工具

  • 项目引入jar包是从本地仓库引入,如果本地仓库没有的话,
    (有的话就引入),会去私服仓库,在去中央仓库去引入,setting.xml已经配置了私服仓库为阿里云(自己进行了配置),中央仓库在国外,

  • 一个项目引入另一个项目怎么引入?项目和项目直接没法引入,
    有一个命令install,这个意思我把当前的项目打包并且发布到本地仓库,如果发布的话打成war包

  • 本地仓库:

  • 私服仓库:

  • 中央仓库:

猜你喜欢

转载自blog.csdn.net/weixin_42333573/article/details/107736331