SpringCloud自定义注解

简介: 本文介绍Java自定义注解的实现与应用,结合Spring AOP与过滤器,演示日志处理、权限控制等场景。通过@Target、@Retention等元注解定义注解,并在Controller中结合AOP或拦截器实现功能增强,提升代码可读性与复用性。(238字)

前言
自定义注解目前在我使用过的项目中,主要用用作日志丰富,参数处理,其核心还是借助于Spring的AOP进行实现,本文将结合具体代码演示简单的自定义注解实现流程。2.实现2.1 定义User2.2 定义UserDAO2.3 定义UserService2.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 定义自定义注解@Login4.2 过滤器匹配
Java运行代码复制代码

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 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运行代码复制代码
@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);
}

相关文章
|
2月前
|
人工智能 JSON 数据挖掘
大模型应用开发中MCP与Function Call的关系与区别
MCP与Function Call是大模型应用的两大关键技术。MCP为模型与外部工具提供标准化通信协议,实现跨模型、跨平台集成;Function Call则是模型调用外部函数的内置机制。前者如“蓝牙协议”,支持多设备互联,后者像“语音助手”,限于单机操作。两者在功能上互补:MCP支持工具热插拔、权限控制与远程调用,适用于企业级复杂系统;Function Call开发简单,适合快速验证单一模型能力。未来趋势将走向融合,形成“模型解析-协议传输-工具执行”的分层架构,推动AI应用生态标准化发展。
|
2月前
|
监控 Java 调度
XXLJob定时任务概述
定时任务指按时间表达式周期执行的任务,适用于对账、提醒、订单超时等场景。实现方式包括单体架构的轮询休眠、Timer、ScheduledExecutorService、Quartz及SpringTask;分布式架构面临重复执行、动态调整、故障转移等问题,主流方案有XXL-JOB、Elastic-Job、Saturn和ScheduleX等。
|
2月前
|
XML 算法 安全
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
RAG通过检索与生成结合,提升大模型在企业场景的准确性与安全性。分块策略是其核心,直接影响检索效果与回答质量。本文系统解析五种主流分块方法:固定大小、语义、递归、基于文档结构及LLM分块,对比其优缺点与适用场景,并提出组合优化路径,助力构建高效、可信的RAG系统。
|
11月前
|
人工智能 程序员 API
Motia:程序员福音!AI智能体三语言混编,零基础秒级部署
Motia 是一款专为软件工程师设计的 AI Agent 开发框架,支持多种编程语言,提供零基础设施部署、模块化设计和内置可观测性功能,帮助开发者快速构建和部署智能体。
1026 15
Motia:程序员福音!AI智能体三语言混编,零基础秒级部署
|
2月前
|
开发框架 微服务
应用架构图
在业务架构基础上,技术架构将应用需求转化为技术实现,涵盖分层设计、开发语言与框架选择,及非功能需求的技术方案。结合微服务或单体架构分层模型,明确各层技术选型,形成关键技术清单与完整架构图,实现产品到技术的落地。
|
安全 算法 网络安全
云计算时代的网络安全:挑战与对策
【9月更文挑战第8天】随着云计算技术的飞速发展,越来越多的企业和个人选择将数据和应用迁移到云端。然而,这也带来了前所未有的网络安全挑战。本文将深入探讨云计算环境下的网络安全问题,包括云服务的安全问题、网络攻击的新趋势以及信息安全的最佳实践。我们将通过分析具体的案例和策略,为读者提供在云计算时代保护网络安全的有效方法。
140 15
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
423 15
|
安全 Linux 应用服务中间件
在Linux中,SSL/TLS证书的作用以及如何在Linux中管理它们?
在Linux中,SSL/TLS证书的作用以及如何在Linux中管理它们?
|
存储 人工智能 安全
只需两步,让大模型智能体社区相信你是秦始皇
【8月更文挑战第16天】在信息爆炸时代,大型语言模型(LLM)快速发展并在多智能体系统中展现卓越能力,但也带来了安全性挑战,特别是知识操纵问题。上海交大与百川智能合作研究发现,在无明显提示下,LLM可能被操纵传播虚假或有害信息。研究构建了威胁模型和仿真环境,展示攻击者如何利用两阶段策略注入操纵知识而不削弱智能体功能。实验显示,这类知识能在多智能体间迅速传播并持久留存,凸显了加强安全措施的重要性。研究提出了使用“监护”智能体和事实核查工具等防御手段,并公开代码供同行复现研究。这项工作不仅揭示了潜在风险,还为建立更安全的多智能体系统提供了指导。论文已发布于arxiv.org。
314 57
|
API Python
Matplotlib 教程 之 Matplotlib Pyplot 1
Matplotlib Pyplot 是 Matplotlib 的一个子库,提供了与 MATLAB 类似的绘图 API。它常用於绘制 2D 图表,包含了一系列可以对当前图像进行修改的函数,如添加标记、生成新图像等。通过 `import matplotlib.pyplot as plt` 导入后,可使用如 `plot()`、`scatter()`、`bar()`、`hist()`、`pie()` 和 `imshow()` 等函数绘制不同类型的图表,并可通过其他函数设置图表属性、添加文本或保存图表。例如,使用 `plot()` 可根据指定坐标绘制线图。
203 5