3 BryantLmm

尚未进行身份认证

努力写好每一行代码

等级
博文 180
排名 2w+

SpringBoot启动

前言之前已经介绍了SpringBootjar启动过程。现在我们来看SpringBoot入口类main方法的执行。@SpringBootApplicationpublicclassMyApplication{publicstaticvoidmain(String[]args){SpringApplication.run(M...

2019-01-11 16:13:33

SpringBoot Jar启动

SpringBoot项目的启动当我们在IDE中新建(或导入)了一个SpringBoot项目之后,我们如果想要启动这个SpringBoot项目,我们可以找到相应的带有@SpringBootApplication注解的启动类,该启动类是一个带有main方法的类,这个类就是SpringBoot项目的入口。所以想要运行的话,只需要在IDE对这个类点击RunAsJavaApplication既可以启...

2019-01-11 16:13:00

Spring Task

前言在一开始学习定时任务的时候是使用的quartz来实现的。后来习惯于全注解的开发模式。在SpringBoot环境中,只需要在启动类上加上EnableScheduling注解,然后在需要使用定时任务的方法上加上Scheduled注解,当然方法所属的类需要在Spring环境中。在启动类中加上EnableScheduling注解这一步是为了生成ScheduledAnnotationBeanPostP...

2018-12-25 17:03:32

线程池

为什么要使用线程池为了尽可能的去压榨CPU,我们会在程序中使用多线程技术,这样在一些情景下会显著的减少CPU的闲置时间,增加CPU的吞吐能力。假设一个服务器完成一项任务所需时间为:T1创建线程时间,T2在线程中执行任务的时间,T3销毁线程时间。如果:T1+T3远大于T2,则可以采用线程池,以提高服务器性能。线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程...

2018-12-25 16:15:27

两条实用的sql语句

在开发的过程中,我们有时候会遇到一些处理数据库数据的需求。INSERTINTO…SELECT语句有时候我们需要批量的把某张表中一些符合条件的数据插入到另一张表中。Mysql提供了一个很方便的语句。InsertintoTable2(field1,field2,...)selectvalue1,value2,...fromTable1[wherecolumn=value]...

2018-12-24 19:38:12

对sql语句也要有敬畏之心

前言在上个月,在帮同事解决bug的时候,我人生中第一次看到了对datetime类型的字段做like查询的sql语句…案发现场分析这是一条很简单的语句,查询某个月某个用户的签到记录SELECT*FROMxxxxwhereuid=#{uid}ANDsign_datelik...

2018-12-24 18:21:11

SimpleDateFormat线程安全问题

前言最近在查资料的时候,偶然看到了SimpleDateFormat不是线程安全的类的相关资料,说实话,一开始看的时候还是惊讶了一把的,从来没想过这个类居然不是线程安全的。今天就来看看这个类的线程安全问题。SimpleDateFormat线程安全分析先看一个很简单的日期处理工具类publicclassDateUtil{privatestaticfinalSimpleD...

2018-12-24 15:46:35

@ResponseBody作用在返回类型为String的方法时的坑

在默认的Spring配置中,当在返回类型为String的Controller方法时,在其上加上@ResponseBody时会出现问题,那就是返回的不再是我们期待的Json格式的字符串了,而是会变成在正常的Json串前后加上双引号。这是为什么呢?这是因为在HTTPMessageConverter中对应写json格式相应的处理类在写json的时候默认是对String类型进行这样处理的。以Gson为例...

2018-12-21 15:58:44

消息转换器

前言在使用SpringMVC的过程中,我们如果想要返回json格式的数据(Response的Content-Type:application/json;charset=UTF-8),通常使用@ResponseBody注解,引入相应的json解析包就可以了,如果想要解析前端传来的json格式的数据(requestheaderContent-Type为application/json),在Co...

2018-12-21 15:58:15

SpringMVC处理方法的具体逻辑

在讲解SpringMVC整体设计的时候,我们只分析了最顶层的核心接口,但是SpringMVC还有很多可以去探究的细节,还有很多我们可以扩展的接口,我们继续来深入学习SpringMVC。在整体设计分析中,我们知道一个Web请求进来时依靠HandlerMapping来找到正确的Controller以及Controller下对应的@RequestMapping注解修饰的方法的。而具体的方法处理的逻辑是...

2018-12-21 15:57:39

git remote prune origin

最近在开发的时候偶然发现,同事在本地使用gitbranch-a会看到我已经删除的远程分支,gitfetch之后依然能看到,然后同事就来询问我为什么不清理掉那些久远的分支,然而我确实是执行了gitpushorigin--deletebranchName删除每个版本后不用的分支。当时感觉非常奇怪,然后又发现,我在本地也能看到同事已经删除的远程分支。当时我就蒙蔽了,非常蒙蔽。后来查找资料才...

2018-12-20 17:51:29

@Async原理

前言在开发过程中,我们会遇到很多使用线程池的业务场景,例如定时任务使用的就是ScheduledThreadPoolExecutor。而有些时候使用线程池的场景就是会将一些可以进行异步操作的业务放在线程池中去完成,例如在生成订单的时候给用户发送短信,生成订单的结果不应该被发送短信的成功与否所左右,也就是说生成订单这个主操作是不依赖于发送短信这个操作,所以我们就可以把发送短信这个操作置为异步操作。而...

2018-12-20 17:37:14

@Autowired

前言最近在使用@Async注解进行异步操作的时候时,想过一下@Async注解的原理,这种需要@Enable*注解开启作用的注解,原理应该是大同小异。之前已经分析过了@Scheluded注解了,本以为这次看@Async注解会很轻松,但是还遇到了很多问题。我们知道在调用带有@Async的方法的时候,会将这个方法作为一个任务放入到线程池中执行。如果我们想要自己配置线程池的属性,只需要实现Async...

2018-12-20 17:09:00

请求从客户端到服务器的过程简单分析

当我们在客户端(以浏览器为例)使用域名发送一个HTTP请求的时候,DNS协议会尝试将域名解析为对应的IP。(我们知道每一个台服务器都可以通过ip和端口直接被访问。但是,用户对于由数字组成的ip是很难有记忆点的,所以就出现了域名,域名可以映射到ip。那么域名是如何与ip进行映射的,就需要DNS协议的帮忙)1.OS会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址...

2018-12-20 16:02:01

Java中的四种引用

前言最近又重新看了下ThreadLocal,ThreadLocal源码中ThreadLocalMap内部类的Entry中的key是ThreadLocal类型,并且是弱引用。staticclassEntryextendsWeakReference<ThreadLocal<?>>{/**Thevalueassociated...

2018-12-19 18:24:29

finalize

前言在总结Java中的4种引用的时候,在查找资料的时候,看到了有关于Object#finalize()方法的一些介绍,提到我们不应该在程序中使用finalize()方法,该方法不安全,低效,不要去使用finalize()去完成资源释放工作,而是使用虚引用完成对象回收前的资源释放工作。但是并没有给出具体的原因,那今天就结合网上的资料和自己的理解来分析这个finalize()方法。为什么不要使用f...

2018-12-19 15:58:10

ThreadLocal引发的Bug

前言最近同事在开发的时候,在调用RPC获取用户的积分的时候,发生了返回的用户以及积分信息不是我们请求的uid对应的用户信息的情况,uid变成了另一个人的uid,积分信息也变成了另一个人的,是不是很神奇。同事叫我帮忙查找原因,RPC和调用方的代码都是该同事写的,我在本地用他给的请求参数去请求那个RPC,发现确实会出现那么神奇的情况,返回的信息不是请求参数中的用户的信息。反复请求几次,依旧是这样。...

2018-12-19 10:39:44

并发与并行的区别

如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。并发系统与并行系统这两个定义之间的关键差异在于**“存在”**这个词。在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过...

2018-12-18 17:47:13

ReentrantReadWriteLock

前言之前分析了使用AQS实现的共享锁和独占锁,今天来分析一下ReentrantReadWriteLock,这个即使用了共享锁(读锁)又使用了独享锁(写锁)的类。与Mysql中的S锁(共享锁,读锁)一样,ReentrantReadWriteLock中的读锁只允许继续加读锁,而不允许加写锁。而写锁则与Mysql中X锁(排他锁)一样,不允许继续加任何锁,知道写锁被释放。今天我们就来分析下Reen...

2018-12-18 17:29:51

LimitLatch

前言之前分析的ReentrantLock和CountDownLatch都是JDK中对AQS的利用,分别实现了独占锁和共享锁。接着我们再来看一个LimitLatch,来学习下我们可以怎么将AQS应用到我们自己的程序中。LimitLatch这个类是我在看Tomcat源码的时候看到的,当时并没有太在意,也是这次复习JUC包的时候突然想起的,所以就想着来看下具体实现。Tomcat使用LimitLat...

2018-12-18 16:11:36
奖章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!