- 博客(63)
- 收藏
- 关注
原创 为什么你学了N遍Springboot,至今还是学生项目?你的问题都在这里!
前言为什么你学了n遍《1天精通springboot》,至今还是不精通springboot,甚至还是停留在学生项目?真正要做项目就应该一步到胃,半吊子半桶水是不行的。一个实战项目需要充分考虑状态码、异常处理、日志处理、性能监控、数据安全、部署等等因素,而不是急于求成,为了达到1天精通的目标而糊弄过去。笔者在大学时也经历过学了很多springboot的教材,但是比起外包(哪怕是个小程序),总觉得比...
2020-04-25 14:57:58 26671 72
原创 一步到位springboot目录
前言为什么你学了n遍《1天精通springboot》,至今还是不精通springboot,甚至还是停留在学生项目?真正要做项目就应该一步到胃,半吊子半桶水是不行的。一个实战项目需要充分考虑状态码、异常处理、日志处理、性能监控、数据安全、部署等等因素,而不是急于求成,为了达到1天精通的目标而糊弄过去。本专题的对象是后端小白,目标是搭建一套完善的Springboot后端框架,不至于项目跑起来,分分钟...
2020-04-19 22:41:43 6961 12
原创 灵魂画手图解Spring AOP实现原理!
本篇旨在让读者对Spring AOP实现原理有一个宏观上的认识,因此会丢失一些细节,具体实现参考:老实人Spring源码目录阅读本篇文章前,希望读者对Spring Ioc以及Spring AOP的使用(@Aspect)由一定了解,话不多说,直接上图准备工作Service类:有find方法跟save方法,find方法前后需要缓存操作,save方法前后需要事务操作CacheableAspec...
2020-04-06 22:26:58 4901 6
原创 Spring源码最难问题《当Spring AOP遇上循环依赖》
4.AOP中的循环依赖在看自动代理源码的过程中,突然注意到SmartInstantiationAwareBeanPostProcessor接口中的getEarlyBeanReference方法,它是Spring处理循环依赖时返回**未创建完(只实例化未做依赖注入)**Bean的扩展。关于循环依赖可以去Bean的循环依赖一章去详细了解,这里只做简单的说明。有两个单例Bean,A和B,A中引用了B...
2020-04-03 21:35:26 14145 53
原创 Jdk动态代理 底层源码
前言java动态代理主要有2种,Jdk动态代理、Cglib动态代理,本文主要讲解Jdk动态代理的使用、运行机制、以及源码分析。当spring没有手动开启Cglib动态代理,即:<aop:aspectj-autoproxy proxy-target-class="true"/>或@EnableAspectJAutoProxy(proxyTargetClass = true),默认使用的...
2020-03-16 23:36:56 8745 12
原创 灵魂画手图解Spring循环依赖
想彻底弄清楚spring的循环依赖问题,首先得弄清楚1. 循环依赖是如何发生的,spring又是如何检测循环依赖的发生的。其次才是2. 探究spring如何解决循环依赖的问题1. 循环依赖检查<bean id="a" class="A"> <property name="b" ref="b"><bean/><bean id="b" class="...
2020-03-14 11:48:08 11581 19
原创 老实人spring源码解析目录
本篇介绍一下通过本专题将学习哪些内容以及一些前期的准备工作。#前言1.本专题主要以XmlBeanFactory展开源码阅读,主要介绍spring IoC容器的启动(Bean的解析)及Bean实例化两大阶段。 可能现在基本上不会有人再开发中再使用XmlBeanFactory,但是XmlBeanFactory较为简单,可以刨去一些增强功能,有助于抓住spring主线的理解。2.在阅读源码前,有...
2020-03-14 10:24:08 2847 3
原创 万字真言:Springboot使用RedisTemplate Cluster集群正确姿势
前言Redis就不多做介绍了,直接进入正题,通过本篇将学习到(代码地址:https://gitee.com/chaitou/leilema.git):Redis常见功能Redis高可用分布式Springboot集成RedisTemplate的正确姿势集成Spring Cache常见误区(瑞士军刀开瓶盖)初学者往往认为Redis就是缓存,这其实是个误区,仅仅拿Redis当缓存好比拿瑞士军刀开瓶盖,但是Redis能做的远不止如此,以下列举几种Redis的常见应用缓存(也是最常见的)分布
2020-05-23 15:20:32 13708 8
原创 Redis其他功能(命令操作)
慢查询Redis生命周期Redis一次请求完整的生命周期:发送请求(可以是Jedis客户端等)排队等待请求被Redis处理Redis执行命令返回结果又因为Redis是单线程应用,也就是说只要有一个请求正在执行,后面的请求就必须全部等待。这也是我们为什么需要去关心慢查询的原因。假设有一个命令keys *,该命令需要执行10s,而该命令后的所有请求都将等待keys *的执行。而这10s将会导致后续所有命令的滞后,甚至是请求超时!跟我们集成Druid或者相关监控是一样的道理,Druid为我们
2020-05-17 10:59:51 483
原创 二分查找常用模板、例题
前言二分法的思想:将一段区间(代码中往往指一个数组)一分为二,进而排除掉不符合条件的一半,选择符合条件的一半继续进行,直至寻找到正确答案(或无元素可供查找)时间复杂度:因为每次都能排除一半的区间,因此时间复杂度为log(n)适用条件:一般都要求数组有序,或间接有序(后面有例题)二分查找法的思想在 1946 年就被提出,但是第 1 个没有 Bug 的二分查找法在 1962 年才出现。《计算机程序艺术设计 · 第三卷》如上,思想虽然简单,但是往往在边界条件的处理上让人头疼。在比赛或者面试过程中,
2020-05-13 22:45:11 595
原创 Redis数据结构(命令操作)
Redis数据结构redis数据结构包括:字符串、哈西、列表、集合、有序集合基本类型字符串# key = string value = string || int || bits (limit 512MB)# get set del o(1)# 获取 设置 删除27.0.0.1:6381> set hello worldOK127.0.0.1:6381> get hello"world"127.0.0.1:6381> del hello(integer) 112
2020-05-10 10:25:06 376
原创 Redis安装与入门
前言笔者在上一个月写好为什么你学了N遍Springboot,至今还是学生项目?后,一直有粉丝催更中间件,原想写两篇redis、rabbitmq。但考虑以后还是决定给redis专门写个专题。笔者认为,redis在中间件中的地位好比spring在java中的地位。如果redis只是作为key-value缓存,那无异于瑞士军刀开瓶盖通过本专题你将系统的学习到redis的各项数据结构、特性、高可用及原理、集群及原理、redis在Java设计实战中的应用(如redis分布式锁)。废话不多说,直接先用起来,这
2020-05-10 09:37:17 368
原创 Springboot + Mybatis-plus事务管理
前言上节完善了productInfo的CRUD功能,这节我们完善Order订单功能,比起productInfo,订单的功能需要事务操作,保证多个数据库操作的原子性vo变复杂了,因此需要dto做转换事务事务就是为了保证多次数据库操作的原子性。举个简单的例子买商品第一步要扣钱,第二步要扣库存。如果没有事务,一旦第一步与第二步之间出现了异常,那么钱是扣了,库存却没变,这显然不符合业务场景...
2020-04-19 22:30:24 40137
原创 Springboot + Mybatis-plus的CRUD操作
前言Mybatis-plus、日志、监控、响应状态码、异常、校验都集成好了,也就是说,如果不考虑优化的话,现在这套框架也上是有模有样了,接下去就可以无休止的写CRUD了…开不开心…Mybatis-plus的使用一、xml自定义sql自定义动态sql算是mybatis的灵魂了,简单的通过productInfo来演示一下,通过productName进行模糊查询mapper.xml ...
2020-04-19 21:30:08 1565 1
原创 BeanUtils如何优雅的拷贝List
前言BeanUtils.copyProperties();确实为我们做了很多事情,虽然不能完美完成深拷贝,但是对于po、vo、dto的拷贝已经足够用了。但是其还是有一些不够完美的地方不足:不能拷贝list,而拷贝list的情况又大量存在,因此会有许多重复代码 for (S source : sources) { T target = new T(); ...
2020-04-19 20:08:18 23741 8
原创 springboot集成日志框架
前言相信很多为接触过实际开发项目的小伙伴一般都没打过日志,就算有可能也是随便log一下,并没有深入的学习过。甚至会打出下面这样的日志,如果还是学生还能原谅,如果已经工作了,赶紧学习一下本篇回去趁人还没发现摸摸的把日志改了吧…logger.error(e);logger.error(e.getMessage);logger.error("错误信息:" + e);框架选型JCL、SLF4...
2020-04-19 17:53:52 2977 9
原创 正规军springboot如何处理:参数校验、统一异常、统一响应
前言本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成:1. 接口地址(也就是URL地址)、2. 请求方式(一般就是get、set,当然还有put、delete)、3. 请求数据(request,有head跟body)、4. 响应数据(response)本篇将解决以下3个问题:当接收到请求时,如何优雅的校验参数返回响应数据该如何统一的进行处理接收到请求,处...
2020-04-19 13:07:44 16752 27
原创 3分钟集成地表最强连接池 - 阿里巴巴Druid!项目监控利器!
前言Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。 -- alibaba官方划下重点,"最好"的数据库连接池,还没有带之一,你说吊不吊。集成上去能提升你的数据库访问效率同时Druid还提供了强大的监控功能:数据源、Url请求、sql执行效率、Web并发等等都能监控。Druid实在是排查慢sql、优化性能、监控项目居家必备良药!集成Druid...
2020-04-19 10:03:11 2857 9
原创 Springboot集成Mybatis-plus代码生成器
前言因为getter和setter长的都一样,写这些代码我们不能忍!使用了lombok。但是上节写的controller、service、mapper、entity的框架也都是一样的,怎么就不自动生成了?双标狗!双标狗!双标狗!同学你好快啊,我这不还没讲吗…像这么呆的代码怎么忍心让开发人员浪费时间呢?毕竟时间就是头发啊!本文我们就介绍一下默认情况下的Mybatis-plus的自动代码生成器,如...
2020-04-18 23:40:20 1391 3
原创 springboot集成Mybatis-plus
前言上篇我们已经敲定ORM框架使用Mybatis-plus了,这篇我们就正式来撸。在开撸之前再强调一遍:本专题的代码都使用lombok,因此拉下代码后,要运行前请务必装上lombok插件,否则报错。不知道怎么装的再回顾下springboot02:准备最好自己学习使用docker搭建一个mysql,并通过项目中/sql目录下的语句或springboot02:准备中的sql语句准备好数据库环...
2020-04-18 22:32:41 1877 2
原创 一步到位springboot 04:ORM框架选型
前言在强调一遍,本专题的代码都使用lombok,因此拉下代码后,要运行前请务必装上lombok插件,否则报错。不知道怎么装的再回顾下springboot准备
2020-04-18 21:23:19 6641 4
原创 Springboot多环境配置文件
前言谈到springboot,我们反复提到了"约定大于配置"。简单的说,当你引入stater-web,也就是说当你需要使用web模块的时候,springboot就默认觉得你要用到tomcat、spring mvc等,同时他也默认觉得你要用的端口就是8080,因此帮你在配置文件上默认写了8080在SpringBoot中,约定大于配置可以从以下两个方面来理解:① 开发人员仅需规定应用中不符合约...
2020-04-18 11:16:09 1758 8
原创 一步到位springboot 02:累了吗项目、获取源代码、插件安装
累了吗项目介绍你怎么穿着品如的衣服?做戏就要做全套,本专题就给你做个全套!一、背景累了吗是国内极具潜力的推拿按摩平台。我们将以累了吗项目为业务背景,通过实现累了吗平台的技师项目维护、下单、和取消订单的功能,来讲解springboot Restful纯后端的框架搭建。二、slogan:累了别叫妈,累了就叫累了吗三、涉及到的技术:spring mvc:controller层接...
2020-04-18 11:15:09 1866 5
原创 一步到位springboot 01:Hello Springboot!
前言为什么你学了n遍《1天精通springboot》,至今还是不精通springboot,甚至还是停留在学生项目?真正要做项目就应该一步到位,半吊子半桶水是不行的。一个实战项目需要充分考虑状态码、异常处理、日志处理、性能监控、数据安全、部署等等因素,而不是急于求成,为了达到1天精通的目标而糊弄过去。本专题的对象是后端小白,目标是搭建一套完善的Springboot后端框架,不至于项目跑起来,就跟下...
2020-04-18 11:13:16 1979
原创 写给开发人员看的Docker干货,零基础部署nginx mysql springboot
连接到linux# ssh 用户名@ip地址chaitous-Mac-mini:~ chaitou$ ssh ubuntu@148.70.139.121ubuntu@148.70.139.121's password: Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-157-generic x86_64) * Documentation: ...
2020-04-12 22:09:38 4808 4
原创 Spring AOP 自动代理源码 DefaultAdvisorAutoProxyCreator
前言前面已经学习了ProxyFactory的源码,学习了如何手动硬编码使用最基础的Spring AOP,以及实现方式。这一节要学习自动代理DefaultAdvisorAutoProxyCreator源码。比起Spring AOP注解形式实现自动代理,我们之前学习的ProxyFactory还差以下2步:代理时机:在Spring Ioc创建Bean的过程中,寻找合适的时机进行调用Spring A...
2020-04-03 21:32:24 4841 1
原创 Spring AOP MethodInvocation拦截器调用原理
前言通过对JdkDynamicAopProxy的invoke方法的探究,发现invoke的核心是:由匹配当前方法的advisor,例如与当前方法所匹配的所有before、afterReturning等增强,再将这些增强组成拦截器链// 生产拦截器链MethodInvocation invocation = new ReflectiveMethodInvocation(pro...
2020-04-03 21:31:35 11336 3
原创 Spring AOP核心源码 ProxyFactory
前言本篇将重点剖析ProxyFactory类的源码,很多人不理解为什么要将大部分精力花在讲解ProxyFactory上,毕竟没有人会使用这么底层的Spring AOP实现方式?ProxyFactory实现代理需要手动设置Traget(目标对象)、Interface(代理接口)、Advice(增强),然后调用getProxy生成代理对象。而使用注解形式的Spring AOP并没有想象中的复杂,不...
2020-04-03 21:30:25 4622 2
原创 Spring AOP核心源码 JdkDynamicAopProxy
前言如下图,结合第二篇Spring AOP核心源码 ProxyFactory,Spring AOP动态代理有2中生成方式,当代理对象实现了接口且没有配置强制使用cglib代理时,将使用JdkDynamicAopProxy生成代理。反之使用CglibAopProxy生成代理。同时我们在第一篇Jdk动态代理底层源码中已知,Jdk动态代理通过getProxy生成代理,同时$proxy代理对象在调用方法...
2020-04-03 21:29:29 5223 5
原创 Jdk8都7岁了,你还在用for循环遍历list吗?3分钟学习一下Stream吧
简介Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。熟悉Linux的同学对这种风格一定不陌生,因为它跟Lin...
2020-03-26 20:46:28 3685 7
原创 3分钟读阿里Java手册: 序列化
前言下面这句代码,相信大家可能跟我一样都非常熟悉,但是真正了解的人又有多少呢?private static final long serialVersionUID = 1L;很多人一味的追求新架构新框架,而这些Java入门就该学会的东西却都还没学会。这边讲一个真实案例,来说明序列化的重要性:相信现在的项目或多或少都会使用redis进行性能提升,我们公司也不例外,公司项目普遍都是早期建设的...
2020-03-26 08:07:37 989
原创 Spring报错:BeanNotOfRequiredTypeException but was actually of type "com.sun.proxy.$Proxy" 开启cglib代理
报错项目集成redis,在加上@Cacheable报错,加redis做缓存后项目报错Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'UserService' is expected to be of type 'com.cmx.demo.UserService' b...
2020-03-25 10:58:50 1448
原创 学完《1天精通springboot》,“精通spring” 真敢写在简历上?
前言近两年网课上到处是《一天精通springboot》《2小时精通springboot》等等课程,相信很多新手入门Java后端也都是从springboot开始的。2小时用搭建spring + mvc + mybatis后端常常让人有一种架构师的感觉,那么学完springboot到底还有必要学spring? 答案很负责任告诉你肯定是:有必要!简单、开箱即用等特性让springboot大受欢迎,但...
2020-03-18 17:54:42 4507 5
原创 spring BeanPostProcessor 生命周期
BeanPostProcessor:后置处理器spring使用模板模式,在bean的创建过程中安插了许多锚点,用户寻找对应的锚点,通过重写方法介入到bean的创建过程当中。本节通过重写这些锚点,学习如何使用BeanPostProcessor、获取各类BeanAware并且理清bean的生命周期代码控制台// 控制台的输出结果1. postProcessBeforeInstantiatio...
2020-03-16 23:42:06 5586
原创 IDEA 代码误删回退 文件修改历史记录
IDEA 内置了本地代码修改历史的功能,个人理解更像是实时提交的本地SVN。今天给旧系统做性能优化时,由于未测试因此没进行commit,最后redis key规则改变,脑袋一抽后续所有的全局搜索都被按成了全局替换,代码瞬间全乱了,又没有进行commit,写的代码又舍不得回退。所以使用到了本地文件记录进行回退,真真是救世主功能查看文件修改记录IDEA 在用户修改代码时会进行自动保存,并且记录,因...
2020-03-16 23:41:00 3826
原创 Postman 模拟登录 上传文件
#前言本篇文章将介绍postman的基础用法,基本能涵盖80%的后端请求用法。包括如何模拟登录,使用postman发送get、post请求,postman上传文件,postman下载文件#新建分组新建一个分组,用来保存一个项目的请求,方便下次调试使用。#Get请求Get请求比较简单,基本上只需填写地址栏以及Parmts参数,这里不做过多介绍,我们将重点放在post请求#Post请求...
2020-03-16 23:40:19 929
原创 Mybatis-plus自定义模板生成
下方代码引用自mybatis-plus的代码生成模块,点击运行即可生成代码。本篇第一部分将介绍代码生成的使用,第二部分介绍如何自定义自己的模板。一、代码模板使用生成后的效果如下:1.引入maven,共提供3类模板,本次只以freemarker 为例 <!-- freemarker 模板引擎 --> <dependency> ...
2020-03-16 12:03:06 9106 3
原创 java log日志常见误区
原因分析很多程序员会无意间可能会这样打日志logger.error(e);logger.error(e.getMessage);logger.error("错误信息:" + e);看下logger.error代码就知道error有2个重载方法public void error(String msg);public void error(String msg, Throwable t...
2020-03-15 11:32:21 1982
原创 spring源码17: 初始化
在此篇文章开始之前,如果读者对BeanAware、BeanPostProcessors还不够熟悉熟悉,强烈建议先阅读一下这篇文章:spring BeanPostProcessor 生命周期protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object...
2020-03-14 13:45:27 1028
原创 spring源码16: @Autowired实现原理
在阅读本篇之前,如果对后置处理器还不够熟悉的先参考下spring BeanPostProcessor 生命周期@Autowired使用构造函数注入public Class Outer { private Inner inner; @Autowired public Outer(Inner inner) { this.inner = inner; }}属性注入pub...
2020-03-14 13:42:11 3620
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人