什么是代理?为什么要用动态代理?
代理模式大概意思是:为其他对象提供一个代理项或者是占位符,以控制对这个对象的访问
代理模式核心思想:创建一个代理对象,在客户端和目标对象之间的一个中介,主要作用就是保护目标对象以及增强目标对象
静态代理:相当于是这个代理对象我们需要手动去创建,而且一个代理对象只能服务于一种业务类型对象,那么当我们有n个业务目标对象的时候,就需要n个静态代理对象,这样的话就不利于我们业务的扩展
举例:有一个程序员张三,他平时加班比较多,并且加上公司的异性同事又比较少,然后又不善于与其沟通,那自己又缺少人脉和资源,所以一直没有找对象,这时张三的父亲张老三就比较着急了,他就利用自己的人脉然后经常给张三安排相亲,那张老三就是张三的代理的相亲对象,那么问题来了,一般情况下,张老三是不会给李四去安排相亲的,因为张老三是不会关心李四有没有对象这个事情,李四有没有对象只有李老四才会关心,那么这个时候呢,就出现了一个新的职业叫媒婆,媒婆就会关心张三李四王五赵六等这些有没有对象,媒婆就成了所有相亲需求的代理对象,那么这样的代理对象就可以服务于所有相关业务对象,这就相当于动态代理对象
减少代理对象的个数,从而去降低程序的复杂度,易于复杂业务的动态扩展
jdk proxy的基本实现原理
- 拿到目标对象的引用,并且通过反射去获取目标对象所有的接口
- 要重新去生成一个新的代理类,实现目标类所有的接口方法
- 把增强的逻辑代码加入到新生成的代理类的源代码中
- 动态去编译代理类的源代码并且生成字节码即class文件,这个部分是内存中完成的
- 去加载并执行新生成的代理对象
CGLib和JDK动态代理的对比
- JDK动态代理是实现目标对象的接口,而CGLib是继承目标对象
- JDK和CGLib都是在运行期生成字节码
- JDK通过反射来调用目标方法,而CGLib是通过FastClass机制调用目标方法
目标对象即被代理对象
为什么不用UUID来做主键?
- 无序不是趋势递增,而是会导致树的分裂与合并,树的问题虽然查询快,但是修改比链表慢,增加数据的时候会很慢 联想hashmap1.8以后他加了一个红黑树,他在链表和红黑树之间转来转去,如果数据小于6了,就把它转为链表了
- 内存 页放的数据越少,同样的数据我需要的页数越多 层级可能越高 磁盘io次数越多(int -> String)
SpringBoot和传统的Spring有什么区别
首先,springboot采用了约定大于配置这样一个理念,大大简化了spring应用的初期搭建以及后期的维护工作,它提供大量的自动配置,开发者不需要进行繁琐的XML配置就可以专注于核心业务的开发
其次,springboot内置了Tomcat等应用服务器,让项目的部署也变得更加方便,同时springboot还提供了许多starters组件,方便集成各种常用的框架和中间件,比如Redis,JPA,MQ等,相比之下,传统的Spring配置更加灵活,可以适应各种复杂项目的需求,但是相应的配置更加复杂,对于我个人而言,我更加倾向于使用SpringBoot,因为它能让我更加专注与业务代码的编写,而不需要花费大量的时间在配置和环境搭建上,以上就是我对这个问题的理解
项目举例描述
比如说我先拿到这个文件,然后去遍历这个文件里面的词组,然后我给他建立一个正排的索引和一个倒排的索引,通过一个ID,也就是集合的下标,他们建立关系,然后查询的话就是用倒排获得这种ID,再通过正牌去拿到文章的内容,然后再展示出来,然后这边就会涉及到权重的问题和排序的问题
反射
反射是指在运行时检查和操作类、接口、字段、方法等程序结构的能力。通过反射,可以在运行时获取类的信息,创建类的实例,调用类的方法,访问和修改类的字段等。通过反射可以提高程序的灵活性和可扩展性,可以实现更多的功能。但在使用反射时需要考虑性能问题以及安全等问题。
克隆
线程安全
如何查看端口80有没有被占用
netstat -anp | grep 80