自定义注解

简介: 本文介绍Java自定义注解的实现原理与应用,结合Spring AOP 和过滤器实现日志、权限控制及登录验证,涵盖注解定义、@Target、@Retention等核心语法,并通过代码示例展示实际使用流程。

自定义注解

1.前言
自定义注解目前在我使用过的项目中,主要用用作日志丰富,参数处理,其核心还是借助于Spring的AOP进行实现,本文将结合具体代码演示简单的自定义注解实现流程。
2.实现
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等,如下:

@TargeT(LeeTypeMTHOD)

@Retention(RetentionPolicy.RUNTIMe)

@Documented

@ReguestMapping(methodRequesMethodP)

public@interfacePostMapping

ALiaSFor(annotationRequestMapping.class)

stringname)default"";

ALiaSFor(annotationRequestMapping.class)

stringIvalue)default0;

CAliaSFor(annotationRequesTMapping.class)

stringI]patho)defaultf;

@ALiaSFor(annotationRequestMapping.class)

stringIjparams)defaultou;

@ALiSFor(annotationRequestMapping.class)

string[jheaders)defaultl;

ALiASFor(annotationRequestMapping.class)

stringIconsumeso)defauttf;

@ALiaSFor(annotationRequestMapping.class)

stringljproduceso)defaulto;


2.6 AOP+Controller使用自定义注解
3.总结
自定义注解其核心是借助于:@Target 和 @Rentention,@Documented组合实现,其实现还是需要依赖于Spring的AOP进行具体体现,除了上面的用作日志拦截,还可以自定义:数据验证注解,权限注解,缓存注解等多种用途,但其实现基本都遵循上述步骤。
4.自定义注解+过滤器实现登陆相关
4.1 定义自定义注解@Login
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<TabInfoVo> merchantsInfoDtos = new ArrayList<>();

merchantsInfoDtos = historyTradeService.filter(companyId, code);

return ok("查询成功", merchantsInfoDtos);

}

若有收获,就点个赞吧


相关文章
|
缓存 Shell Windows
IDEA安装激活破解2022.09.07最新破解教程「永久激活,亲测有效」JetBrains全家桶破解
本文讲的是IntelliJ IDEA破解、IntelliJ IDEA激活码、IntelliJ IDEA安装、IntelliJ IDEA永久激活码的最新永久激活教程,本文有mac和windows系统的idea安装教程。
2715 0
IDEA安装激活破解2022.09.07最新破解教程「永久激活,亲测有效」JetBrains全家桶破解
|
3月前
|
人工智能 缓存 JSON
AI智能体上线与运营
AI智能体价值落地关键在上线评测与持续运营:通过灰度测试、护栏校准、影子流保障上线安全;依托全链路观测、数据飞轮与PromptOps实现闭环调优;结合智能缓存、上下文压缩与多模型调度精细化控本。
|
11月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
9月前
|
监控 物联网 BI
告别手工台账!数字化资产管理系统如何让企业盘点效率提升 80%
企业资产管理常面临账实不符、盘点低效等难题。数字化资产管理系统通过数据实时同步、移动扫码、智能分析与异地协同,实现盘点效率提升80%,助力企业降本增效,迈向全生命周期智能化管理新时代。(239字)
|
9月前
|
自然语言处理 Java Shell
安装ES、Kibana、IK
本文介绍了如何通过Docker部署单点Elasticsearch与Kibana,并配置IK分词器。内容涵盖网络创建、镜像加载、容器运行、DevTools使用,以及IK分词器的安装与扩展词典、停用词配置,助力中文文本分析。
 安装ES、Kibana、IK
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
1375 1
|
11月前
|
JavaScript 前端开发 Java
基于springboot的养老院管理系统
随着人口老龄化加剧,传统养老院管理效率低下,亟需信息化升级。本文基于Java、Spring Boot、Vue等技术构建智慧养老系统,结合MySQL与MyBatis实现数据高效管理,提升服务精准性与运营效率,推动养老服务向智能化、现代化发展。
|
9月前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
本文介绍如何通过四色原型法构建领域模型,并逐步推导出数据架构中的ER图。采用红色(时标性)、绿色(参与方-物品-地点)、黄色(角色)和蓝色(描述)四色模型,结合风控系统案例,详解从业务流程到实体关系图的建模过程,助力精准梳理数据结构。
 领域模型图(数据架构/ER图)
|
9月前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
9月前
|
JSON 安全 机器人
钉钉通知
本文介绍如何通过Java代码调用钉钉机器人API实现系统告警消息推送。内容涵盖机器人创建、Webhook配置、Postman测试及Java代码实现,并提供限流策略与关键词安全设置等最佳实践,助力实时监控与异常通知。

热门文章

最新文章