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("\t"+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);

    }


}

 

posted @ 2020-08-02 12:49  西凉锦马超  阅读(540)  评论(0编辑  收藏  举报