Java|使用Java注解

#Java [字体 ··]

这个注解完成了一个 Servlet 代理多个请求。

ServletMapping 注解

1@Target({ElementType.METHOD})
2@Retention(RetentionPolicy.RUNTIME)
3@Documented
4@Inherited
5public @interface ServletMapping {
6    String value() default "";
7}

注解使用

 1import cn.liuqichun.annotation.ServletMapping;
 2import cn.liuqichun.dao.UserDao;
 3import cn.liuqichun.entity.User;
 4import cn.liuqichun.utils.Result;
 5import com.fasterxml.jackson.databind.ObjectMapper;
 6
 7import javax.servlet.ServletException;
 8import javax.servlet.annotation.WebServlet;
 9import javax.servlet.http.HttpServlet;
10import javax.servlet.http.HttpServletRequest;
11import javax.servlet.http.HttpServletResponse;
12import java.io.IOException;
13import java.lang.reflect.Method;
14import java.sql.SQLException;
15import java.util.List;
16import java.util.concurrent.ConcurrentHashMap;
17
18/**
19 * Description: 处理用户相关请求,通过反射+注解代理所有用户相关方法
20 *
21 * @author: liuqichun
22 */
23@WebServlet(urlPatterns = {"/user", "/user/*"})
24public class UserServlet extends HttpServlet {
25
26    private final ObjectMapper json = new ObjectMapper();
27
28    private final UserDao userDao = new UserDao();
29
30    private final static ConcurrentHashMap<String, Method> uriMap;
31
32    @ServletMapping("/user/register")
33    private void registerUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
34        // 业务逻辑
35    }
36
37    @ServletMapping("/user/login")
38    private void login(HttpServletRequest request, HttpServletResponse response) throws IOException{
39       // 业务逻辑
40    }
41
42    @ServletMapping("/user/del")
43    private void del(HttpServletRequest request, HttpServletResponse response) throws IOException{
44        // 业务逻辑
45    }
46
47    @ServletMapping("/user/modify")
48    private void modify(HttpServletRequest request, HttpServletResponse response) throws IOException{
49        // 业务逻辑
50    }
51
52    @ServletMapping("/user/list")
53    private void userList(HttpServletRequest request, HttpServletResponse response) throws IOException{
54        // 业务逻辑
55    }
56
57
58    // config operate  -----------------------------------------------------------------
59    static{
60        uriMap = new ConcurrentHashMap<String, Method>();
61        Method[] methods = UserServlet.class.getDeclaredMethods();
62
63        for (Method m : methods) {
64            ServletMapping annotation = m.getAnnotation(ServletMapping.class);
65            if (annotation != null) {
66                String uri = annotation.value();
67                System.out.println("annotation.value() = " + annotation.value());
68                if (uri.length() > 0) {
69                    uriMap.put(uri, m);
70                } else {
71                    System.err.println("[ERROR] 存在非法的注解");
72                }
73            }
74        }
75    }
76
77    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
78        String uri = request.getRequestURI();
79        Method method = uriMap.get(uri);
80        if (method != null) {
81            try {
82                method.invoke(this, request, response);
83            } catch (Exception e) {
84                e.printStackTrace();
85            }
86        }else{
87            response.setStatus(400);
88            json.writeValue(response.getOutputStream(), Result.error("请求异常"));
89            System.err.println("[ERROR] 处理方法异常");
90        }
91    }
92
93    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
94        doPost(request, response);
95    }
96}

总结

在 Java 项目中(多是基于 Spring)大量用到了注解,注解提供了方法额外的信息,例如可以放置方法的备注,这些备注可以在程序运行时获取,这对于日志系统很有帮助,还有放置方法的访问权限,目前绝大多数鉴权框架都是用注解进行标记,注解为类或方法提供了额外信息的解耦,而且用起来很方便。

讲注解的一些文章:

[1] https://blog.csdn.net/javazejian/article/details/71860633 [2] https://ifeve.com/java-annotations/ [3] https://www.runoob.com/w3cnote/java-annotation.html [4] https://www.liaoxuefeng.com/wiki/1252599548343744/1265102413966176


博客没有评论系统,可以通过 邮件 评论和交流。 Top↑