zoukankan      html  css  js  c++  java
  • SpringMvc中的注解详解

    下面我来介绍一下SpringMvc中的常用的注解

    1、在配置DispathServlet的时候,为了能扫描到此类,要在类上加@Controller注解。

    2、控制反转要用到的注解@Resource,这样就可以直接从IOC容器中获取对象了,如果要起别名就要自己定义并加一个value值。

    3、@Override注解的作用是重写方法,经常用在实现接口的时候。

    4、lombok插件中比较方便的注解

    @Data//自动生成set和get和toString
    
    @AllArgsConstructor//生成所有参数的构造方法
    
    @NoArgsConstructor//无参构造

    5、当把包中的类放入IOC容器中时要加的注解

    @Component//
    @Repository//仓库
    @Service//服务层
    @Configuration//配置类
    @Controller
    五个选一个就可以

    6、如果想直接返回数据的话,就要加@ResponseBody,不然返回的是重定向的视图解析器。

    7、用Junit测试工具的时候要加@RunWith(SpringJUnit4ClassRunner.class)、@ContextConfiguration(locations = "配置文件位置")

    和一个@Test注解,通过handler来测试

    8、@RequestMapping(value="/list")还有get、put、post、delete等注解都是让映射器找到这个方法

    9、自定义注解,首先创建一个注解类一定要实现@interface,然后加两个注解(也就是原始注解,注解里的注解),如果要起别名还要加一个value属性

    //@Target(ElementType.TYPE)//放在类名上
    //@Target(ElementType.METHOD)//方法
    @Target(ElementType.FIELD)//字段变量
    @Retention(RetentionPolicy.RUNTIME)//项目运行声明周期内有效

    最后通过一个实例来进一步说明:用自定义注解来实现扫描一个包下含有controller注解的有方法注解的方法

    public class MVCUtil {
        
        /**
         * 根据包名,扫描包
         * @param pack
         * @return
         */
    
        public static List<String> scanPackage(String pack){
    
            List<String> classNames = new ArrayList<>();
            //类加载器
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
    
            //找到指定包下的资源
            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);
                //根据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("	"+method.getName());
                    boolean isRequestMapping = method.isAnnotationPresent(RequestMapping.class);
                    if(isRequestMapping){
                        //获取注解
                        RequestMapping rm = method.getAnnotation(RequestMapping.class);
                        handlerMapping.put(rm.value(),new Mapping(controller,method));
                    }
                }
            }
    
            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);
    
        }
    
    
    }
  • 相关阅读:
    Java中的System类
    关于Java IO流学习总结
    Java InputStream、String、File相互转化
    Java 里把 InputStream 转换成 String 的几种方法
    详细讲解JAVA中的IO流
    获取 request 中 json 数据
    oracle count 百万级 分页查询记要总数、总条数优化
    ORACLE分页SQL语句
    ORACLE中用rownum分页并排序的SQL语句
    day7
  • 原文地址:https://www.cnblogs.com/mvpmvp/p/13418478.html
Copyright © 2011-2022 走看看