- 博客(53)
- 收藏
- 关注
原创 ThreadLocal 原理解析和netty 的FastThreadLocal
jdk的ThreadLocal解析threadLocal 主要解决线程安全问题。加锁解决是让每一个线程有序的访问,并且在访问完之后需要将对象状态数据刷新到主内存中,下一个线程在访问的时候,数据必须从主内存中load,不能使用缓存。threadLocal 解决的办法主要是为每一个线程都生成一个当前对象的副本,每个线程都更改自己的。这样也就不存在竞争问题,也没有了锁的耗时和等待。但是相应的内存的...
2020-04-03 16:00:11 206
原创 application/x-www-form-urlencoded tomcat 流获取不到数据
今天在调http接口的时候,对方的content-type 是 application/x-www-form-urlencoded ,然后我在接受的时候采用spring mvc 和tomcat,通过HttpServletRequest 获取输入流,通过输入流获取body数据,发现获取的数据为空。可是如果将 content-type 换成 application/json 就可以获取到body的参数...
2019-12-02 19:37:03 1705
原创 mybatis 和 spring 整合的查询过程
使用 mybatis 整合 spring 之后操作有三种方式第一种使用 SqlSessionTemplate,就是在 dao 的实现层注入 SqlSessionTemplate,然后使用 SqlSessionTemplate 操作数据库。第二种使用 Mapper 接口的动态代理,这也是比较常用的,就是我们自己自需要写一个 Mapper 接口,然后再 service 里面注入该接口即可,不需要...
2019-11-05 14:54:48 310
原创 mybatis 一级缓存实现
本篇文章分析 mybatis 一级缓存的实现。mybatis 一级缓存非常简单。在 BaseExecutor 中。protected BaseExecutor(Configuration configuration, Transaction transaction) { this.transaction = transaction; this.deferredLoads = n...
2019-10-30 20:09:00 250
原创 jdk 可以多层嵌套动态代理
以前一直以为jdk的动态代理不可以多层嵌套,今天做了一个实验发现是可以的。记录一下类如下public interface DemoService { void saiHi(String name);}public class DemoServiceImpl implements DemoService { @Override public void saiHi(...
2019-10-29 20:54:11 1187
原创 SpringSocial 自动配置部分源码分析
本篇主要任务是从源码角度分析 SpringSecurity、SpringSocial 的自动配置。在使用 SpringSocial 的时候,我们经常需要配置 ServiceProvider、ConnectionFactory 等,那么在内部 SpringSocial 是怎么聚合这些配置,另外 SpringSocial 是如何与 SpringSecurity 进行整合的。只有知道了整个过程我们才能更...
2019-10-20 16:22:12 251
原创 curl 通过代理发送 http POST 请求
最近测试 http 接口,在测试服务器上不能用 postman,就用 curl 比较方便。以前每次用 curl 都是临时上网查,这次查好了记录一下,方便下次.-k 可以忽略 https 的证书错误。-XPOST 指定发送 post 请求,这里的X大写-d’key1=val1&key2=val2’ 发送 post 请求的参数-x http://proxyIp:proxyPort 制定...
2019-10-17 15:08:37 2785
原创 CacheAutoConfiguration 自动配置源码分析
本文分析 spring-cache 在 spring-boot 中的自动配置过程。SpringCache 并非某一种Cache实现的技术,SpringCache 是一种缓存实现的通用技术,基于 Spring 提供的 Cache 框架,让开发者更容易将自己的缓存实现高效便捷的嵌入到自己的项目中。当然 SpringCache 也提供了本身的简单实现 NoOpCacheManager、Concurre...
2019-10-14 20:12:03 722
原创 spring boot,spring-security 自动配置源码分析
概述最近使用了spring-boot整合spring-security,比较想知道spring-boot到底在里面给我配置了什么bean,以及我自己写的 UserDetailService 是怎么生效的。特地跟踪源码分析了一遍,在这里记录一下。入口是spring-boot的自动装配 @EnableAutoConfiguration ,使用了这个注解spring-boot会加载spring.f...
2019-10-12 20:46:03 546
原创 数据库事务隔离级别使用经验
最近做项目会有多个线程同步更新数据库某一条记录中的某些字段,我在jvm层已经用同步锁控制了,可是项目是多机环境,依然会有这种情况。处理这种情况第一反应是用数据库事务中的隔离级别,至于隔离级别是什么这里就不解释了,网上资料一大堆。我的方法的逻辑是先查找某一条记录,然后在更改记录中的字段,然后在保存到数据库中。我用Oracle数据库。Oracle默认的隔离级别是读已提交,就是读取的数据肯定是别人已...
2019-08-03 16:53:12 220
原创 spring aop final 方法
最近做项目用到了spring aop,由于在项目里面用到了模板方法模式,在抽象类里面有一个final 方法。controller 调用这个final 方法的时候报空指针异常,一般我们都知道使用 aop 在controller 中注入的对象是spring 创建的代理对象,默认使用cglib。这里我们称代理对象为 proxy,称被代理的对象是target。在debuge的过程中发现,spring 注入...
2019-07-17 11:15:31 2784
原创 java多线程知识
在Java 里面实现多线程得方式一共有三种。第一种是继承 Thread 重写 run 方法。第二种实现 Runnable 接口,其实 Thread 类也是实现了 Runnable 接口得第三种实现Callable 接口,Callable 有个泛型需要设置,这个泛型得类型就是Call 接口需要返回得类型。其中 Callable 和 Runnable 的区别主要是 Callable有返回值,而...
2019-06-03 21:01:11 113
原创 源码解析 MyBatis 动态 SQL 的处理过程
推荐一下自己的gitchat课程,源码解析 MyBatis 动态 SQL 的处理过程。有兴趣的可以在 gitchat 中搜索。关于 Mybatis 动态 sql 的处理。欢迎订阅。
2019-05-22 21:13:33 114
原创 MybatisAutoConfiguration 分析
MybatisAutoConfiguration 是spring boot 下 mybatis 默认的配置类,只要开启了注释了 @EnableAutoConfiguration 就可以了,spring boot 会默认执行。在spring boot 启动的过程中 @SpringBootApplication 中组合了 EnableAutoConfiguration ,属于spring boot 自...
2019-05-22 21:08:23 6631
原创 开发经验(一)
最近开发一个小系统,遇到了一下点自己没有处理好,在这里记录下来。第一个就是在设计系统的时候先提供一个业务接口A,在提供一个查询接口B。接口B的功能是查询接口A的执行结果的。开始的设计中当其他系统在调用A接口的时候会返回我自己平台的流水,然后凭此流水来调用B接口。可是这样会有一个问题,就是我自己平台在在返回信息的时候网络出现异常了,调用方收不到我返回的信息,就没法查询了,只能再调用一次A接口。这...
2019-05-20 11:02:31 349
原创 AbstractRoutingDataSource 简介
最近在看mysql读写分离,可以用 mycat 实现,也可以用spring 多数据源来实现。这个百度一下有很多实现我这就不说了。主要是写一个类继承 AbstractRoutingDataSource 这个抽象类。这个类我大概看了一下,比较简单在这里记录一下。这个类的大体想法就是代理真正的 DataSource 。但是它代理的又不是一个 DataSource ,是好几个数据源,在内部用一个Map保存...
2019-05-16 19:48:28 1758
原创 mybatis @MapperScan 解析
MapperScan 注解会引入 MapperScannerRegistrar,MapperScannerRegistrar 实现了 ImportBeanDefinitionRegistrar,可以向 beanFactory 中 注册 BeanDefinition,具体注入的过程是通过 ClassPathMapperScanner 实现的。public void registerBeanDefi...
2019-05-01 16:38:12 4762
原创 mybatis一次查询过程的分析四
在 CachingExecutor 中的 query 方法,如果二级缓存中没有,则调用,被装饰 executor的query 方法,在这里就是 simpleexecutor,query 方法的默认实现是在 baseexecutor 中,在baseexecutor中有一个localCache 属性protected PerpetualCache localCache;这个就是一级缓存,默认开启...
2019-05-01 14:00:34 161
原创 记一次内存溢出
在一次压测的时候服务端总是 OutOfMemoryError,主要是用了另一个公司的 jar 包,里面针对每一次请求都会解析一次证书,后来换成单例反馈时间变短了,也不再 OutOfMemoryError。在这里记录一下。...
2019-04-06 20:25:47 128
原创 va.security.NoSuchProviderException: no such provider: BC 的问题解决
在工程内引入bcprov-ext-jdk16-1.46.jar包;在加密类的静态块中加入下面代码static{ try{ Security.addProvider(new BouncyCastleProvider()); }catch(Exception e){ e.printStackTrace(); } } 己住一定要在 静态块中加入...
2019-04-04 10:27:41 329
原创 mybatis一次查询过程的分析三
分析TransactionalCacheManager将当前的二级缓存和TransactionalCache进行关联。在getObject()方法中会调用而getObject() 方法会在CachingExecutor query方法中调用
2019-01-31 19:56:37 136
原创 mybatis一次查询过程的分析二
MappedStatement ms = configuration.getMappedStatement(statement);这句就是根据statement的id获取MappedStatement。这里的executor是在创建sqlsession的是否创建的,在sqlsessionfactory,看DefaultSqlSessionFactory中的openSession方法有很多的重载...
2019-01-31 19:45:47 159
原创 mybatis一次查询过程的分析 一
使用方法有两种,第一种直接使用sqlsession进行查询操作,第二种生成mapper接口的动态代理。第二种会用到第一种过程,我们直接看第二种。mapper的动态代理类是MapperProxy之前启动过程中已经分析过了,invoke方法最终会执行到mapperMethod的execute方法,一个mapper接口对应一个MapperProxy,里面的一个方法对应一个MapperMethod...
2019-01-31 19:29:46 691
原创 mybatis启动过程分析九mapper解析 sql执行语句解析
入口xmlmapperbuilderbuildStatementFromContext(context.evalNodes(“select|insert|update|delete”));String id = context.getStringAttribute("id"); String databaseId = context.getStringAttribute("data...
2019-01-31 18:39:54 313
原创 mybatis启动过程分析九mapper解析 sql节点的解析
入口方法xmlmapperbuildersqlElement(context.evalNodes("/mapper/sql"));private Map<String, XNode> sqlFragments;这个map在后面会有用,后面会介绍
2019-01-31 18:21:25 109
原创 mybatis启动过程分析九mapper解析 resultMap解析
parameterMap 已经废弃不再解释直接看resultMap的解析入口XMLMapperBuilder resultMapElements(context.evalNodes("/mapper/resultMap"));String id = resultMapNode.getStringAttribute("id", resultMapNode.getValueBas...
2019-01-31 18:17:13 195
原创 mybatis启动过程分析九mapper解析 cache解析
现在来看cache节点解析参数的意义eviction是缓存的淘汰算法,可选值有"LRU"、“FIFO”、“SOFT”、“WEAK”,缺省值是LRUflashInterval指缓存过期时间,单位为毫秒,60000即为60秒,缺省值为空,即只要容量足够,永不过期size指缓存多少个对象,默认值为1024readOnly是否只读,如果为true,则所有相同的sql语句返回的是同一个对象(有助...
2019-01-11 20:26:36 317
原创 mybatis启动过程分析九mapper解析 cache-ref 解析
接着上篇,此节主要是讲解cache-ref节点解析。其实比较简单configuration中的cacheRefMap是一个mapprotected final Map<String, String> cacheRefMap = new HashMap<String, String>();看这句cacheRefResolver.resolveCacheRef();...
2019-01-11 19:51:26 4129
原创 mybatis启动过程分析九mapper解析一
这个系列好久没有更新了,接着说该分析重中之重的mapper,入口方法是mapperElement(root.evalNode(“mappers”));直接点进去解析都大同小异,直接看解析class的方法,这种就是我们常用的mapper动态代理方式。configuration里面直接用mapperRegistry直接add方法,会先检查是否已经加载过了,可以先看看mapperproxyf...
2019-01-11 19:42:30 191
原创 mybatis启动过程分析 typehandler
本节介绍typehandler的解析,在mybatis中typehandler主要是用于类型转换的比如数据库中是varchar2而Java bean中是string 或者 integer等,需要使用typehandler,typehander的解析使用如下的方法配置typehander可以使用package包扫描的方式也可以挨个配置&lt;configuration&gt; &lt;...
2018-12-23 20:49:13 435
原创 mybatis启动过程七 DatabaseIdProvider
本节分析DatabaseIdProvider的解析主要是这个方法private void databaseIdProviderElement(XNode context) throws Exception。然后通过反射实例化之后setPoperties调用接口的getDatabaseId方法获取当前的databaseId。问题一为什么只能是vendor和db_vendor主要是resolv...
2018-12-16 20:35:11 799
原创 mybatis启动过程分析六 environment
本章分析environment,主要是这个方法private void environmentsElement(XNode context) throws Exception。environment可以有多个但是只会用一个其中的,主要是default指定例如下面这样&lt;environments default="development"&gt; &lt;environm...
2018-12-16 20:17:26 137
原创 mybatis启动过程分析五setting解析
objectFactory和objectWrapperFactory平时用的很少主要是mybatis内部反射用,几乎不会涉及暂不分析,后面有空补上。本章分析setting分析configuration.setAutoMappingBehavior(AutoMappingBehavior.valueOf(props.getProperty("autoMappingBehavior", "PART...
2018-12-16 20:07:24 184
原创 mybatis启动过程分析四插件解析
本章分析插件的解析过程private void pluginElement(XNode parent) throws Exception这个方法格式如下从上面分析可知插件必须有一个没有参数的构造函数,configuration用了一个interceptorChain来记录插件最终的数据结构是一个list...
2018-12-16 19:58:23 102
原创 mybatis启动过程分析三别名
本章分析typeAliasesElement(root.evalNode(“typeAliases”)); 别称加载。for循环子标签,判断当前子标签是否含有package标签,如果有则获取package标签的name属性拿到真正的basepackage,然后用configuration获取typeAliasRegistry注册器。点进去可以发现这个注册管理器默认注册了很多的别名最终会...
2018-12-16 19:49:53 100
原创 mybatis启动过程二 properties加载
前面大概看了一遍各个方法,下面来详细看第一个方法这个方法主要是解析properties节点信息propertiesElement(root.evalNode(“properties”));下面看第一句方法点进去看是新建一个Properties类主要是读取子节点中的name属性和value属性并且生成好properties并且返回所以必须要name属性和value属性都有,属性名成必须固定...
2018-12-08 20:45:44 261
原创 mybatis启动过程分析一 总览
mybatis的初始化过程其实就是分析config文件和mapper文件生成org.apache.ibatis.session.Configuration的过程,从SqlSessionFactoryBuilder这个类开始先构建XMLConfigBuilder,在调用parse()方法,查看XMLConfigBuilder的构造方法在这个过程中直接new了一个Configuration,在...
2018-12-08 20:33:38 190
转载 Java split 去掉了其中的空格,导致数组length不对。
1.如果字符串最后一位有值,则没有区别,2.若干最后n位都是切割符,split(" “)不会继续切分,split(” ", -1)会继续切分String line = “a b c “;String [] tmp = line.split(” “);System.out.println(tmp.length+”------”);for(int i=0;i<tmp....
2018-11-18 11:08:44 999 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人