博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我是如何把自定义注解应用到生产的
阅读量:6434 次
发布时间:2019-06-23

本文共 2117 字,大约阅读时间需要 7 分钟。

版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/82889958

最近自己写了一个关于网关限流的插件,为了实现限流时的灵活性所以选择了使用自定义注解,但是在百度了很多篇文章时发现大部分的答案是使用反射,一部分是使用注解处理器。个人感觉这样实现都不是很合适,感兴趣的兄弟可以看一下我是如何使用的。

1. 如何自定义注解

这个其实网络上的文章太多太多了,我这里就简单的说一下

1234567
@Target(ElementType.TYPE)//ElementType.TYPE表示可以用在类上,ElementType.METHOD表示可以用在方法上@Retention(RetentionPolicy.RUNTIME)//RetentionPolicy.RUNTIME运行事保留RetentionPolicy.CLASS编译时保留@Documented//会被 javadoc 之类的工具处理@Inherited//表示可以被继承public @interface ClassRateLimit { }

2. 通过切面的方式处理注解

我们定义这样的一个切面来对注解标注的方法或者类来进行处理

123456789101112131415161718192021
@Aspect@Componentpublic class ClassAnnotationAspect {    @Pointcut("@within(classRateLimit)")    public void annotationPointcut(ClassRateLimit classRateLimit) {    }    @Before("@within(classRateLimit)")    public void doBefore(JoinPoint joinPoint, ClassRateLimit classRateLimit) {    	//classRateLimit 通过这个对象获取注解中的属性        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//通过这个对象取得本次请求的方法信息                        Class[] clazz=joinPoint.getClass();//通过这个对象取得本次请求的类信息             ServletRequestAttributes requestAttributes = (ServletRequestAttributes) //通过这个对象取得本次请求的request和response信息             RequestContextHolder.getRequestAttributes();        HttpServletRequest request = requestAttributes.getRequest();        HttpServletResponse response = requestAttributes.getResponse();    }}

3. 如何应用于实践呢

在1和2的两个步骤中,我们自定义了一个注解,也给他写了一个处理方法,如果是我们应用于自己的项目其实已经是没问题的,只要让ClassAnnotationAspect类被Spring管理就行了。

但是还有一种场景时,我们的这个注解作为一个jar包,提供给别人用,别人的Spring又不会管理我们jar包里的bean。这个时候怎么办呢?
这时我们就用到了另一个注解@Import,使用这个注解可以引入一个配置类,当我们作为一个第三方jar包存在时想要别人的Spring可以管理到我们的bean的时候,我们可以提供一个统一的配置类,在这个配置类中进行扫包,注册bean等一系列操作。然后别人只需要引入我们的配置类就ok了。
比如说,我的很多bean,包括刚才说的ClassAnnotationAspect类都在在cn.org.zhixiang包和它的子包下,那么我就可以新建一个配置类

12345
@Configuration@ComponentScan(basePackages="cn.org.zhixiang")public class EnableSyjRateLimitConfiguration {}

当别人要使用我提供的服务时只需要这样引入即可

1234
@Import(EnableSyjRateLimitConfiguration.class)@Configurationpublic class SyjRateLimitConfig {}

4.看看别人是怎么实现的

其实有些东西在文字中可能体现的不是那么完美,那么就请看一下我是在代码中如何用的吧

本文出自,转载请保留。

你可能感兴趣的文章
在办公电脑上设置日志服务器监控思科和华为设备
查看>>
python 字符串替换
查看>>
我的友情链接
查看>>
Linux之常用网络命令
查看>>
linux php 安装 curl
查看>>
tomcat nginx默许的post大小限制
查看>>
OSI七层模型
查看>>
去除工程的.svn隐藏文件夹
查看>>
Python24 终端如何输出彩色字体
查看>>
XSS跨站脚本***
查看>>
linux 挂载光驱
查看>>
ASP.NET MVC Area操作
查看>>
CSS颜色代码大全
查看>>
LINQ之路10:LINQ to SQL 和 Entity Framework(下)
查看>>
circle area
查看>>
怎么改变按钮的图标
查看>>
当输入流和输出流同时作用一个文件
查看>>
MySQL关于表碎片整理OPTIMIZE TABLE操作
查看>>
FortiGate 0458版本bug
查看>>
后台post注入爆密码
查看>>