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);

相关文章
|
7天前
|
消息中间件 人工智能 决策智能
AgentScope x RocketMQ:构建多智能体应用组合
AgentScope是阿里巴巴推出的开发者友好型多智能体框架,支持模块化、可定制的智能体应用开发。通过集成RocketMQ,实现高效、可靠的A2A通信,助力构建如“智能旅行助手”等复杂协作场景,提升开发效率与系统可扩展性。(238字)
|
7天前
|
运维 Devops 开发工具
生产环境缺陷管理
git-poison基于go-git实现,通过“投毒-解毒”机制在多分支环境中精准追踪bug,自动化阻塞带未修复bug的发布,降低协同成本,避免漏修、漏发问题,提升发布安全性与效率。
|
7天前
|
Linux 数据安全/隐私保护 虚拟化
虚拟机安装(CentOS7)
准备CentOS7镜像及VMware Workstation(可从百度云下载),使用虚拟机创建工具新建虚拟机,参考知乎教程完成安装。默认登录用户为root,密码自设。详情见链接。
|
7天前
|
JSON 缓存 前端开发
什么是跨域
CORS(跨域资源共享)是W3C标准,允许浏览器向跨源服务器发送XMLHttpRequest请求,突破AJAX同源限制。需浏览器和服务器共同支持,现代浏览器均兼容,IE需≥10。通信由浏览器自动完成,开发者无需特殊处理。CORS分为简单请求与非简单请求,后者会先发起OPTIONS预检,验证通过后才执行实际请求。服务器通过设置Access-Control-开头的响应头实现控制。相比仅支持GET的JSONP,CORS支持所有HTTP方法,更为强大灵活。
|
7天前
|
XML JSON Java
什么是RESTful
RESTful是一种基于资源的API设计规范,主张用URI唯一标识资源,通过HTTP动词(GET、POST、PUT、DELETE)操作资源,实现统一、标准的接口行为。它解决了传统接口路径混乱、行为不一致的问题,具有结构清晰、易于理解与扩展的优势。
|
7天前
|
Java 测试技术 Linux
生产环境发布管理
本文介绍大型团队如何通过自动化部署平台实现多环境(dev/test/pre/prod)高效发布与运维,涵盖环境职责、CI/CD流程、分支管理、容器化部署及基于Skywalking的日志链路追踪,提升发布效率与系统稳定性。
|
7天前
|
SQL NoSQL 前端开发
大厂如何解决订单幂等问题
为保障分布式系统数据一致性,需实现接口幂等性。创建订单时,通过预生成唯一订单号,利用数据库主键唯一约束防止重复插入;支付场景中,结合Redis或数据库唯一索引标记请求处理状态,避免重复扣款。针对ABA问题,采用版本号机制,更新时校验并自增版本号,确保数据更新的正确性与一致性。
|
7天前
|
SQL Dubbo Java
线程池:故障梳理总结
本文从故障与技术双重视角,总结线程池满导致服务不可用的常见成因与规避方案。涵盖数据库慢查询、锁争用、DDL阻塞、连接池配置不当等典型问题,并结合真实案例剖析根因。强调fast-fail理念,提出超时控制、资源隔离、流控背压、谨慎重试等最佳实践,助力开发者提升系统稳定性。
|
7天前
|
存储 缓存 安全
Java基础篇
本文系统讲解Java核心知识,涵盖final关键字、重载与重写、==与equals区别、反射机制及其应用、String类对比、集合框架、线程安全、HashMap原理、ConcurrentHashMap实现、线程池使用与参数配置、JVM组成及运行时数据区、类加载机制、双亲委派模型、Stream流与JDK8新特性等内容,深入剖析底层原理与项目实战应用。
|
7天前
|
存储 负载均衡 算法
负载均衡算法
随机调用适用于性能均衡的服务器集群,无超阈值流量时效果佳;若机器性能不一,可采用加权随机或加权轮询,提升调度效率。加权轮询按权重分配请求,如权重[3,1]对应调用序列AAABA。最小活跃数算法将请求发往负载最低的节点,实现动态负载均衡。源地址哈希与一致性哈希则确保相同IP或Key的请求落在同一服务器,增强会话一致性,适用于缓存等场景。