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