<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[风上人的专栏]]></title><description><![CDATA[宠辱不惊，坐看庭前花开花落；去留无意，漫随天上云卷云舒。]]></description><link>https://blog.youkuaiyun.com/treeclimber</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; treeclimber]]></copyright><item><title><![CDATA[百度OCR java-SDK做图文识别]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/126309652</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/126309652</guid><author>treeclimber</author><pubDate>Fri, 12 Aug 2022 18:43:09 +0800</pubDate><description><![CDATA[OCR图文识别技术现广泛应用于银行卡身份证等信息读取、办公文档识别（替代扫描）、车辆号码识别、印章、二维码识别等场景，成为人们生活的方便助手。]]></description><category></category></item><item><title><![CDATA[CountDownLatch与CyclicBarrier]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/125514985</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/125514985</guid><author>treeclimber</author><pubDate>Wed, 29 Jun 2022 10:05:52 +0800</pubDate><description><![CDATA[CountDownLatch和CyclicBarrier都是用于多线程同步的工具]]></description><category></category></item><item><title><![CDATA[使用lombox踩到的坑]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/125334832</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/125334832</guid><author>treeclimber</author><pubDate>Fri, 17 Jun 2022 15:54:53 +0800</pubDate><description><![CDATA[现在很多人喜欢使用lombox，这个梗从使用IDEA，开始是为了不用写get/set方法（@Data），后来还衍生了构造函数（@Build）。正因此，踩到两个坑！1、使用builder后，Model的默认属性值没有了；查看生成的class就能找到原因。预防的办法是在属性上面添加@Builder.Default。2、使用builder后，Mybatis 查询语句SELECT部分必须使用全字段或*，否则容易产生IndexOutOfBoundsException。这个必须查看Mybatis源代码才能发现，预防的办]]></description><category></category></item><item><title><![CDATA[websocket心跳机制]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/124845918</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/124845918</guid><author>treeclimber</author><pubDate>Wed, 18 May 2022 16:47:18 +0800</pubDate><description><![CDATA[作为一种双工通讯的协议，websocket在服务端与客户端保持一个长链接，但当我们使用nginx等反向代理中间件时，每隔60秒左右会检查长链接的活动状态，当在一个60秒的周期内没有通讯（发送数据）是，链接会被断开。所以使用websocket必须实现一种定期检测机制，在tomcat-websocket和spring-websocket中，都提供了Ping-Pong消息。

工作过程是：1、服务端发送PingMessage，2、浏览器接受后自动回复一条PongMessage；3、服务端在OnMessage方法中]]></description><category></category></item><item><title><![CDATA[Spring切片拦截-Aspect]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/124716312</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/124716312</guid><author>treeclimber</author><pubDate>Wed, 11 May 2022 19:02:52 +0800</pubDate><description><![CDATA[1、maven依赖：

&lt;dependency&gt;
  &lt;groupId&gt;org.aspectj&lt;/groupId&gt;
  &lt;artifactId&gt;aspectjrt&lt;/artifactId&gt;
  &lt;version&gt;1.8.1&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.aspectj&lt;/groupId&gt;
...]]></description><category></category></item><item><title><![CDATA[ArrayBlockingQueue与LinkedBlockingQueue对比及性能分析]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/123895580</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/123895580</guid><author>treeclimber</author><pubDate>Fri, 01 Apr 2022 13:42:53 +0800</pubDate><description><![CDATA[没了解之前，认为Array上需要移动元素所以性能更差，但实际并非如此。

相同点：

LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的队列(内部都是使用ReentrantLock和Condition来保证生产和消费的同步；当队列为空，消费者线程被阻塞；当队列装满，生产者线程被阻塞.)

不同点：

1、队列中的同步锁机制不同

ArrayBlockingQueue中的锁是没有分离的，即生产和消费用的是同一个锁; 使用一个ReentrantLock来保证线程安全：入列和]]></description><category></category></item><item><title><![CDATA[Spring产品概要]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/117362196</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/117362196</guid><author>treeclimber</author><pubDate>Wed, 25 Aug 2021 15:47:22 +0800</pubDate><description><![CDATA[=================================
spring-task
=================================
@EnableScheduling =&gt; ScheduledAnnotationBeanPostProcessor
  registrar = new ScheduledTaskRegistrar();
  postProcessAfterInitialization(bean,beanName)
   MethodIntros...]]></description><category></category></item><item><title><![CDATA[常用linux运维指令]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/117362393</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/117362393</guid><author>treeclimber</author><pubDate>Wed, 25 Aug 2021 15:44:47 +0800</pubDate><description><![CDATA[安装系统功能
=========================================
  yum install lrzsz -y     #sz、rz
  yum list telnet*       #查看telnet相关的安装包
  yum install telnet-server   #安装telnet服务
  yum install telnet.*     #安装telnet客户端
  yum install net-too...]]></description><category></category></item><item><title><![CDATA[JWT鉴权方案(RFC 7519)]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/119884363</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/119884363</guid><author>treeclimber</author><pubDate>Wed, 25 Aug 2021 13:47:56 +0800</pubDate><description><![CDATA[JWT全称是JSON Web Tokens，是在分布式应用环境间传递身份信息而执行的一种基于JSON的开放标准--(RFC 7519)。它与普通的token方案需要在服务端存储（redis）不同，用户的信息本身就存储在jwt里面。

   jwt分为三部分：header、payload和signature，三者之间通过"."分隔。Header申明了JWT使用的签名算法，如：'{"alg":"HS256","typ":"JWT","zip":"flat"}'；payload则可以包括如：...]]></description><category></category></item><item><title><![CDATA[文件 .gitignore内容]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/110621731</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/110621731</guid><author>treeclimber</author><pubDate>Fri, 04 Dec 2020 08:43:44 +0800</pubDate><description><![CDATA[# maven ignore
target/
*.jar
*.war
*.zip
*.tar
*.tar.gz

# eclipse ignore
.settings/
.project
.classpath

# idea ignore
.idea/
*.ipr
*.iml
*.iws

# temp ignore
*.log
*.cache
*.diff
*.patch
*.tmp
*.java~
*.properties~
*.xml~
.springBeans
.factorypath

# sys]]></description><category></category></item><item><title><![CDATA[DruidDataSource拷贝一个易错点]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/108789481</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/108789481</guid><author>treeclimber</author><pubDate>Fri, 25 Sep 2020 09:27:18 +0800</pubDate><description><![CDATA[DruidDataSource dataSource = this.dataSource.cloneDruidDataSource();
  dataSource.setConnectionProperties(null); //
   dataSource.setUrl(this.jdbcUrl);
   dataSource.setUsername(this.username);
   dataSource.setPassword(this....]]></description><category></category></item><item><title><![CDATA[Mybatis使用细节]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/107771104</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/107771104</guid><author>treeclimber</author><pubDate>Mon, 03 Aug 2020 19:04:46 +0800</pubDate><description><![CDATA[1、@Select 定制SQL语句，不光where参数，连表名都可以传进来

@Select("SELECT sum(num) as total, avg(num) as average FROM ${tableName} WHERE statis_date between #{beginDate} and #{endDate}")
 SumAverage averageDayNum(TableParams params);

2、对于java基础类型或Map，parameterType可以简写。

...]]></description><category></category></item><item><title><![CDATA[mybatis插件实践]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/106498427</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/106498427</guid><author>treeclimber</author><pubDate>Tue, 02 Jun 2020 16:21:40 +0800</pubDate><description><![CDATA[Mybatis是当今最普遍使用的数据持久化框架，这点拒绝反驳。

Mybatis调用链：

SqlSessionInterceptor.invoke()
  DefaultSqlSessionFactory.openSession(executorType): DefaultSqlSession
 -&gt;Configuration.newExecutor(): sqlSession  //interceptorChain.pluginAll(excutor);
  DefaultSql...]]></description><category></category></item><item><title><![CDATA[maven打包添加本地 jar文件到 war中]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/105641001</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/105641001</guid><author>treeclimber</author><pubDate>Mon, 20 Apr 2020 18:07:55 +0800</pubDate><description><![CDATA[第一种：

&lt;plugin&gt;
       &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
       &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;
       &lt;configuration&gt;...]]></description><category></category></item><item><title><![CDATA[eclipse下解决git冲突]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/105640754</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/105640754</guid><author>treeclimber</author><pubDate>Mon, 20 Apr 2020 17:58:02 +0800</pubDate><description><![CDATA[1、右键”team”，选择“merge tool”，打开的视图中可以查看到冲突内容；

    选择“Use HEAD”

2、修改之后，右键”team”，选择“Add to Index”

3、直接commit，push
...]]></description><category></category></item><item><title><![CDATA[自定义spring能解析的标签]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/88545009</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/88545009</guid><author>treeclimber</author><pubDate>Thu, 14 Mar 2019 08:21:23 +0800</pubDate><description><![CDATA[众所周知，@Component、@Configuration、@Service、@Controller、@Repository是Spring标识一个组件的validation，只要某个类在确定的包名下，spring就能实现自动的IoC。

可通过以下几种方法，实现可被spring理解的Annotation：

1、使用@Configuration修饰，则会认为也是一个@Configuration；...]]></description><category></category></item><item><title><![CDATA[使用requirejs实现include功能]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/82346954</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/82346954</guid><author>treeclimber</author><pubDate>Mon, 03 Sep 2018 12:29:10 +0800</pubDate><description><![CDATA[使用过boostrap系列的人，都有一个不爽的地方：每个bootstrap的组件都包含一系列css样式，如果我们一个页面使用2个以上组件，则需要同时引入4行以上代码，比如：



为了节省代码和修改的方便，则我们首先会想到像&amp;lt;jsp:include /&amp;gt;那样，将这些语句写到一个 resource.html文件中，其他页面直接“include”即可。不幸的是，目前为止除了 chrome等...]]></description><category></category></item><item><title><![CDATA[dubbo异步调用三种方式]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/78889278</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/78889278</guid><author>treeclimber</author><pubDate>Mon, 25 Dec 2017 09:31:57 +0800</pubDate><description><![CDATA[异步通讯对于服务端响应时间较长的方法是必须的，能够有效地利用客户端的资源，在dubbo中，消费端通过 async="true"标识。

  

具体有三种方式：
1、NIO future主动获取结果，返回结果放在RpcContext中
  需要注意的是，由于RpcContext是单例模式，所以每次调用完后，需要保存一个Future实例；如：
   fooService]]></description><category></category></item><item><title><![CDATA[SpringBoot AutoConfiguration]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/78464050</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/78464050</guid><author>treeclimber</author><pubDate>Tue, 07 Nov 2017 09:33:05 +0800</pubDate><description><![CDATA[学习SpringBoot之前弄清一个概念：SpringBoot只是一个配置框架，而不是Spring Framework的重写。那么，它最重要的一个特性就是AutoConfig，这一点与Spring Framework的stereotype一样。之所以能做到自动注入，主要的就是SpringFactoriesLoader类负责载入：classpath:META-INF/spring.factories]]></description><category></category></item><item><title><![CDATA[bootstrap使用手册]]></title><link>https://blog.youkuaiyun.com/treeclimber/article/details/77528808</link><guid>https://blog.youkuaiyun.com/treeclimber/article/details/77528808</guid><author>treeclimber</author><pubDate>Thu, 24 Aug 2017 13:17:15 +0800</pubDate><description><![CDATA[本博会不断第更新。。。。
1、bootstrap其实是bootstrap+jquery，现在jquery成为了javascript的标准库，很少有组件不依赖于它。
2、一些特殊符号很有用，可以当做页面的功能小图标。比如：删除（叉号）、增加（加号）、确定（对勾）等。直接添加标签就可以。
3、无论bootstrap或bootstrap-table，直接使用jquery元素就能实现bootstra]]></description><category></category></item></channel></rss>