自定义注解

简介: 本文介绍Java自定义注解的实现原理与应用,结合Spring AOP和过滤器完成日志、权限控制及登录验证。通过@Target、@Retention等元注解定义注解,并在控制器中通过拦截器解析,实现如无需登录访问等功能,提升代码可读性与复用性。(239字)

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

2.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

运行代码复制代码

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

}

油炸小波

相关文章
|
2天前
|
存储 负载均衡 算法
负载均衡算法
本文介绍多种负载均衡算法:随机、轮询、最小活跃数、源地址哈希及一致性哈希,涵盖适用场景与实现原理,结合代码与图示解析其调度机制,适用于分布式系统流量管理。
|
2天前
|
存储 Java 关系型数据库
微服务概述
本文介绍单体架构与微服务架构的区别,阐述微服务的定义、核心特征及优缺点,涵盖技术选型、部署方案与常见问题,帮助读者理解微服务演进逻辑,为后续实践打下理论基础。(238字)
|
2天前
|
XML JSON Java
什么是RESTful
RESTful是一种基于资源的API设计规范,强调URI代表资源、使用HTTP动词进行操作,实现统一标准、结构清晰、易于维护的接口风格,解决传统接口行为不规范问题。
|
1天前
|
消息中间件 Java 数据安全/隐私保护
异步消息组件MQ基础
本文介绍了MQ(消息队列)的基本概念,重点对比了同步调用与异步调用的区别,通过生活实例帮助理解。异步调用通过消息中间件实现解耦、异步处理和流量削峰,提升系统性能。常见的MQ如RabbitMQ、Kafka等适用于高并发场景。RabbitMQ基于AMQP协议,支持多语言,结合SpringAMQP可轻松实现消息收发。文章还演示了RabbitMQ的安装、配置、数据隔离及工作队列模型,强调“能者多劳”机制以优化消费效率。
异步消息组件MQ基础
|
2天前
|
Java 数据库 微服务
微服务服务注册与发现
本文介绍了微服务架构的演进与实践。针对单体架构在团队协作、发布效率、扩展性等方面的局限,微服务通过将系统拆分为多个独立部署、单一职责的小型服务,实现高内聚、低耦合,提升系统的可维护性与伸缩能力。结合Spring Cloud与Spring Cloud Alibaba技术栈,文章以黑马商城项目为例,演示了如何创建微服务工程、进行服务拆分,并使用RestTemplate实现服务间远程调用,帮助开发者掌握微服务核心开发技能。
微服务服务注册与发现
|
1天前
|
负载均衡 Java 应用服务中间件
微服务网关与配置中心
本文介绍了微服务架构下的网关路由与鉴权机制,重点讲解使用Spring Cloud Gateway实现请求路由、负载均衡及JWT身份校验。通过Nacos实现服务发现,网关统一处理前端请求,解决多入口问题,并在全局过滤器中实现用户鉴权,保障系统安全。
|
1天前
|
JSON Java API
Feign远程调用
本文介绍了如何使用Feign替代RestTemplate实现微服务间的HTTP调用,涵盖依赖引入、注解配置、自定义日志、连接池优化及代码抽取等实践。通过Feign可简化远程调用,提升开发效率,并结合最佳实践实现代码复用与解耦。
|
2天前
|
关系型数据库 应用服务中间件 nginx
容器化部署引擎Docker
Docker是一种容器化技术,通过镜像打包应用及依赖,实现跨环境快速部署。它利用容器隔离运行应用程序,解决依赖冲突与环境差异问题,相比虚拟机更轻量、高效。
|
1天前
|
负载均衡 Java 数据安全/隐私保护
Gateway服务网关
网关是微服务架构的统一入口,核心功能包括请求路由、权限控制、限流及负载均衡。通过Spring Cloud Gateway可实现高效路由转发与过滤器处理,支持跨域配置,提升系统安全与性能。
Gateway服务网关
|
1天前
|
负载均衡 算法 架构师
Ribbon负载均衡
负载均衡是高并发系统中的关键技术,通过将流量分摊至多台服务器,提升系统性能与可用性。本文详解负载均衡概念、分类(硬件/软件)、常用算法及Ribbon的实现原理,涵盖自定义策略与饥饿加载优化,帮助读者深入理解客户端负载均衡机制。