判断自定义类是否重复

判断自定义类是否重复

自定义类库中,需要重写NSObject的两个固定方法来判断类是否重复:

  • – (BOOL)isEqual:(id)anObject;

  • –(NSUInteger)hash;

### 防止自定义注解在Spring Boot中被重复调度 为了防止自定义注解在Spring Boot应用程序中被重复调度,可以采取多种策略。一种常见做法是通过引入唯一标识符机制来确保每个任务仅能注册一次。 #### 使用唯一标识符 当创建基于自定义注解的任务时,在注解内部加入一个唯一的ID属性。这个ID可以在扫描过程中用来判断该任务是否已经被加载过。如果已经存在相同ID的任务,则忽略新的声明以避免重复调度[^1]。 ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface ScheduledTask { String id(); // 唯一标识符 } ``` #### 注册拦截器或监听器 另一种方式是在应用启动期间设置一个全局的拦截器或者事件监听器,用于监控所有带有特定注解的方法,并记录下它们的信息(比如名称、参数列表)。每当遇到一个新的`ScheduledTask`方法时,先查询已有的集合看是否有匹配条目;如果有则跳过此次注册操作[^2]。 ```java @Component public class TaskRegistrar implements ApplicationListener<ContextRefreshedEvent> { private final Set<String> registeredTasks = new HashSet<>(); @Override public void onApplicationEvent(ContextRefreshedEvent event) { Map<String, Object> beansWithAnnotation = ((ListableBeanFactory)event.getApplicationContext()).getBeansWithAnnotation(Component.class); for (Object bean : beansWithAnnotation.values()) { Class<?> clazz = AopProxyUtils.ultimateTargetClass(bean); Method[] methods = ReflectionUtils.getAllDeclaredMethods(clazz); Arrays.stream(methods).forEach(method -> { ScheduledTask annotation = method.getDeclaredAnnotation(ScheduledTask.class); if(annotation != null){ synchronized(this){ if(!registeredTasks.contains(annotation.id())){ registerNewTask(bean,method); registeredTasks.add(annotation.id()); } } } }); } } private void registerNewTask(Object target,Object method){ // 实现具体的任务注册逻辑... } } ``` 上述代码片段展示了如何利用`ApplicationListener`接口捕获上下文刷新完成后的时机去遍历所有的组件(`@Component`)并查找其中含有我们自定义注解的方法。对于每一个找到的目标对象及其关联的方法实例,尝试获取其上的`ScheduledTask`标注信息。一旦发现未曾在之前处理过的任务id,便将其添加至本地维护的任务集合并执行相应的初始化工作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值