专栏首页学习分享-实践为王简单的注解@Order的提取与使⽤
原创

简单的注解@Order的提取与使⽤

简单的注解@Order的提取与使⽤

//1.定义
@Retention(RetentionPolicy.RUNTIME)
public @interface Order {

    int value() default 0;
}

//2.使⽤
@Order(Integer.MIN_VALUE)
public class SituationSynProcessor extends BaseExtendSynProcessor<List<Situation>>

package com.gzzm.govps.itemsyn;

import com.gzzm.platform.commons.Tools;
import net.cyan.commons.util.BeanUtils;
import net.cyan.commons.util.ClassResolver;
import net.cyan.commons.util.CollectionUtils;

import java.util.*;
/**
 * 事项同步扩展处理器扫描器
 *
 * @author yiuman
 * @date 2019-12-04
 */
public final class ExtendProcessorResolver implements ClassResolver {
    //未排序Class Set
    private final static Set<Class<? extends BaseExtendSynProcessor<?>>> notOrderExtendSynProcessors
     = new HashSet<>();
    //记录BaseExtendSynProcessor处理器的类型及其Order顺序
    private final static Map<Class<? extends BaseExtendSynProcessor<?>>,Integer> orderProcessorRecord
     = new HashMap<>();
    //已排序的Class Set
    private final static Set<Class<? extends BaseExtendSynProcessor<?>>> extendSynProcessors = new LinkedHashSet<>();
    public ExtendProcessorResolver() {
    }
    /**
     * @return 返回⼀个已经排序过的处理器Set
     */
    static Set<Class<? extends BaseExtendSynProcessor<?>>> getExtendProcessors() {
        if (CollectionUtils.isEmpty(extendSynProcessors)) {
            notOrderExtendSynProcessors.stream().sorted(Comparator.comparingInt(orderProcessorRecord::get))
            .forEach(extendSynProcessors::add);
        }
    return extendSynProcessors;
}
    @SuppressWarnings("unchecked")
    @Override
    public void resolve(Class<?> aClass) {
        try {
            if (BeanUtils.getRealClass(aClass).getSuperclass() != null && 
            BaseExtendSynProcessor.class.equals(BeanUtils.getRealClass(aClass).getSuperclass())) {
                //此处通过反射获取注解
                Order order = aClass.getAnnotation(Order.class);
                //将获取到的注解值与使⽤了该注解的类型添加进 Order记录Map⾥
                orderProcessorRecord.put((Class<? extends BaseExtendSynProcessor<?>>) aClass,
                 order == null ? 0 : order.value());
                //将类型添加进未进⾏排序的Set中
                notOrderExtendSynProcessors.add((Class<? extends BaseExtendSynProcessor<?>>) aClass);
            }
        } catch (Throwable a) {
            Tools.log(a);
        }
    }
}

说明:上⾯的真正⽤到的是,那些Set集合中处理器,因为可能要指定某些处理器的执⾏顺序,⽐如A处 理器⼀定要B处理器之前运⾏,我们平时也可以写死让他们指定顺序执⾏,这在处理器较少的时候是可 以这么做,但是如果处理器有10呢?下次⼜加多10个呢?⽽且还需要执⾏他们某些的执⾏顺序呢?所以 这⾥是⽤了Order注解对他们的⼀个执⾏顺序进⾏指定,以后⽆论怎么加只要注意下Order中的value值 定义就好。~ Springboot中的Bean加载顺序也是⽤了这个同名注解进⾏Bean的加载顺序控制的~~

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 8 种基本数据类型外加 类、接⼝、注解及它们的数组

    上⾯的代码定义了NotNull这个注解,它拥有message和isIteration两个属性,在使⽤的时候我们可以 给他们赋值:

    聚名12255
  • MySQL学习,详解分组查询(二)

    where & group by & having & order by & limit ⼀起协作

    用户1289394
  • 【笔记】Mysql 数据库操作规范

    【FAQ-1-01】 库名、表名、字段名必须使⽤小写字母,并采⽤下划线分割。 a)MySQL 有配置参数 lower_case_table_names,不...

    redszhao
  • gRPC 长连接在微服务业务系统中的实践

    长连接和短连接哪个更好, 一直是被人反复讨论且乐此不疲的话题。有人追求短连接的简单可靠, 有人却对长连接的低延时趋之若鹜。那么长连接到底好在哪里, 它是否是解决...

    深度学习与Python
  • sharding-jdbc金融支付项目中的应用(技术创作101训练营)

    初次接触shardingsphere是在2017年,那时候还叫sharding-jdbc,属于当当网。当时公司的支付项目改动升级,主要有如下两个问题。

    三复
  • MySQL编程规范

    白凡
  • 看了 5 种分布式事务方案,我司最终选择了 Seata,真香!

    好长时间没发文了,最近着实是有点忙,当爹的第 43 天,身心疲惫。这又赶上年底,公司冲 KPI 强制技术部加班到十点,晚上孩子隔两三个小时一醒,基本没睡囫囵觉的...

    程序员内点事
  • 对比 5 种分布式事务方案,还是宠幸了阿里的 Seata(原理 + 实战)

    好长时间没发文了,最近着实是有点忙,当爹的第 43 天,身心疲惫。这又赶上年底,公司冲 KPI 强制技术部加班到十点,晚上孩子隔两三个小时一醒,基本没睡囫囵觉的...

    程序员内点事
  • numpy入门-数组创建

    皮大大
  • DASCTF|June GKCTF X DASCTF应急挑战杯WriteUP-PWN&REVERSE篇

    本次竞赛涵盖WEB、CRYPTO、MISC、PWN、REVERSE常规CTF五大类赛题。

    安恒网络空间安全讲武堂
  • 对比 5 种分布式事务方案,还是宠幸了阿里的 Seata(原理 + 实战)

    我们先看看百度上对于分布式事务的定义:分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。

    Bug开发工程师
  • MySQL学习,详解排序查询(order by)

    select 字段名 from 表名 order by 字段1 [asc|desc],字段2 [asc|desc];

    用户1289394
  • 爱奇艺网络协程编写高并发应用实践

    本⽂以爱奇艺开源的⽹络协程库(https://github.com/iqiyi/libfiber )为例,讲解⽹络协程的设计原理、编程实践、性能优化等⽅⾯内容。

    范蠡
  • 爱奇艺网络协程编写高并发应用实践

    本⽂以爱奇艺开源的⽹络协程库(https://www.jintianxuesha.com)为例,讲解⽹络协程的设计原理、编程实践、性能优化等⽅⾯内容。

    不会飞的小鸟
  • MySQL手注之报错注入详解

    往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了。这篇文章会讲解一下报错注...

    渗透攻击红队
  • 【python进阶】Garbage collection垃圾回收1

    前言 GC垃圾回收在python中是很重要的一部分,同样我将分两次去讲解Garbage collection垃圾回收,此篇为Garbage collection...

    Angel_Kitty
  • 肝了一夜的66道并发多线程面试题,你不来个666吗?

    线程是操作系统能够进⾏运算调度的最⼩单位,它被包含在进程之中,是进程中的实际运作单位,可以使⽤多线程对进⾏运算提速。

    狼王编程
  • Nmap操作系统探测技术浅析

    “ 对于开源工具的使用,可以去读相关文章,大多数人都愿意去读,而且见效很快,立马就能上手用起来;对于开源工具的原理,还是能去读官方paper,但少有人愿意花时间...

    aerfa
  • 【非广告,纯干货】10年IT老兵拿下阿里p7技术专家后的万字面经分享!

    ⼤家好,⾃我介绍⼀下:10年经验,普本毕业,坐标北京,这次跳槽进⼊了阿⾥。分享⼀下这次⾯试经验,以及平时学习的积累。

    jeanron100

扫码关注云+社区

领取腾讯云代金券