![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
文章平均质量分 54
萝卜啃土豆
暗中观察,瑟瑟发抖,兢兢业业
展开
-
Redisson Lock--分布式锁
RedissonClient-(getLock)->RedissonLock-(lock)->tryAcquire-(同步转异步)->tryAcquireAsync-(最终调用)->tryLockInnerAsync-(lua脚本)->lua(脚本原子性,发送)–>redis服务器接受请求,执行脚本。原创 2022-09-22 19:52:53 · 1017 阅读 · 0 评论 -
一句话理解ThreadLocal
一句话理解ThreadLocal原创 2022-06-07 20:28:58 · 138 阅读 · 0 评论 -
java高效的字符串拼接,“+” 与concat()
● 循环体内,字符串拼接,用StringBuilder的append;● “+”会每次循环都new一个StringBuilder对象,然后进行append操作,最后通过toString方法返回,浪费内存资源。//不好都代码String str = "star";for (int i = 0;i<100; i++){ str = str + "aaa";}...原创 2021-11-30 10:42:01 · 675 阅读 · 0 评论 -
java浮点数比较的坑
浮点数的判断—《阿里开发手册》● 基本类型不能用==判断,包装类型也不能用equals判断。● 说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精准表示大部分的十进制小数。float a = 1.0f-0.9f;float b = 0.9f - 0.8f;if(a==b){} // falseFloat x = Float.ValueOf(a);Float y = Float.ValueOf(b);if(x.equals(y)){} //f原创 2021-11-29 19:55:10 · 370 阅读 · 0 评论 -
注解、事务、@Transactional
事务@Transactional基于动态代理机制生效条件注释的方法不能private注释的方法必须是有接口的方法实现(Impl实现类)(通过spring面向接口编程的套路)注释的方法必须通过接口的方式调用(注解本质也是代理,同一个类中直接调用本类的方法,是不会产生代理的,所以注解都不会生效)...原创 2021-11-02 20:54:39 · 168 阅读 · 0 评论 -
注解@Mapper 与@MapperScan
注解@Mapper 与@MapperScanmapper注解 :在dao层,需要每个接口都加上。最终mybatis会有拦截器自动为mapper标记都接口生成代理类,可在MapperRegistry代码查看。mapperscan注解:指定扫描接口都路径,在启动类加,可替代mapper注解(省去mapper注解)。使用后自动生成MapperFactoryBean;不使用就不生成实例,走@Import配置具体可以在 AutoConfiguredMapperScannerRegistrar 和 Mybatis原创 2021-11-02 20:53:18 · 1331 阅读 · 0 评论 -
dubbo的异常处理,全局异常打印堆栈信息
Dubbo全局异常打印堆栈信息问题问题dubbo的服务提供端的异常返回到消费端时会被拦截,不符合条件的会被转化为字符串,变为RuntimeException异常返回。会导致有全限定名等无用信息。dubbo官方推荐的异常和日志 链接尽可能携带完整的上下文信息,比如出错原因,出错的机器地址,调用对方的地址,连的注册中心地址,使用 Dubbo 的版本等。尽量将直接原因写在最前面,所有上下文信息,在原因后用键值对显示。抛出异常的地方不用打印日志,由最终处理异常者决定打印日志的级别,吃掉异转载 2021-11-02 20:52:22 · 866 阅读 · 0 评论 -
调用第三方接口的三种方式
调用第三方接口到三种方式链接Hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.1.0</version></dependency> <!-- json依赖 --><dependency>转载 2021-11-02 20:48:28 · 5762 阅读 · 0 评论 -
架构改Dubbo后的序列化问题,JSON 与javabean 转换问题,范型嵌套
Dubbo序列化的坑起因:因devops用到一些org.gitlab4j.api.models的一些类,但是没有实现序列化接口,sdk也不能更改。sdk的类嵌套了很多层,也不能本地开放接口。过程:暂时先转json字符串后web层转回java bean处理。选择了fastjson工具。转换:JSON.toJSONString();转回:JSON.parseObject(xxString,xx.class);问题:但是list范型转回的时候报错:java.lang.ClassCastExceptio原创 2021-10-27 10:34:59 · 559 阅读 · 0 评论 -
dubbo隐式传参,RpcContext,dubbo Session消费端问题
dubbo 隐式传参+过滤器dubbo,web(消费端)与service(提供端)rpc通信,要传递的实体类必须序列化;有着不同的上下文,web的session,service无法获取。方案:web获取当前登录人名称,传入RpcContext上下文,隐式传参到service端。通过调用拦截器拦截消费断调用方法,调用前传。因项目需要,service模块无法获取session,无法获取当前登陆账户。临时采取这种方案,将web端当前登陆用户名传递给RpcContext上下文,供service使用。先配置原创 2021-10-19 21:51:00 · 818 阅读 · 2 评论 -
接口工具--Swagger
引入依赖<!--swagger--><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId></dependency><!--swagger ui--><dependency> <groupId>io.springfox</groupId>原创 2021-08-03 11:57:33 · 444 阅读 · 1 评论 -
MybatisPlus的代码生成器
MybatisPlus代码生成器,可根据数据库快捷生成实体类,service,mapper等模板。public void genCode() { // 1、创建代码生成器 AutoGenerator mpg = new AutoGenerator(); // 2、全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getPrope.原创 2021-08-03 11:44:02 · 242 阅读 · 0 评论 -
JAVA基础--Synchronized原理
背景6之前是重量级锁依赖硬件实现。与Lock性能差距很大。6之后进行了优化,锁升级机制,与Lock性能相当。原理保证方法或代码块在运行时,同一时刻只有一个方法可进入临界区,同时还可保证共享变量的内存可见性。java每个对象都可加锁,这是Synchronized实现同步的基础普通同步方法,锁是当前实例对象静态同步方法,锁是当前类的Class对象同步方法块,锁的括号里面的对象public calss SynchronizedTest{ public Synchronize转载 2021-06-28 09:52:16 · 106 阅读 · 0 评论 -
Docker
常见命令作为简单记录docker --versiondocker pull xxxdocker rmi xxxdocker search xxxdocker imagesdocker image lsdocker[image] run xxxdocker create xxxdocker run -itd --name redis-test -p 6379:6379 redisdocker[container] run xxxdocker[container] restart x转载 2021-06-20 16:46:38 · 77 阅读 · 0 评论 -
设计模式--代理模式
代理模式为什么需要隔离真是对象,开闭原则(对修改封闭,对扩展开放)什么是定义接口和方法。真实对象实现接口(非必须)创建代理类,实现接口,并内部持有真是对象(private User user)。优缺点职责清晰高扩展智能化性能额外工作量实现方法静态代理需要为每个代理对象创建一个代理类。动态代理是运行中自动生成,不用手动创建。静态JDK动态cglib动态动态代理动态代理利用的是反射技术JDK动态涉及的两大核心类是Proxy原创 2021-06-20 16:44:27 · 65 阅读 · 0 评论 -
JAVA基础--异常
RuntimeException运行时异常,及其子类统称非受检查异常,如:、NPE空指针异常、NumberFormatException字符串转换异常、ArrayInedxOutOfBoundsException数组越界、ClassCastException类型转换错误、ArithmeticException算术错误等。三种情况finally不会执行try或finally中使用了System.exit(int)退出程序,但是若 System.exit(int)在异常语句之后,finally还...原创 2021-06-20 16:42:39 · 78 阅读 · 0 评论 -
JAVA基础--多线程
前言JAVA线程状态经常有人搞混,说5种6种甚至7种都有。其实5种是操作系统的线程状态,JAVA有6种,Thread源码的枚举类型statue有提现。NEW:被创建,还没有调用start()方法;RUNNABLE:运行中,JAVA中把操作系统的就绪(ready),运行(running)统称为”运行中“。线程对象被创建后,其他线程(如main)调用了该对象的start方法,该状态的线程位于可运行线程池中,等待被线程调度选择,获取cpu权限,此时是就绪(ready)。就绪状态的线程获取原创 2021-06-20 16:41:48 · 103 阅读 · 0 评论 -
JAVA基础--克隆,深浅拷贝
克隆条件实现Clonyable接口(标记接口,自身没有方法。)覆盖Object的clone()方法,默认可见性为protected,需要提升至public。浅拷贝不对clone()改造,只提升可见性。被复制对象若有引用对象属性,克隆后的对象的引用属性仍然指向被克隆对象。默认的clone方法仍然是赋值。深拷贝需要引用类型属性的类也要实现clone。@Datapublic class Address implements Cloneable { private St原创 2021-06-20 16:38:39 · 111 阅读 · 0 评论 -
JAVA8新特性
JAVA8新特性:lambda表达式允许把函数作为一个方法的参数,函数作为参数传递到方法中。方法引用提供了非常有用的语法,可以直接引用已有的java类或对象(实例)的方法或构造器。与lambda联合使用,可以使语言的构造更加紧凑简洁,减少冗余。默认方法一个在接口里面有了一个实现的方法。新编译工具新的编译工具,nashorn引擎jjs、类依赖分析器jdeps。Stream APIjava.util.stream,把真正的函数式编程风格引入到java中。转载 2021-06-05 16:52:28 · 77 阅读 · 0 评论 -
利用反射创建对象的方式
利用反射创建对象的方式:Fruit apple = new Fruit();获取类的Class对象:对象.getClass()Class<?> clazz1 = apple.getClass();类.classclazz2 = Fruit.class;Class.forName()clazz3 = Class.forName("com.test.demo.Fruit");创建使用Class对象的**newInstance()**方法创建类..原创 2021-05-30 12:25:20 · 177 阅读 · 0 评论 -
JAVA执行流程和内存模型
JAVA执行流程和内存模型执行流程java程序执行分两步第一步:java源码(.java文件)通过编译器(javac.exe)编译成JVM文件(.class文件)。第二部:将JVM文件通过java.exe执行,输出结果。java源文件–(javac.exe)–>JVM文件–(java.exe)–>结果。JVM至关重要,其向上屏蔽了操作系统,也是java跨平台的关键。编译和执行的三个重要机制java编译机制:分析和输入到符号表注解处理语义分析和生成class转载 2021-05-29 14:40:46 · 198 阅读 · 0 评论 -
@Bean/@Component注解
@Bean/@Component相同点结果相同,都是为spring容器注册Bean,最后bean都会被添加到spring上下文中。不同点@Component(作用在类):[同Controller/Service/Respository]:表面一个类为组件类,告知spring为这个类创建bean;spring2.5提出,主要为了通过classpath scanning拜托xml文件定义bean。只有我们的springboot启动了组件扫描且包含了被注解的类时才有效。通过组件扫描,spr原创 2021-04-23 13:41:39 · 262 阅读 · 0 评论 -
JAVA避免空指针异常(NPE)的常见技巧
equals()方法常量在前如果一个对象又可能为Null那么尽量不要直接使用他的方法private Boolean isKong(String str){ //str为空会出现NPE return str.equals("kong"); //× return "kong".equals; //√}初始化赋默认值对象初始化的时候赋默认值String str = null; //XStringUtils类StringUtils.isEmpty()..原创 2021-03-16 08:33:10 · 314 阅读 · 0 评论