自定义注解

简介: 本文介绍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);

}

若有收获,就点个赞吧


相关文章
|
6月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
4月前
|
自然语言处理 Java Shell
安装ES、Kibana、IK
本文介绍了如何通过Docker部署单点Elasticsearch与Kibana,并配置IK分词器。内容涵盖网络创建、镜像加载、容器运行、DevTools使用,以及IK分词器的安装与扩展词典、停用词配置,助力中文文本分析。
 安装ES、Kibana、IK
|
4月前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
8410 21
|
6月前
|
JavaScript 前端开发 Java
基于springboot的养老院管理系统
随着人口老龄化加剧,传统养老院管理效率低下,亟需信息化升级。本文基于Java、Spring Boot、Vue等技术构建智慧养老系统,结合MySQL与MyBatis实现数据高效管理,提升服务精准性与运营效率,推动养老服务向智能化、现代化发展。
|
4月前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
4月前
|
JSON 安全 机器人
钉钉通知
本文介绍如何通过Java代码调用钉钉机器人API实现系统告警消息推送。内容涵盖机器人创建、Webhook配置、Postman测试及Java代码实现,并提供限流策略与关键词安全设置等最佳实践,助力实时监控与异常通知。
|
4月前
|
安全 Java 应用服务中间件
4.认识SpringSecurity
Spring Security 是 Spring 生态中的安全框架,提供认证、授权及安全防护功能。支持多种认证方式(如表单、OAuth2、JWT等),基于过滤器链实现请求控制,可防御 CSRF 等攻击,保障 Web 应用安全。
|
7月前
|
前端开发 安全 Java
基于springboot+vue开发的会议预约管理系统
一个完整的会议预约管理系统,包含前端用户界面、管理后台和后端API服务。 ### 后端 - **框架**: Spring Boot 2.7.18 - **数据库**: MySQL 5.6+ - **ORM**: MyBatis Plus 3.5.3.1 - **安全**: Spring Security + JWT - **Java版本**: Java 11 ### 前端 - **框架**: Vue 3.3.4 - **UI组件**: Element Plus 2.3.8 - **构建工具**: Vite 4.4.5 - **状态管理**: Pinia 2.1.6 - **HTTP客户端
897 4
基于springboot+vue开发的会议预约管理系统
|
11月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
1015 1

热门文章

最新文章