我是如何把自定义注解应用到生产的

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/82889958 最近自己写了一个关于网关限流的插件,为了实现限流时的灵活性所以选择了使用自定义注解,但是在百度了很多篇文章时发现大部分的答案是使用反射,一部分是使用注解处理器。
版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/82889958

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

1. 如何自定义注解

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Aspect
@Component
public 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包和它的子包下,那么我就可以新建一个配置类

1
2
3
4
5
@Configuration
@ComponentScan(basePackages="cn.org.zhixiang")
public class EnableSyjRateLimitConfiguration {

}

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

1
2
3
4
@Import(EnableSyjRateLimitConfiguration.class)
@Configuration
public class SyjRateLimitConfig {
}

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

其实有些东西在文字中可能体现的不是那么完美,那么就请看一下我是在代码中如何用的吧
https://github.com/2388386839/syj-ratelimit

本文出自http://zhixiang.org.cn,转载请保留。

相关文章
|
7月前
|
XML Java 数据格式
Spring注解开发管理第三方bean及依赖注入
Spring注解开发管理第三方bean及依赖注入
122 0
|
2月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
3月前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
5月前
|
Java Spring
通用研发提效问题之切点和切面是什么,如何解决
通用研发提效问题之切点和切面是什么,如何解决
|
7月前
|
XML Java 数据格式
简单上手SpringBean的整个装配过程
在Spring6中定义一系列独立的bean定义出发,进而构建出一个对象间相互协作以达成目标的完全成型的应用程序。
49 2
|
7月前
|
Java 测试技术 开发者
【亮剑】通过自定义注解实现Spring AOP,可以更灵活地控制方法拦截和增强
【4月更文挑战第30天】通过自定义注解实现Spring AOP,可以更灵活地控制方法拦截和增强。首先定义自定义注解,如`@MyCustomAnnotation`,然后创建切面类`MyCustomAspect`,使用`@Pointcut`和`@Before/@After`定义切点及通知。配置AOP代理,添加`@EnableAspectJAutoProxy`到配置类。最后,在需拦截的方法上应用自定义注解。遵循保持注解职责单一、选择合适保留策略等最佳实践,提高代码可重用性和可维护性。记得测试AOP逻辑。
212 1
|
7月前
|
XML Java 数据格式
Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道
Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道
105 0
Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道
|
XML Java 数据格式
一文打通基于注解管理Bean(一)
一文打通基于注解管理Bean
|
设计模式
实现生成工厂代码,实现热加载
实现生成工厂代码,实现热加载
|
7月前
|
算法 前端开发 Java
Springboot智能物流拼单组合系统设计与实现
Springboot智能物流拼单组合系统设计与实现