
Java
lkforce
这个作者很懒,什么都没留下…
展开
-
MyBatis源码学习(七)——从源码看MyBatis如何使用缓存
目录前言和总纲一,创建SqlSession二,创建CacheKey三,执行sql四,sqlSession的提交先上总结:1,创建sqlSession阶段。创建Executor执行器,其中有两个参数,localCache和localOutputParameterCache,localCache是一级缓存,localOutputParameterCache用于缓存存储过程的OUT和INOUT参数。Executor执行器首先会被CachingExecutor装饰,然后又被插件列表.原创 2020-12-27 22:56:20 · 1290 阅读 · 0 评论 -
MyBatis中单一简单参数判断null的方法
比如有这样一个方法:List<Order> selectListById(Integer id);只有一个数字类型的参数,而且id参数有可能是null。如果在xml文件里这样写:<select id="selectListById" resultMap="baseResultMap" parameterType="java.lang.Integer"> select * from `order` a where a.status=0原创 2020-12-01 15:04:48 · 5596 阅读 · 1 评论 -
java项目中获得resources目录下的文件或图片
要获得resources目录下的文件或图片,网上一查有很多种方法,试了一下如下方法可行:InputStream is = this.getClass().getResourceAsStream("/test.jpg");得到的是直接放在resources目录下的test.jpg图片文件流。...原创 2020-12-01 14:52:49 · 7441 阅读 · 2 评论 -
红黑树简介,以及ConcurrentHashMap如何平衡红黑树
ConcurrentHashMap基础1,ConcurrentHashMap维护了一个Node数组(JDK1.8),保存了各节点链表的头节点。2,当链表长度超过8时,ConcurrentHashMap会考虑把链表转为红黑树,但不一定真的转。3,当链表长度超过8,但Node数组长度小于64时,优先考虑数组扩容。如果Node数组长度大于64,则把链表转为红黑树。红黑树基础红黑树是一种近似平衡的二叉查找树,它并非绝对平衡,但是可以保证任何一个节点的左右子树的高度差不会超过二者中较低...原创 2020-07-29 12:02:57 · 1439 阅读 · 0 评论 -
对象添加到HashSet(或HashMap)后修改Hash值,无法remove的原因
目录一,一个例子二,一些基础知识三,HashMap的remove()方法四,下标变更的三种场景一,一个例子public static void test1() { Order o1 = new Order(); o1.setId(1); Order o2 = new Order(); o2.setId(2); Order o3 = new Order(); o3.setId(3); Order o4 = new Order()原创 2020-07-27 18:05:21 · 2443 阅读 · 2 评论 -
对象添加到集合之后再修改对象,会发生什么
把对象添加到集合中,然后再修改对象,会发生什么呢?下面分别看一下修改对象属性值和修改对象引用后的效果。案例一,修改对象属性值创建几个对象,添加到List中,然后修改对象的属性值,那么List中的元素的属性值会随之改变,比如下面的例子:public static void test1() { List<Order> list = new ArrayList<>(); for (int i = 0; i < 3; i++) { .原创 2020-07-27 17:43:44 · 7343 阅读 · 2 评论 -
手动调用指定Dubbo接口(三)----GenericService篇
我写了个方法,可以给方法传递指定的Dubbo接口名,方法名,参数值,方法来调用我们指定的Dubbo接口,并返回结果。这次用的是Dubbo的GenericService。示例代码:@Controller@RequestMapping("/test")public class TestController { /** * @param interfaceName Dubbo接口名 * @param methodName 方法名 * @para.原创 2020-06-23 18:40:11 · 3636 阅读 · 0 评论 -
手动调用指定Dubbo接口(二)----Reference篇
我写了个方法,可以给方法传递指定的Dubbo接口名,方法名,参数值,方法来调用我们指定的Dubbo接口,并返回结果。在SpringBoot中使用@Reference注解标识的Dubbo接口,比如:@ReferenceOrderService orderService;这种接口的动态代理没有被放到Spring的上下文中,而是放在了Dubbo的处理类AnnotationBean中。这种情况下使用WebApplicationContext wac = ContextLoader.g.原创 2020-06-23 18:34:50 · 3788 阅读 · 1 评论 -
Dubbo的GenericService简介和基本使用
简介GenericService是Dubbo提供的泛化接口,用来进行泛化调用。GenericService接口只有一个方法:Object $invoke(String var1, String[] var2, Object[] var3) throws GenericException;第一个参数是方法名。第二个参数是一个字符串数组,这是接口方法每个参数类型的全路径。第三个参数是Object数组,是传给方法的具体参数列表。Dubbo服务的提供者和消费者都可以使用这个接...原创 2020-06-23 18:06:45 · 9707 阅读 · 0 评论 -
Spring中InitializingBean和SmartInitializingSingleton的区别
目录一,InitializingBean简介:二,SmartInitializingSingleton简介三,InitializingBean和SmartInitializingSingleton的区别四,从源码观察InitializingBean和SmartInitializingSingleton调用时机的区别一,InitializingBean简介:InitializingBean的代码:package org.springframework.beans.factory;原创 2020-06-12 18:06:56 · 4014 阅读 · 1 评论 -
MyBatis源码学习(五)——MyBatis配置项的加载过程
先上小结:MybatisAutoConfiguration类的@EnableConfigurationProperties({MybatisProperties.class})注解被Spring激活,准备注入MybatisProperties类。 MybatisProperties类有@ConfigurationProperties(prefix="mybatis")注解,会被ConfigurationPropertiesBindingPostProcessor调用bind()方法来处理。 获得My原创 2020-06-10 18:05:48 · 1458 阅读 · 0 评论 -
MyBatis源码学习(四)——创建Mapper动态代理
先上小结:Spring标准代理创建流程,this.initializeBean()方法。 BeanPostProcessor对Mapper代理实例进行预处理。 执行MapperFactoryBean.afterPropertiesSet(),从MapperFactoryBean.SqlSessionTemplate.SqlSessionFactory.Configuration.MapperRegistry.knownMappers获得之前创建好的工厂代理,如果没有则重新创建一个。 继续Sprin原创 2020-06-10 17:16:22 · 972 阅读 · 0 评论 -
MyBatis源码学习(三)——创建SqlSessionFactory实例和Mapper代理工厂
先上小结:开始调用MybatisAutoConfiguration.sqlSessionFactory()方法。 构建SqlSessionFactoryBean类实例。 把数据源实例DataSource赋值给SqlSessionFactoryBean。 创建Configuration实例,赋值给SqlSessionFactoryBean。 读取mybatis配置文件,把mapperLocations参数赋值给SqlSessionFactoryBean。 SqlSessionFactoryBea原创 2020-06-10 16:45:44 · 1927 阅读 · 0 评论 -
MyBatis源码学习(二)——创建Mapper代理工厂的准备工作
先上小结:@Autowired注解生效。 Spring开始为@Autowired注解的Mapper创建动态代理。使用的是BeanFatory中注册的BeanDefinition。 Spring标准的创建动态代理流程,创建Mapper接口类的BeanWrapper,准备进行属性注入。 准备给Mapper代理注入sqlSessionFactory和sqlSessionTemplate。 Spring标准的创建动态代理流程,创建SqlSessionFactory的代理。使用的是SqlSessionFa原创 2020-06-10 15:56:32 · 438 阅读 · 0 评论 -
MyBatis源码学习(一)——@MapperScan注解扫描Mapper接口文件,创建BeanDefinition
先上小结:@MapperScan注解生效。触发@Import({MapperScannerRegistrar.class})注解。 @Import({MapperScannerRegistrar.class})注解生效。调用MapperScannerRegistrar.registerBeanDefinitions()。 MapperScannerRegistrar创建扫描工具类Scanner。 Scanner从@MapperScan注解中获取Mapper接口路径。 调用Scanner.doSc原创 2020-06-10 15:04:49 · 3040 阅读 · 0 评论 -
MyBatis源码学习(零)——准备
当我们使用MyBatis时,往往会有以下操作:1,添加@MapperScan注解,或者在配置文件中使用<mybatis:scan>进行设置。这一步设置的是需要扫描的Mapper文件路径,比如这样:@Configuration@EnableTransactionManagement@MapperScan({"com.macro.mall.mapper","com.macro.mall.dao"})public class MyBatisConfig {}2,编写Mapper.原创 2020-06-10 14:42:02 · 263 阅读 · 0 评论 -
了解RedisTemplate:从RedisTemplate和StringRedisTemplate的区别开始
从RedisTemplate和StringRedisTemplate的区别开始,逐渐深入RedisTemplate源码,了解RedisTemplate的代码结构,以及RedisTemplate如何完成对redis的操作。原创 2019-12-24 17:30:40 · 2989 阅读 · 0 评论 -
Jeecg-Boot前后端项目部署流程
Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台,本文介绍的是从Jeecg-Boot官网下载的demo代码如何在Windows和Linux环境下部署。原创 2019-12-17 19:27:49 · 33666 阅读 · 15 评论 -
Java的ThreadLocal类介绍
简介java.lang.ThreadLocal类,自JDK1.2版本就加入了Java,ThreadLocal类可以给每个线程维护一个独立的变量副本,使多线程的场景使用共有的ThreadLocal变量,同时每个线程在ThreadLocal对象中保存的变量副本是相互隔离的。调用ThreadLocal的public void set(T value)方法,就可以为当前线程设置一个...原创 2019-11-08 17:32:31 · 559 阅读 · 0 评论 -
逐渐深入Java多线程(四)----Java的ReentrantLock简介
目录一,ReentrantLock简介二,ReentrantLock可重入的原理三,非公平锁的加锁四,公平锁的加锁五,解锁逻辑六,ReentrantLock的Condition七,ReentrantLock中的其他方法八,关于Unsafe一,ReentrantLock简介ReentrantLock,字面意思是可重入锁,由JDK1.5加入,位于java.uti...原创 2019-10-18 14:31:59 · 392 阅读 · 1 评论 -
关于Integer数值大于127时使用等号比较时的坑
Integer的值在-128到127时,Integer对象是在IntegerCache.cache产生,会复用已有对象,也就是说,这个区间的Integer可以直接用等号进行判断。Integer的值在-128到127之外时,Integer对象在堆上产生,不会复用已有对象,用等号会返回false。建议老老实实用equals()方法来比较Integer对象。Integer a=12;Integer原创 2017-02-21 17:21:07 · 3574 阅读 · 0 评论 -
百度语音识别极速版的使用例子(JAVA)
说明:1,百度语音极速版,需要事先保存声音文件,然后调用百度接口。2,关于文件的上传,可以用JSON格式,上传文件的base64编码,也可以用row格式直接上传文件。下面的代码是JSON格式。3,使用接口前需要向百度AI开放平台注册APPID,得到秘钥,然后用得到的APPID和秘钥来获得TOKEN。调用百度语音接口时需要TOKEN。4,百度提供了一个工具,可以从拼音角度判断相似度,s...原创 2019-07-03 16:22:05 · 2100 阅读 · 0 评论 -
Integer数值小于127时使用==比较的坑
Java在处理Integer时使用了一个缓存,其中缓存了-128到127之间的数字对应的Integer对象,所以在绝大多数情况下,当我们把2个小于128的Integer对象用==比较时,Java往往是用缓存中的对象进行的比较,得到的结果也往往是true,比如这样:public class Test { public static void main(String[] args){...原创 2019-06-14 13:02:58 · 4107 阅读 · 0 评论 -
Dubbo的Reference注解必须先启动provider的问题
目录现象看源码分析原因注解Reference第一步:用Reference注解里的参数初始化ReferenceConfig注解Reference第二步:从配置文件里获取参数,写入ReferenceConfig注解Reference第三步:生成Consumer代理解决方案如果只想知道怎么解决,请翻到文章最后一句。现象当使用Dubbo的Reference注解时,...原创 2019-05-23 14:54:46 · 17613 阅读 · 5 评论 -
Hashmap实现原理及扩容机制详解
目录HashMap基础HashMap实现原理Node和Node链拉链法关于Node数组 table散列算法HashMap和红黑树关于TreeNode红黑树基础HashMap扩容机制JDK1.7下的扩容机制JDK1.8下的扩容机制HashMap基础HashMap继承了AbstractMap类,实现了Map,Cloneable,Serializa...原创 2019-04-25 19:04:32 · 119353 阅读 · 56 评论 -
Java的Exception简介
目录一,关于Throwable,Exception,ErrorThrowable类Error类Exception类关于cause二,Throwable类中的方法和说明1,fillInStackTrace()2,getCause()3,initCause()4,getMessage()5,getLocalizedMessage()6,printStac...原创 2019-02-21 16:58:18 · 3621 阅读 · 0 评论 -
使用tld文件自定义jsp标签库
目录一,标签库描述文件(tld文件)二,标签处理类三,在JSP页面中使用自定义的标签四,举个例子通过Java的TagSupport类或者BodyTagSupport类,和配套的tld文件,可以定义自己的jsp标签。TagSupport类和BodyTagSupport类在jsp-api.jar中,这个jar包在tomcat的lib目录下有,maven里面也有。 一,标...原创 2018-12-14 14:39:19 · 4509 阅读 · 0 评论 -
BigDecimal用除法时候需要指定精度
先上结论:1,Java的BigDecimal在使用除法(divide方法)时,应该手动指定精度和舍入的方式。2,如果不指定精度和舍入方式,在除不尽的时候会报异常。 会报错的代码: public static void main(String[] args) { BigDecimal a=new...原创 2018-12-07 18:08:01 · 32170 阅读 · 0 评论 -
手动调用指定Dubbo接口(一)----Spring注入篇
初衷能不能输入任意的dubbo接口名字,输入参数,然后就可以调用这个接口呢?对于REST风格的接口,我们有Postman,Advanced REST client等一堆工具可以用,但对于dubbo接口却没有直接并且通用的调用方式。当然也可以写针对某个接口的测试调用方法,但是不同dubbo接口的调用方法不统一,新增一个接口就要新增对这个接口的测试调用方法,很麻烦。思路在dubb...原创 2018-09-13 19:48:55 · 6448 阅读 · 0 评论 -
Java反射——Type接口详解
目录Type的简介Type的获得Type的分类1,Class2,ParameterizedType3,GenericArrayType4,WildcardType5,TypeVariableType的简介java.lang.reflect.Type接口及其相关接口用于描述java中用到的所有类型,是Java的反射中很重要的组成部分。在API文档中,Typ...原创 2018-09-06 19:59:42 · 19455 阅读 · 6 评论 -
SpringBoot启动流程的源码分析
前言:文章很长,一万多字,如果不关注细节的话只看目录就可以。目录设置了缩进,代表了启动流程中方法的调用和包含关系。目录基本上概述了SpringBoot启动的基本流程。目录main方法启动初始化SpringApplication|----|设置ApplicationContextInitializer和ApplicationListener|----|----|读取配...原创 2019-07-11 16:18:10 · 5550 阅读 · 2 评论 -
log4j打印异常堆栈信息的方法
当使用log4j时,如果我们调用logger.info("123");得到的结果只有一行,即使参数中是个Exception对象,也只是输出对象本身的信息依然只有一行。想要像e.printStackTrace()一样输出堆栈信息,可以用logger的以下方法:logger.error("123",e);这种一个字符串一个Exception的方法。参数中只有字符串参数是不行...原创 2019-07-16 15:07:52 · 15259 阅读 · 0 评论 -
逐渐深入Java多线程(三)----BlockingQueue阻塞队列及其实现类简介
目录BlockingQueue简介BlockingQueue的实现类1,ArrayBlockingQueue2,DelayQueue3,LinkedBlockingDeque4,LinkedBlockingQueue5,LinkedTransferQueue6,PriorityBlockingQueue7,SynchronousQueueBlockingQu...原创 2019-10-10 15:25:57 · 767 阅读 · 0 评论 -
逐渐深入Java多线程(二)----ThreadPoolExecutor的Worker简介
目录一,从ThreadPoolExecutor说起二,Worker类的源码三,execute()方法和新建Worker四,Worker的run()方法Worker类是定义在ThreadPoolExecutor中的内部类,要了解Worker,先要知道ThreadPoolExecutor是什么。一,从ThreadPoolExecutor说起ThreadPoolExecuto...原创 2019-09-16 13:54:51 · 2853 阅读 · 3 评论 -
逐渐深入Java多线程(一)----Java线程池和Executor框架说明
目录从Executor说起ThreadPoolExecutorThreadPoolExecutor的WorkerThreadPoolExecutor新增任务时的处理流程ThreadPoolExecutor的线程池状态Executors类1,单线程处理的线程池,newSingleThreadExecutor2,控制最大并发的线程池,newFixedThreadP...原创 2019-09-09 14:46:23 · 456 阅读 · 0 评论 -
java中的方法引用
目录简介一,类::静态方法二,对象::实例方法三,类::实例方法四,构造器引用,Class::new五,数组引用,数组::new简介从JDK1.8开始,可以使用方法引用。方法引用的操作符是双冒号"::"。方法引用可以认为是Lambda表达式的一种特殊形式,Lambda表达式可以让开发者自定义抽象方法的实现代码,方法引用则可以让开发者直接引用已存在的实现方法,...原创 2019-08-16 18:03:48 · 18723 阅读 · 15 评论 -
Java的函数式接口简介
所谓函数式接口,指的是只有一个抽象方法的接口。函数式接口可以被隐式转换为Lambda表达式。函数式接口可以用@FunctionalInterface注解标识。JDK1.8之前就出现了一些符合函数式接口定义的接口:java.lang.Runnable java.util.concurrent.Callable java.security.PrivilegedAction...原创 2019-08-07 15:23:18 · 11317 阅读 · 0 评论 -
Java的Lambda表达式
对于刚接触Lambda表达式的开发者来说,这个概念是比较晦涩的,下面我来写一下我的理解。一,简介从JDK1.8开始,Java加入了Lambda表达式的设计,并加入了一个新的操作符:->,操作符前面代表方法参数列表,操作符后面是Lambda体,代表方法的实现代码。Lambda表达式说的是:当一个接口(interface)里面,除了static方法和default方法之外只有一个方法...原创 2019-08-06 11:37:36 · 372 阅读 · 0 评论 -
Spring的@ExceptionHandler注解使用方法
目录1,基本使用方法2,注解的参数3,就近原则4,注解方法的返回值5,错误的操作1,基本使用方法Spring的@ExceptionHandler可以用来统一处理方法抛出的异常,比如这样:@ExceptionHandler()public String handleExeption2(Exception ex) { System.out.println("...原创 2019-08-05 16:18:48 · 81457 阅读 · 16 评论 -
对微信退款结果通知接口的说明和req_info字段解析(JAVA)
微信支付的申请退款接口,可以设置notify_url参数,这个参数代表微信退款成功后调用商户自己的接口,当微信调用这个接口时,代表款项正式退给了付款方。根据观察,如果是微信零钱支付,调用申请退款接口后是秒退,如果是微信绑定的银行卡或信用卡支付,大概几分钟后到账。微信退款申请接口文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?cha...原创 2019-07-22 18:08:27 · 6940 阅读 · 5 评论