- 博客(83)
- 收藏
- 关注
原创 SpringCloud开发的微服务项目
通过 MQ 对用户服务与积分服务之间的服务调用进行解耦,对于服务调用产生的分布式事务,采用最终一致性方案,发送端采用 MQ 消息确认 Confirm 机制,接收端采用手动 ACK 模式保证消息的可靠传输;通过监听来自用户服务对积分的操作消息实现对用户积分的修改,同时使用防重表保证操作的幂等性;采用接口隐藏技术,通过对积分地址重写为每个用户提供唯一的接口,可以防止网络爬虫。主要功能包括:登录及退出、活动空间的创建、内容的发布、评论、数据的检索、热点数据的推送、消息的推送、用户实时交流等功能。
2023-05-06 15:25:03
300
1
原创 Ribbon的自定义规则为什么不可以放在ComponentScan的包扫描路径中
对于一个Ribbon可以由多个访问url,如果被扫描到,就造成了所有访问url的规则都共享一个rule了。
2022-11-09 10:18:08
370
原创 js箭头函数
如果箭头函数中只有一句return,那么可以同时省略大括号与return;但如果使用了大括号,即使只有一句表达式,也必须有return。
2022-11-02 10:57:39
228
原创 mybatis源码学习笔记
进行拦截,处理spring动态代理的逻辑,实现事务-->同一个事务获得的是同一个sqlSession对象(原生mybatis真正发起查询的对象),如果不进行动态代理,就需要在该类中的许多方法都实现构造DefaultSqlsession对象,代码冗余,所以就进行了动态代理,相对于抽取了公共的切面。一级缓存是sqlSession级别的,二级缓存是应用级别的,可以跨线程使用,流程-->会话->二级缓存->一级缓存,所以二级缓存的命中率更高,适合缓存一些修改较少的数据。二级缓存使用的是装饰器模式+责任链模式。
2022-09-26 21:21:19
192
原创 mybatis vs 线程安全
一次SqlSession的执行最终只会产生一个connection,所以我们设想一下,在两个线程通过同一个sqlsession来执行crud,那么就有可能,我先跑完的线程,把唯一的这一个连接给关闭掉,从而造成另一条线程的逻辑不被成功执行,所以通过DefaultSqlSession来执行数据库操作是线程不安全的。如果我每次 查询都新建DefaultSqlSession 就不会有线程安全问题了,说白了 线程不安全,就是使用同一个 DefaultSqlSession 实例而已。
2022-09-26 21:20:22
670
原创 springscurity+scrf
CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于cookie中,因此攻击者可以在不知道用户验证信息的情况下直接利用用户的cookie来通过安全验证。由此可知,抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信总不存在于cookie之中。token的值通过服务端生成,表单提交后token的值通过POST请求与参数一同带到服务端,每次会话可以使用相同的token,会话过期,则token失效,攻击者因无法获取到token,也就无法伪造请求。
2022-09-26 21:19:07
140
原创 ConcurrnetHashMap学习
如果只有一个cpu,就么必要划分,只由一个线程完成即可,否则,划分为至少16个格子一个任务块,不足的就是16),进行数据迁移时,如果该位置正在迁移,会在数组该下标赋值ForwardingNode节点(hashCode值是MOVED),表示该位置数据正在迁移,别往该位置插入元素了。走到插入的逻辑时,用的是CAS+自旋,在一个空单元格插入元素时,利用了CAS的方法插入,判断元素的值是否为null,为null才进行插入,否则下一轮循环(自旋中)走该位置不为空的逻辑,sizeCtl=0.75*size;
2022-09-26 21:17:59
598
原创 hashMap理解
太大了:空间利用率得到提高,但hash碰撞的概率太大了,因为扩容太晚了,容易形成链表,查询效率太低。1:h&(length-1)等效于h%length的前提是length必须2的n次幂。太小了:碰撞的概率低,很快就扩容,不易形成链表,查询效率高,但空间利用率太低。1.8 HashMap 列表进化为红黑树 阈值为8,退化阈值为6。2:防止hash冲突,多1就使得有效位更多。0.75是空间效率和时间效率的折中。
2022-09-26 21:17:08
138
原创 hashMap的bug
get可能取不到值,put可能丢失数据,极端情况hashmap会被清空。1.7还可能会死循环,1.8已解决。如果再并发的情况下,两个线程进行同一个key的put操作,最后一定会造成一个覆盖另一个就造成了数据的丢失。
2022-09-26 21:16:24
486
原创 ZooKeeper一致性
zookeeper使用的ZAB协议进行主从数据同步,ZAB协议认为只要是过半数节点写入成为,数据就算写成功了,然后会告诉客户端A数据写入成功,如果这个时候客户端B恰好访问到还没同步最新数据的zookeeper节点,那么读到的数据就是不一致性的,因此zookeeper无法保证写数据的强一致性,只能保证最终一致性,而且可以保证同一客户端的顺序一致性。但也可以支持强一致性,通过sync()方法与Leader节点同步后可保证当前节点数据与Leader一致。ZooKeeper是弱一致性,能保证最终一致性。
2022-09-26 21:13:33
1151
原创 spring configuration.class与xml的组合
以java为中心,@ImportResource 并根据需要定义XML。configuration.class与xml的组合,以xml为中心,在xml中引入conf,conf只是一个bean。
2022-09-23 15:09:09
246
原创 为什么spring不扫描controller层注解,springmvc不扫描sevice层注解
如果不用spring容器,同时扫描controller、service、dao层,但子容器controller进行扫描装配时装配了@service注解的实例,而该实例应该由父容器进行初始化以保证事务的增强处理,因为事务福利器配置在spring容器中,所以初始得到的将是原样的service(没有进攻事务加强处理,故而没有事务处理能力。再springmvc中,经常配置两个xml,一个spring专属,一个springmvc专属,再这两个xml中都可以配置bean的自动扫描。1、全部放到spring.xml。
2022-09-23 15:08:09
729
原创 spring 初始化注解
通常,@PostConstruct和@PreDestroy注解被认为是在Spring应用程序中接收生命周期回调的最佳实践,这是java的注解。优先级:Constructor(构造器) > @PostConstruct > InitializingBean > init-method。使用这些注解意味着您的bean没有耦合到特定于Spring的接口。
2022-09-23 15:05:43
1231
原创 spring初始化
1.实现InitializingBean接口,继而实现afterPropertiesSet的方法。2.反射原理,配置文件使用init-method标签直接注入bean。3.@PostConstruct注解。spring初始化目前有三种方式。
2022-09-23 15:04:40
281
原创 Linux文件查找
通常,find不常用,因为速度慢,耗费硬盘空间。whereis命令不是通过查找磁盘上的所有文件来实现定位的,你可以随便指定一个可执行文件,估计whereis会找不到,这是因为whereis是根据环境变量PATH来查找文件的,而PATH通常设置成存放命令的那些路径,如 /bin、/usr/bin等,因此whereis的用途仅限于定位shell命令所在的位置。功能:查找文件 find命令可以用来从指定的目录开始查找文件,它的速度虽比不上whereis命令,但没有任何限制,而且功能要比whereis命令强。
2022-09-23 15:03:54
141
原创 set 家族
set是用来存储没有重复的元素的。所以,不同的时候我们自然需要考虑如何选择使用不同的set。一般来说,如果我们需要一个存取效率比较高的set,我们可以选择hashset,如果我们需要一个可以自动给元素排序的set,我们就需要使用treeset,如果我们想要元素按插入的样子保持顺序,那么我们就可以使用LinkedHashSet。hashset通过哈希表实现,元素是不排序的,所以输出set的时候元素的顺序是随机的,add,remove, and contains这三个方法的时间复杂度都是常数 O(1)。
2022-09-23 15:03:23
144
原创 LinkedList
LinkedList有get(int index)方法,但是不支持高效的快速随机访问,LinkedList没有索引,因为它本质上是链表,只能从头依次开始查找,只能顺序访问。
2022-09-23 15:02:30
574
原创 泛型的类型擦除
如果允许创建泛型数组,将能在数组p里存放任何类的对象,并且能够通过编译,因为在编译阶段p被认为是一个Object[ ],也就是p里面可以放一个int,也可以放一个Pair,当我们取出里面的int,并强制转换为Pair,调用它的info()时会怎样?所以,Java不允许创建泛型数组。只能对原始类型进行类型检测,无法判断带泛型的类型,例如都是List类型的对象,因为根本就没有List类,不能实例化类型参数,因为在运行时无法确定具体类型。
2022-09-23 15:01:19
279
原创 java异常
运行时异常的特点是Java编译器不会对异常进行检查。也就是说,当程序中出现这类异常时,即使没有使用try...catch语句捕获或使用throws关键字声明抛出,程序也能编译通过。运行时异常一般是由程序中的逻辑错误引起的,在程序运行时无法恢复。在Exception类中,除了RuntimeException类及其子类外,Exception的其他子类都是编译时异常。编译时异常的特点是Java编译器会对异常进行检查,如果出现异常就必须对异常进行处理,否则程序无法通过编译,无法生成字节码文件。
2022-09-17 19:39:52
132
原创 为什么父类将子类需要覆盖的方法设置为protected
如果子类要覆盖(overwrite)了父类中定义的方法,那么不能降低其可见性。人可以讲话,但学生作为人的一种却不能讲话,这显然是不合理的。即如果在父类中定义一个protected方法,那么在子类中可以将其覆盖,并将访问控制属性改为public,反过来则不行。
2022-09-17 19:38:35
277
原创 Spring自动装配
Constructor 类似于byType,不过是调用构造函数进行依赖注入,如果一个bean的类型与构造函数的参数相同,则会自动装配。Autodetect 如果有默认的构造器,则通过constructor方式进行装配,否则通过byType方式。ByName 通过bean的名称装配。即属性名==某个bean的名称。no 缺省,默认,通过ref或value设定。Spring自动装配,给bean注入属性。ByType 根据类型进行装配。
2022-09-17 19:36:38
74
原创 spring事务失效
1、发生了自调用,调用了类中(this)的事务方法,但this指向的不是代理对象,而是对象本身,可以通过注入一个本类变量的引用调用方法。Spring事务的原理是AOP,进行了切面增强,失效的根本原因是AOP不起作用了。2、方法不是public的。4、没有被spring管理。3、数据库不支持事务。
2022-09-17 19:35:56
633
原创 BeanFactory vs ApplicationContext 初始化
BeanFactory在初始化的时候,不会加载任何bean实例;而ApplicationContext初始化的时候,会提前加载xml中配置的所有单例bean。
2022-09-17 19:35:23
78
原创 java类型升级
如果任一方为double,则另一方转换为double。否则如果任一方为float,则另一方转换为float。§否则如果任一方为long,则另一方转换为long。§否则两边都会转换为int。
2022-09-17 19:33:57
110
原创 java jdk 和 sdk ,有啥不一样 ?
这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。SDK是一系列文件的组合,它为软件的开发提供一个平台(它为软件开发使用各种API提供便利)。3、可以认为jdk只是sdk的一种(子集),因为它是开发java程序的一个平台,开发其他程序的sdk可以没有jdk。但是只要开发java程序就必须使用jdk。JDK(Java Development Kit,Java开发工具包)是Sun Microsystems针对Java开发员的产品。
2022-09-17 19:32:55
1582
原创 为什么重写equals方法,还必须要重写hashcode方法
因为HashMap是用equals判断键是否相等的,用反证法,如果两个键 equals相等,而hashcode不等的话,那么就无法保证通过hashcode计算的下标值相等,下标值不等也就意味着相等的两个键却 到了不同的值,这肯定是不对的,同一个对象定位到了不同的value。是为了提高效率,采取重写hashcode方法,先进行hashcode比较,如果不同,那么就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的。
2022-09-17 19:32:00
1073
原创 String + final
String是被final修饰的,每一次修改都会生成一个新的对象,StringBuffer和StringBuilder都是在原对象上操作的,StringBuffer是线程安全的(sync修饰);StringBuilder是线程不安全的(多线程环境,共享变量)。
2022-09-17 19:30:51
166
转载 maven裁剪反应堆
假设有Email,Parent和SubModule 模块,其中Email 依赖于Parent,SubModule又依赖于Email模块。-amd, --also-make-dependents 同时构建所列模块的依赖模块和依赖此模块的模块。假设有Email和Parent模块,Email模块依赖与Parent模块。-pl, --projects 构建指定的模块,模块间用逗号分割。-am, – also-make 同时构建所列模块的依赖模块。-pl -amd 构建。-pl -am 构建。-pl -am 构建。
2022-09-04 23:08:18
184
原创 父maven工程可以继承的pom属性中dependences和dependencyManagement的区别
dependences都被子项目继承,而后者不会被引入子项目,不过会约束子项目对依赖的使用。
2022-09-04 22:36:12
173
转载 MAVEN中镜像和仓库的区别
但是并不是所有库都得去镜像下载,所以,可以配置mirrorOf,取消一些含有特殊jar包的仓库(例如企业私服,当然使用企业私服作为镜像的是另外一种类型,我们公司的企业私服不能联网,只是自己开发的一些jar包发布在那里)。镜像相当于起到拦截和请求转发的作用,而私服则起到加速下载构建和存储第三方构建,节省本地maven配置等作用,二者结合可以使maven的优点体现地淋漓尽致。如果镜像配置了 mirrorOf = *, 则不管项目的 pom.xml 配置了什么仓库, 最终都会被镜像到镜像仓库。
2022-09-04 15:11:01
1465
1
原创 把setting.xml放在conf和.m2目录的区别
前者又被叫做全局配置,后者被称为用户配置。如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml优先。
2022-09-04 15:00:06
268
原创 为什么maven排除依赖时不需要指定版本号
一个项目经过maven解析后不会存在groupId和artifactId相同,而版本号不同的两个依赖,经过版本仲裁、依赖调解。
2022-09-04 10:40:49
789
原创 局部内部类和匿名内部类只能访问final变量
内部类和外部类编译会生成两个平级的.class文件,对于在一个方法中定义的以上两种内部类,如果引用了方法中的变量,当方法执行完成之后,局部变量会被回收,但内部类中仍然引用了它,这就造成了内部类对象访问了一个不存在的变量。所以内部类会赋值局部变量的值作为内部类的成员变量,实际访问的是一份拷贝。但将局部变量复制为内部类的成员变量时,必须保证这两个变量的值是一样的,只能用final修饰,一旦赋值不允许在修改,保证了一致性。...
2022-08-26 13:37:47
406
原创 jar包 vs war包
如果一个Web应用程序的目录和文件非常多,那么将这个Web应用程序部署到另一台机器上,就不是很方便了,这时可以将Web应用程序打包成Web 归档(WAR)文件,这个过程和把Java类文件打包成JAR文件的过程类似。JAR文件的目的是把类和相关的资源封装到压缩的归档文件中,而对于WAR文件来说,一个WAR文件代表了一个Web应用程序,它可以包含 Servlet、HTML页面、Java类、图像文件,以及组成Web应用程序的其他资源,而不仅仅是类的归档文件。...
2022-08-26 13:37:08
266
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人