SpringAOP如何获取方法参数上的注解

@Aspect
@Configuration
public class ValidateAop {/*** 切点配置,表达式, 在com.laoxi.test.controller包下,所有的类public的任意参数的方法*/@Pointcut("execution(public * com.laoxi.test.controller.*.*(..))")public void validate(){}@Before("validate()")public void doBefore(JoinPoint joinPoint){Object[] params = joinPoint.getArgs();if(params.length == 0){return;}//获取方法,此处可将signature强转为MethodSignatureMethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();//参数注解,1维是参数,2维是注解Annotation[][] annotations = method.getParameterAnnotations();for (int i = 0; i < annotations.length; i++) {Object param = params[i];Annotation[] paramAnn = annotations[i];//参数为空,直接下一个参数if(param == null || paramAnn.length == 0){continue;}for (Annotation annotation : paramAnn) {//这里判断当前注解是否为Test.classif(annotation.annotationType().equals(Test.class)){//校验该参数,验证一次退出该注解//TODO 校验参数break;}}}}
}

另外还有JAVA反射。

ArrayList和LinkedList

数组列表(连续空间,get/set快)和链式列表(断续空间,增删快)。


数据库隔离四个级别

总结就是:未提交读,提交读,行锁,表锁

  • 未提交读
    未提交读比较好理解,就是说即使一个事务没有提交,那么它所做的数据修改对其它事务也是可见的。这种隔离级别是最低等级的隔离,它会导致事务可以读取到脏数据,在实际应用中很少见。

  • 提交读/不可重复读
    和上面的相对应,只有当事务提交了,事务对数据的修改才会对其它事务可见。这种隔离级别被大多数数据库系统作为默认的隔离级别。这种级别也会导致一个问题,举个例子,在一个事务的代码中有两个select name from Student where id=1;语句,那么第一次执行的时候这个同学的名字可能是张三,第二次执行的时候名字变成李四了。这是因为两次查询之间可能有别的事务对name这个属性做了修改。

  • 可重复读
    这种隔离级别解决了上面同一个语句得到不同结果的问题。一种可行的方案是对要查询的列加锁,让其它事务无法修改要查询的行。还是上面的例子,在第一次执行select name from Student where id=1语句的时候,我们就把id=1的这一列锁住,直到当前事务完成,这样就可以重复读到相同的结果了。但是这种读取方式也有一个问题,比如说运行select name from Student where id>10;语句,假如当前id大于10的学生有两个,当我们执行了一次这个语句之后,对这两行加了锁。但是另一个事务仍然可以添加一个id等于13的同学,这个时候第二次执行语句就会搜出三个同学,这种现象叫做幻象读。

  • 串行化读
    这种是最高的隔离级别,它强制事务对查询/修改的表进行加锁,这样其它事务就无法对这个表中的数据进行修改,也就规避了幻象读的风险。这种隔离级别虽然最安全,但是也有相应的代价,那就是它会导致锁争用的问题,而且严重降低了数据库的并发程度,因此在实际应用中也不常见。

Java之voliate, synchronized, AtomicInteger使用

voliate 用在多线程,不使用copy不同步变量,直接引用内存。 线程为了提高效率,将成员变量(如A)某拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) ,但是不能用其来进行多线程同步控制

synchronized 并发锁,可重入锁,非公平锁。当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

AtomicIntegerAtomicReference原子类 ,使用原子类,即使不用同步块synchronized,最后的结果也是1000,可用看出AtomicInteger的作用,用原子方式更新的int值。主要用于在高并发环境下的高效程序处理。使用非阻塞算法来实现并发控制。乐观锁。

判断一个二叉树是否是另一个二叉树的子树

先查找根节点,如果在 b 树上能找到 a 树的根节点的话,则通过找到的那个节点中序遍历并打印地址,a 树也是中序遍历,如果打印一致,则证明 a 是 b 的子树

抽象类和接口的区别

抽象类是对一种事务的抽象,是对整个类进行抽象,包括属性,行为(方法)。接口是对行为(行为)的抽象

设计一个分布式登陆系统

运用Redis缓存将Token存入缓存

将 session 全部存放到 Redis 中,Redis 全局管理数据,因为独特的 key 过期时间特性,对应 session 的过期特性,也很般配。另外,Redis 比较轻量,性能也很好。

用户在登录的时候如果通过鉴权体系的鉴定,可以生成 Token 数据,以 Token 作为键名用户登录信息、权限信息等作为值,写入到 Redis 中,设置过期时间,并将 Token 写入 cookie 中。用户进行需要鉴权的操作时,通过拦截器判断用户请求头中 cookie 的 token 字段是否能在 Redis 中查询到数据。如果能查询到,判断权限是否符合,权限不符返回没权限,没有token就返回登录 URL,这样一个分布式系统的单点登录系统就实现了。

分布式事务

  • MyCAT 基于 XA 实现分布式事务
      用户应用侧(AP)的使用流程如下:
      (1)set autocommit=0
      在应用层需要设置事务不能自动提交;
      (2)set xa=on
      在 SQL 中设置 XA 为开启状态;
      (3)执行 SQL
       insert into travelrecord(id,name) values(1,’N’),(6000000,’A’),(321,’D’),(13400000,’C’),(59,’E’);
      (4)commit 或者 rollback
  • redis:利用redis的setnx、lua脚本、消费订阅机制来实现

乐观锁,悲观锁

悲观锁

总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronizedReentrantLock等独占锁就是悲观锁思想的实现。

乐观锁

总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。SpringBoot @Version也是基于乐观锁实现。

两种锁的使用场景

乐观锁适用于写比较少的情况下(多读场景),多写的场景下用悲观锁就比较合适。

知乎上一些JAVA精选问答相关推荐

  1. 知乎上关于电子商务话题的精彩问答

    知乎上关于电子商务话题的精彩问答 zz http://www.douban.com/group/topic/22418888/ 电商本质: 电子商务公司究竟应该是互联网基因,还是零售基因的改良?为什么 ...

  2. 企业在知乎上做问答推广的技巧分析,企业知乎推广营销方法步骤

    很多企业想要在知乎通过问答推广来进行品牌漏出,但在知乎做推广营销并不简单,这其中既要了解知乎的算法规则,也要明白知乎对内容的审核要求,下面洛希网络科技为大家分享企业在知乎上做问答推广的技巧. 1.流量 ...

  3. 【Python】爬取知乎上的问答数据来汇总出有哪些免费的论文查重网站

    本文目录:哪里获取-如何获取-代码编写-数据处理 本文作者:小赖同学 最近突然感觉自己越来越社会人,这不,小我三届的师弟都来请教我有关毕业的事情了. 不知不觉,就又到了一年的毕业季,曾经在校园潇洒的我 ...

  4. java 球面距离_[置顶] C语言实验题:已知地球上两点的经度和纬度求其球面距离...

    要求:地球的平均半径为6371千米,已知地球上两个城市A.B的经度和纬度,编程序求出这两个城市之间的地面距离. 首先,固定两点,a(x1,y1,z1),b(x2,y2,z2). 由空间解析几何及向量知 ...

  5. 利用python爬取_在知乎上利用Python爬取了三百万数据!服务器崩了!企业级大项目...

    请各位注意: 以下所有分析结果都基于我抓取到的这300万用户的个人信息,非权威分析,仅供参考. 数据抓取时间为2017年7月份,用户数据会随着时间推移而变化,所以该报告具有一定时效性. 知乎的用户个人 ...

  6. java 精选选择题_Java生产率提示:社区精选

    java 精选选择题 社区已经发言. 我们已将您最好和最出色的生产力技巧汇总到一篇文章中. 我们都有自己的小技巧,可以帮助我们提高工作效率,并提高生产率. 我们使用工具来避免繁琐的日常任务,并运行脚本 ...

  7. 一年前我在知乎上提了个愚蠢的问题:如何入门 Linux ?

    前言: 一年前(2019.07)看了几个 Linux 和 Vim 配置视频,被 UP 主行云流水的操作和高度定制化的配置打动了,也想玩玩 Linux .从 Windows 应用商店下载了个 Ubunt ...

  8. CSDN问答——精选问答Vol.7

    <精选问答>挑选CSDN问答频道每周最新最热的优质回答,为大家提供可信赖的优质解答,点击查看更多已解决问题 目录 1.想把javaScript变量传递asp页面 存入数据库获取值 不是空 ...

  9. java拷贝远程服务器上文件,java拷贝远程服务器上文件

    java拷贝远程服务器上文件 内容精选 换一换 在Windows模式下,调试功能暂不可用.为支持多交叉架构的调试场景,需要在安装MindStudio的服务器(UI Host)上安装gdb-multia ...

最新文章

  1. php获取svn文件,然后ftp上传服务器代码
  2. 无状态的HTTP协议
  3. hdu-4451-Dressing
  4. 模式匹配运算符–Shell
  5. 华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历
  6. 在win10中使用任务计划程序_设置定时任务---Windows使用技巧工作笔记001
  7. 用eclipse制作简单网页
  8. 安卓真机测试遇到的检测不到安卓设备的问题
  9. 关于C#中Thread.Join()的一点理解
  10. (转)策略回测的框架、实现、测试
  11. 计算机病毒的一些印象
  12. Ubuntu 安装 Libmodbus
  13. Macbook开启HIDPI(2K显示器)
  14. 常见网络编程面试题答案征集与面试题(收集) ZZ 【网络编程】
  15. 华为路由及静态路由的配置
  16. 微信小程序云开发教程-互联网软件产品开发流程和团队分工
  17. 【51单片机】花式流水灯
  18. 判断Stack为空的方法之empty()与isEmpty()
  19. Linux -- SELinux配置及应用(1)
  20. 手动彻底清除恶意网页病毒

热门文章

  1. bga封装扇出_0.5间距BGA封装,怎么扇出啊
  2. 微软365网盘国内服务器,5TB微软Office365网盘OneDrive详细申请方法教程
  3. Ext4.0源码解读(分享二)
  4. Spring Cloud 微服务学习与实践
  5. CCF计算机软件能力认证试题练习:201612-2 工资计算
  6. 文档生成工具-Doxygen使用方法以及注释规则
  7. 软件开发必备各大网站软件提交入口 软件发布入口汇总
  8. 【3维视觉】DCC-DIF复现,超详细避坑指南
  9. 从2021年度业绩报告看奇安信的网安“野望”
  10. React-Native全球化语言切换工具库react-native-i18n