自定义注解

简介:

实现
2.1 定义User
2.2 定义UserDAO
2.3 定义UserService
2.4 定义Controller
此时浏览器访问:http://{domain}/user/1即可出现对应效果
2.5 定义自定义注解
说明:
@interface 不是interface,是注解类 定义注解
Documented
这个Annotation可以被写入javadoc
@Retention
修饰注解,是注解的注解,称为元注解
SOURCE, // 编译器处理完Annotation后不存储在class中
CLASS, // 编译器把Annotation存储在class中,这是默认值
RUNTIME // 编译器把Annotation存储在class中,可以由虚拟机读取,反射需要
@Target
注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE) //局部变量
@Target(ElementType.ANNOTATION_TYPE) //注解
@Target(ElementType.PACKAGE) //包
可以定义多个方法,每个方法在使用时参照下面的Controller使用即可,实际就是类似于@PostMapping这样的注解中使用过的value,method,produces等,如下:
2.6 AOP+Controller使用自定义注解
3.总结
自定义注解其核心是借助于:@Target 和 @Rentention,@Documented组合实现,其实现还是需要依赖于Spring的AOP进行具体体现,除了上面的用作日志拦截,还可以自定义:数据验证注解,权限注解,缓存注解等多种用途,但其实现基本都遵循上述步骤。
4.自定义注解+过滤器实现登陆相关
4.1 定义自定义注解@Login
Java
运行代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.zhicall.majordomo.core.common.enums.YesOrNo;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Login {

YesOrNo value();

}
4.2 过滤器匹配
Java
运行代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.zhicall.majordomo.core.security.interceptor;

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.alibaba.fastjson.JSON;
import com.zhicall.care.realtime.util.ResultMessageBuilder;
import com.zhicall.care.realtime.util.ResultMessageBuilder.ResultMessage;
import com.zhicall.care.system.basic.BeanFactory;
import com.zhicall.majordomo.core.common.constant.GlobalCst;
import com.zhicall.majordomo.core.common.enums.YesOrNo;
import com.zhicall.majordomo.core.security.annotation.Login;
import com.zhicall.majordomo.core.security.constant.Cst;
import com.zhicall.majordomo.core.security.util.UserAuthHelper;

public class UserLoginInterceptor extends HandlerInterceptorAdapter {

@SuppressWarnings({ "unchecked", "rawtypes" })
protected RedisTemplate<String, String> redisTemplate = (RedisTemplate) BeanFactory.getInstance().getBean("redisTemplate");

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    Login login = handlerMethod.getMethodAnnotation(Login.class);
    // 方法被 @Login(YesOrNo.No)标记 表示不需要登陆即可访问 否者都要登录
    if (login != null && YesOrNo.NO.equals(login.value())) {
        return true;
    }
    // 做鉴权
    ......
}

}
4.3 Controller中具体使用
Java
运行代码
复制代码
1
2
3
4
5
6
7
@Login(YesOrNo.NO)
@RequestMapping(value = "/filter", method = RequestMethod.POST)
public @ResponseBody ResultMessageBuilder.ResultMessage filter(String companyId, String code) {
List merchantsInfoDtos = new ArrayList<>();
merchantsInfoDtos = historyTradeService.filter(companyId, code);
return ok("查询成功", merchantsInfoDtos);
}

相关文章
|
缓存 Java Spring
07HandlerMapping中用到的RequestMappingInfo和RequestCondition
RequestCondition(请求匹配条件)体系。 上面提到的RequestMapping注解申明的属性与之呼应的就是spring中RequestCondition的实现体系。 RequestMappingInfo体系 RequestMappingInfo是请求映射信息的描述,维护了一个请求所匹配的各种条件。即一个请求是有很多匹配条件的都放在了RequestMappingInfo中 RequestMappingInfo的生成、存放、和获取
2026 0
|
存储 弹性计算 算法
手把手教你使用ECS服务器搭建RssHub服务,实现“万物皆可RSS”
在当今时代,大部分人已经无法离开互联网了,由于大数据的加持,各大平台一直在竭尽全力的想我们推送我们所感兴趣的内容,但是,这样势必会造成信息茧房。是使得我们的视野越来越窄,那么有没有什么办法能够解决这个问题呢?有!在互联网发展的早期,有一个叫做RSS(简易信息聚合)的东西,这个工具可以帮你整合一些网站上的内容,当网站内容发生更新时给与通知,有点类似一个关注列表,但是这个列表中可以包含各大平台的内容。使用RSS,你可以订阅自己喜欢的内容,从而拒绝各大平台的算法推荐。给你一个“自己决定看什么的机会”!
3350 2
手把手教你使用ECS服务器搭建RssHub服务,实现“万物皆可RSS”
|
5月前
|
存储 人工智能 监控
AI测试有没有一套标准流程?
AI测试不是简单验证模型输出,而是围绕业务目标、数据样本、模型效果、系统链路、风险边界、线上监控与版本回归构建的新型质量保障体系。它突破传统确定性测试范式,强调评估+验证+治理三位一体,推动测试从“功能正确”迈向“业务可用、稳定可控、持续可交付”。
|
5月前
|
人工智能 API 开发者
一份不到 70 行的 Markdown,凭什么一周冲上 GitHub 趋势榜首?
JeecgBoot AI专题研究 andrejkarpathyskills:给 AI 编程立规矩,外加一分钟安装指南 一个反常识的 GitHub 现象最近 GitHub 趋势周榜的第一名,不是新框架,也不是新模型,而是一份不到 70 行的 Markdown 文件——项目名叫 [andrejkar
771 0
|
9月前
|
人工智能 Java 网络安全
|
9月前
|
消息中间件 人工智能 NoSQL
RocketMQ:A2A协议实现多智能体优化
Agentic AI 时代已至,在智能客服、代码生成、流程自动化等场景中,多智能体(Multi-Agent)协作正从构想走向落地。然而,当多个 Agent 需要像一个团队那样高效协作时,脆弱的通信机制可能因网络抖动或服务宕机,就让整个系统瞬间瘫痪,导致昂贵的计算任务失败、会话状态丢失。如何为这些聪明的“数字员工”们构建一个真正可靠、高效的通信基座? 本文将为您介绍 Apache RocketMQ 全新推出的轻量级通信模型 LiteTopic,如何在 AI 应用场景中有效简化系统架构、提升稳定性与可靠性,并结合 A2A(Agent-to-Agent)协议与阿里巴巴AgentScope 框架的生产
|
定位技术 Python
python高德地图webAPI:地理编码将地址信息转化为经纬度坐标
python高德地图webAPI:地理编码将地址信息转化为经纬度坐标
818 0
python高德地图webAPI:地理编码将地址信息转化为经纬度坐标
|
Android开发 开发者 Kotlin
Android实战经验之Kotlin中快速实现MVI架构
MVI架构通过单向数据流和不可变状态,提供了一种清晰、可预测的状态管理方式。在Kotlin中实现MVI架构,不仅提高了代码的可维护性和可测试性,还能更好地应对复杂的UI交互和状态管理。通过本文的介绍,希望开发者能够掌握MVI架构的核心思想,并在实际项目中灵活应用。
722 8
|
Arthas 监控 前端开发
Arthas学习笔记
Arthas学习笔记
1030 2
|
Java
Unable to find @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest
Unable to find @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest
553 0