- 博客(72)
- 收藏
- 关注
原创 【生产力】Charles乱码
Charles默认仅支持Http,在抓取Https时会乱码。两个步骤解决乱码问题。安装证书:默认安装后可能时不被信任的证书,需要手动信任一下。配置代理:这里配置需要抓取的站点的host和port。...
2021-08-24 15:56:22 126
原创 【生产力】生成签名(字典序)
通常生成签名的时候都会排序,看源码时偶尔发现了比较优雅的写法。public static String generateSign(final String signKey, final Map<String, String> params) { List<String> storedKeys = Arrays.stream(params.keySet() .toArray(new String[]{}))
2021-07-20 18:24:17 153
原创 【Spring】@Value在静态属性上为什么不生效
我们都知道@Value是不能用在静态属性上的,那么究竟Spring是怎么处理的呢?对此有什么解决方案?构建自动装配的元数据如下图,Spring会为加了一下注解的属性进行自动装配。@Autowired@Value通过这里的代码可以看到,Spring是不会对静态属性进行自动装配的。但是Spring没有告诉我们,它为什么要跳过静态属性的自动装配,同样,静态方法也不做自动装配。如果我们必须要对静态属性赋值的时候,可以通过将@Value加到Method上来实现,只要这个方式不是静态的Spri.
2021-07-20 15:15:07 738
原创 【MQ】Mac安装Rocket MQ
占用内存过大RokcetMQ默认的JVM参数堆内存直接要8个G,本地跑应该用不到那么大,先改小一点,另外可以看到Rocket MQ默认用的是G1垃圾收集器,每个Region给分配了16M大小,G1支持的最大Region大小是32M。生产消息失败Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE: 1 DESC: create mapped file failed, server is busy or .
2021-05-18 10:40:23 1689 1
原创 【Netty学习与理解】BIO&NIO
先来熟悉一下阻塞与非阻塞的概念,二者关注的是等待程序调用结果时的状态。阻塞,指程序返回调用结果之前,当前线程会被挂起。非阻塞,程序返回调用结果之前,线程不会被挂起,可以用过轮询或者回调的方法获取返回结果。BIO&NIOBIO实现事件处理缺点NIO实现(不使用Reactor模型)事件处理缺点实现(使用Reactor模型)事件处理BIO实现ServerSocket serverSocket = new ServerSocket(9000);事件处理Socket accept = s
2021-05-07 10:38:48 50
原创 【JVM】内存管理
内存管理内存管理内存模型内存分配指针碰撞空闲列表解决内存分配并发问题垃圾回收分代收集理论垃圾收集算法垃圾收集器内存管理内存模型堆和元空间为线程共享的内存区域。堆是用来存放对象的,包括new出来的对象和通过反射生成的对象,但对象并不是一定会放在堆上,要考虑逃逸分析和标量替换导致的栈上分配,这是JVM对内存管理的优化手段;元空间用来放常量池、类信息和类的静态变量,在jdk1.8之前叫永久代。虚拟机栈、本地方法栈及程序计数器为线程独享的内存区域。虚拟机栈可以理解为线程栈,用于存放每个线程的局部变量表、
2021-03-25 11:21:27 55
原创 【生产力】curl的简单使用
get请求传参数时,将参数拼接到原URL的后边,?和&需要使用\进行转义。curl http://127.0.0.1/xx/xx/xx/xx?page_num=1&page_size=10 -X GET -H “appKey:xxxx” -H “timestamp:1616397919607” -H “sign:97015439C2E4D157B93C331C81A62D0F2CBEB4E72C9561DC1099ABD80D4B4528” -H “signVer:1.0”post请求时
2021-03-22 15:42:31 106
原创 【Spring】AOP
关于AOP什么是AOPSpring的AOP基于接口实现AOPAspectJSpring-AOP底层原理解析切面责任链调用调用连接点joinpoint什么是AOPSpring官网上说AOP是对OOP的补充,在OOP中模块化的关键部分是类,而AOP中模块化的关键部分是切面。Aspect-oriented Programming (AOP) complements Object-oriented Programming (OOP) by providing another way of thinking
2021-02-25 09:42:42 70
原创 【Spring】Spring是如何完成扫描的
// 在创建Spring容器的时候,AnnotationConfigApplicationContext的构造方法中// 分别创建了AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScannerpublic AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new Clas
2020-11-24 10:46:44 466
原创 【并发编程】ReentrantLock
ReentrantLock是什么 ReentrantLock继承自AbstractQueuedSynchronizer,即AQS, AQS可以理解为一个线程排队获取CPU的队列。队列中放的是一个个的Node。 * +------+ prev +-----+ +-----+ * head | | <---- | | <---- | | tail * +------+
2020-10-27 17:44:14 128 1
原创 【redis】主从复制与哨兵模式
主从复制sed "s/7000/7001/g" ./7000/redis.conf > ./7001/redis.confsed "s/7000/7002/g" ./7000/redis.conf > ./7002/redis.confps -ef|grep redis 501 5948 1 0 9:59上午 ?? 0:00.55 /Users/liuxxx/Tools/redis-5.0.4/src/redis-server 127.0.0.1:7000 5
2020-10-27 14:12:20 58
原创 【并发编程】线程是如何被创建的?
从Java的角度来讲,创建一个线程很简单,Thread t = new Thread(),但是Java中的一个线程同时也会对应一个操作系统级别的线程,这个过程是如何实现的呢?首先,创建一个Java层面的线程,new Thread并调用start()方法。调用native的start0()方法,调用JVM的JVM_StartThread进行线程创建和启动。new JavaThread(&thread_entry, sz)创建操作系统级别的线程,根据不同操作系统执行对应的os::create_t
2020-10-23 10:00:40 191
原创 【并发编程】Synchronized
Synchronized是什么?synchronized是用来实现同步代码块的关键字,通过C++代码实现,在JDK1.6以前synchronized通过mutex互斥量实现,涉及用户态和内核态的切换,效率低下,直接就是重量级锁。而JUC包下的Lock通过AQS实现对共享资源的同步控制,效率相对synchronized要高,因此1.6以后对synchronized进行了优化,避免直接使用系统函数加锁。偏向锁、轻量锁、重量锁偏向锁:同一个线程多次访问共享资源,在加锁之前检查对象头中的线程ID,如果是当前
2020-10-22 16:40:41 85
原创 【数据结构】图解JDK8的HashMap--红黑树的插入
右旋1如下图所示,右旋要满足以下特征,x为新插入的节点,新节点位于父节点的左侧。基于JDK8HashMap中rotateRight(TreeNode<K,V> root, TreeNode<K,V> p)方法分析。左旋1如下图所示,左旋要满足以下特征,x为新插入的节点,新节点位于父节点的右侧。基于JDK8HashMap中rotateLeft(TreeNode<K,V> root, TreeNode<K,V> p)方法分析。右旋2如下图.
2020-09-21 11:21:41 325
原创 【数据结构】红黑树的定义
《算法导论》中对于红黑树的定义如下:每个结点或是红的,或是黑的根节点是黑的每个叶结点是黑的如果一个结点是红的,则它的两个儿子都是黑的对每个结点,从该结点到其子孙节点的所有路径上包含相同数目的黑结点当红黑树不平衡时可以通过左旋、右旋、变色来达到平衡。·变色·右旋+变色·左旋+变色...
2020-09-16 13:58:15 1805
原创 【Spring】Spring何时执行AOP
跟踪Spring启动过程,发现Spring是在创建Bean的过程中调用到getEarlyBeanReference方法时候开始对目标对象进行代理。下图方法调用栈是存在循环依赖的调用,不存在循环依赖的调用栈看上去会稍简单一些。...
2020-09-02 13:46:15 1083
原创 【Spring】推断构造方法
Spring在创建Bean的时候是如何推断出合适的构造方法的。/*** 推断候选构造器* @param beanClass* @param beanName* @return* @throws BeanCreationException*/@Override@Nullablepublic Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, final String beanName
2020-09-01 19:49:32 456
原创 【Spring】getBeanPostProcessors()
研究Spring源码过程中,突然有一天对Spring调用了多少次getBeanPostProcessors()产生了兴趣,就是说Spring的启动过程BeanPostProcessors都做了哪些事情。DisposableBeanAdapter/** * 根据给定的bd销毁Bean实例,通常是prototype类型的 * Destroy the given bean instance (usually a prototype instance * obtained from this fac
2020-08-31 17:56:58 393
原创 【Spring】自动装配
本文分析基于Spring 5.2.x源码自动装配模式https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-autowireSpring官网列出了四种自动装配模式,分别是nobyNamebyTypeconstructor在使用xml对Spring配置时,可以通过标签的default-autowire对所有在xml中配置的Bean设置自动
2020-08-11 11:58:17 78
原创 【Spring】compileJava
今天学习过程中写代码用了lambda表达式,但是出现了错误: -source 1.6 中不支持 lambda 表达式,原因是我直接在编译好的Spring4.3.x的源码环境写的,而Spring源码的build.gradle中对allprojects有如下配置:compileJava { sourceCompatibility = 1.6 targetCompatibility = 1.6 options.encoding = 'UTF-8' }将这里的1.6改成1.8就可以了。...
2020-07-07 10:01:19 342
原创 【Spring】BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor 向容器添加自定义bean在之前的一篇文章中写到通过BeanFactoryPostProcessor向Spring容器中添加自定义bean,最近在学习Spring源码过程中发现一个更强大更严谨的方式–BeanDefinitionRegistryPostProcessor,这是一个继承了BeanFactoryPostProcessor的接口,该接口增加了如下方法/** * Modify the application context's internal
2020-06-15 10:21:36 192
原创 【Spring】ProxyFactory
Spring的ProxyFactory是一个非常优秀的工厂模式的例子。/** * Create a new proxy according to the settings in this factory. * <p>Can be called repeatedly. Effect will vary if we've added * or removed interfaces. Can add and remove interceptors. * <p>Uses t
2020-06-11 10:53:19 239
原创 【动态代理】InvocationHandler
InvocationHandler位于JDK反射包下,其作用是在实现JDK动态代理的时候提供了动态执行增强逻辑的方法。InvocationHandler的用法如下:public class JdkInvocationHandler implements InvocationHandler { TargetInterface target; /** * InvocationHandler的实现类需要提供一个构造器,用来接收目标对象 * 否则接口中的method是无法执行的,因为没有对象就没有办
2020-06-10 11:18:53 8237
原创 【动态代理】手写自己的动态代理
Spring中常用到JDK动态代理和CGLIB动态代理,让他们帮我们生成对目标对象增强后的代理对象,避免了在这个工程中手动新建代理类文件导致类爆炸,手写动态代理也是以此为目标。/** * 目标对象 * @author l */public interface TargetInterface { /** * 目标对象方法 * @param str1 参数 * @param str2 参数 */ void query(String str1, String str2);}/*
2020-06-07 22:55:08 267
原创 【动态代理】JDK动态代理为什么要基于接口
我们都知道CGLIB动态代理是基于继承的,而JDK动态代理是基于接口的,为什么不能也基于继承呢?现在通过代码来看看原因,至于面试的时候可能会被问到为什么不通过聚合或者组合来实现,原因很明显就是为了降低耦合性。// 定义目标对象的接口public interface UserDao { /** * */ void query();}// 目标对象@Repository("userDao")public class UserDaoImpl implements UserDao { @
2020-06-02 12:07:56 733 2
原创 【Mybatis】Mybatis的一级缓存
Mybatis的一级缓存在Spring中为什么会失效上图是在做一个select查询时的方法调用栈,发现mybatis在和spring的整合包mybatis-spring中做了关闭SqlSession的操作,原因应该是mybatis交给Spring管理之后没有办法控制SqlSession的关闭,让程序员去关闭的话又增加了程序对mybatis的耦合性,mybatis的一级缓存就是基于SqlSession的,因此一级缓存在Spring中就失效了。...
2020-05-20 15:25:48 151
原创 【Spring】Spring5新特性之日志
Spring5新特性Spring4和Spring5对比Spring5.x的日志注:Spring4.x为Spring4.3.x,Spring5.x为Spring5.2.xSpring4和Spring5对比Spring4的全部项目:Spring5的全部项目:对比Spring4.x版本和Spring5.x版本可以发现后者多了一个spring-jcl项目,这是Spring自己重写了apache的JCL。Spring5.x的日志import org.apache.commons.logging.Lo
2020-05-19 13:49:48 293
原创 【Spring】@Configuration
@Configuration在Spring中的作用示例源码分析示例@Configuration注解在Spring开发中作用于配置类上,结合@Bean注解来创建一些单例的bean注册到Spring容器中,@Configuration的作用其实可以理解为用来保证bean是单例的,先写段代码看下用于不用这个注解有没有区别:CustomerService和UserService简单的写个构造函数输出一下配置类中customerService()调用了userService方法,在没有加@Configura
2020-05-17 00:48:09 190
原创 【Spring】BeanPostProcessor和BeanFactoryPostProcessor
BeanPostProcessor和BeanFactoryPostProcessor都是Spring提供给开发者的扩展点,具体怎么用直接看下代码一目了然,两者的区别也在功能上有所体现。@Nullabledefault Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean;}@Nullabledefault Object postProcess
2020-05-09 11:14:17 179
原创 【Spring】Bean和BeanDefinition
先来看看java的Class,这个是大家最熟悉的,站在面向对象的角度,万物皆对象,而Class就是用来描述对象的对象。/* * Private constructor. Only the Java Virtual Machine creates Class objects. * This constructor is not used and prevents the def...
2020-05-07 11:02:51 168
原创 【Maven】Warning:java: 未知的枚举常量 javax.annotation.meta.When.MAYBE 原因: 找不到javax.annotation.meta.When的类文
又是一不小心,遇到了Warning:java: 未知的枚举常量 javax.annotation.meta.When.MAYBE原因: 找不到javax.annotation.meta.When的类文件这个问题,百思不得其解,后来大胆猜了一下,是不是少什么jar包,当时是在使用caffeine,pom文件中引了caffeine的包,但是没有引guava的包,加上guava的引用就不再出现这个提示...
2020-04-24 09:29:33 6262
原创 【redis】WRONGTYPE Operation against a key holding the wrong kind of value
错误的value类型在使用Jedis客户端操作redis缓存时,一不小心遇到了WRONGTYPE Operation against a key holding the wrong kind of value,后来发现出现这个错误时所操作的key是已经存在的,并且值的类型是String,而再次操作这个key却忘里边放List,两次的value类型不一致所以导致了这个问题。...
2020-04-24 09:23:31 140
原创 【Redis】Mac搭建Redis集群
首先,可以新建cluster文件夹,再以端口号为文件夹名称新建6个文件夹,方便管理。之所以要建6个,原因如下图:将已安装的Redis中的redis-server和redis.conf这两个文件分别放到以端口号命名的文件夹中,对redis.conf进行如下修改,凡是带端口号的位置,端口号要改成与文件夹名称一致。port 6379cluster-enabled yescluster-...
2020-04-20 14:24:13 110
原创 【Spring】BeanFactoryPostProcessor 向容器添加自定义bean
public interface BeanFactoryPostProcessor { /** * Modify the application context's internal bean factory after its standard * initialization. All bean definitions will have been loaded, but no b...
2020-04-17 17:24:55 879
原创 【Redis】序列化
spring-boot-start-redis默认使用JdkSerializationRedisSerializer作为序列化器,但这个序列化器并不是我们想要的,可以向Spring容器中注册自己的RedisTemplate,其中可以修改序列化器为Jackson2JsonRedisSerializer。...
2020-04-03 19:41:44 125
原创 【SpringBoot】启动流程
SpringBoot版本–2.1.51、创建SpringApplication对象public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.sources = new LinkedHashSet(); this.bannerMo...
2020-03-29 23:05:12 74
原创 【SpringBoot】事件回调
SpringBoot中的几个重要事件回调机制ApplicationContextInitializerSpringApplicationRunnerListenerApplicationRunnerCommandLineRunner
2020-03-29 22:21:24 537
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人