- 博客(34)
- 收藏
- 关注
原创 Spring Bean 声明周期和各扩展点执行顺序全测试
主要演示构造器,属性注入,BeanNameAware, BeanFactoryAware,ApplicationContextAware, EnvironmentAware, InitializingBean, DisposableBean, BeanPostProcessor, init-method, destroy-method 在整个Spring bean声明周期中的执行顺序
2022-04-08 11:13:06
583
原创 SpringBoot项目启动时配置文件的加载顺序和动态指定外部配置文件
我们都知道springboot启动会扫描一下位置的application.properties或者application.yml作为默认的配置文件, 总结下SpringBoot的配置文件的加载顺序。配置文件的优先级配置文件路径的加载顺序工程根目录:./config/工程根目录:./classpath:/config/classpath:/ps: classpath: 即放在resources里面properties和yml的加载顺序bootstrap.properties优先.
2021-07-01 23:47:34
2068
原创 Idea中的VM Options、Program Arguments、Environment Variable全解析
参数使用方式示例代码获取方式VM Options必须以-D 、 -X 、 -XX 开头,每个参数用空格隔开-Dvm.key=VmKey -Dvm.key2=VmKey2String key = System.getProperty(“vm.key”);Program Arguments每个参数用空格隔开p.key=Program_Key p.name=ProgramName p.age=18main(String[] args)Environment Var...
2021-07-01 23:46:10
3511
1
原创 Spring JPA @Query 动态查询
常规动态参数实现:使用 ?数字 的参数类型@Query(value = "select a.* from user a where " + "and (?1 is null or a.name = ?1) " + "and (?2 is null or a.email = ?1) ") List<User> findUsersByNameAndEmail(String name , String email);in 条件的动态查询
2021-06-18 17:37:30
1648
原创 Mysql 索引使用及Explain使用
添加索引-- 添加PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY KEY (`column1`) ;-- 添加UNIQUE(唯一索引) ALTER TABLE `table_name` ADD UNIQUE (`column1`);-- 添加INDEX(普通索引) ALTER TABLE `table_name` ADD INDEX index_name (`column1`);-- 添加FULLTEXT(全文索引) ALTER
2021-06-18 15:50:46
288
原创 SpringBean生命周期全解析
废话不多说,先看示例代码:示例:MyTestBeanpackage com.james.example;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.beans.fact
2021-05-12 00:54:29
203
原创 JDK升级到高版本时 PostConstruct, PreDestroy, Resource找不到
如果JDK找不到 PostConstruct, PreDestroy, Resource报错,请检查你当前使用的JDK版本import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;一般我们现在使用的都是JDK8 默认rt.jar中javax.annotation中包含PostConstruct, PreDestroy, Resource这些注解。但是当我们升级到高版本的JDK时,比如JDK11时,由于JDK11移
2021-05-11 23:34:48
2494
原创 SPI
SPISPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现,简单来说,它就是一种动态替换发现的机制。使用SPI机制的优势是实现解耦,使得第三方服务模块的装配控制逻辑与调用者的业务代码分离如何实现Java中如果想要使用SPI功能,先提供标准服务接口,然后再提供相关接口实现和调用者。这样就可以通过SPI机制中约定好的信息进行查询相应的接口实现。Java SPI遵循如下约定:当服务提供者提供
2021-04-21 00:22:25
290
1
原创 并发请求等待结果都返回后处理之—— CompletableFuture.allOf()
描述多个IO请求,并发读取数据后,等待所有的请求返回后,对结果统一处理示例模拟三个请求任务,阻塞等待随机时间import com.google.common.util.concurrent.ThreadFactoryBuilder;import java.time.Instant;import java.time.temporal.ChronoUnit;import java.util.Random;import java.util.concurrent.*;public clas
2021-04-16 14:55:47
2964
原创 Spring AOP 代理对象如何注入IOC容器源码解析
如果对Sring容器的初始化不太了解,可以先参考下上一篇文章Spring如何解决循环依赖源码解析这里主要说一下,Spring在解决循环依赖时,使用三级缓存中的第三级缓存 是如何生成Bean的代理,并填充到属性中的private final Map<String, ObjectFactory<?>> **singletonFactories** = new HashMap<>(16);AbstractBeanFactory的doGetBeanprotected
2021-04-09 11:37:10
417
原创 设计模式——代理模式
文章目录基础接口UserService 接口UserServiceImpl静态代理UserServiceProxyUserServiceProxyTest动态代理JDK动态代理UserService**InvocationHandler**JdkProxyTestProxyFactoryProxyFactoryTestCGLIB动态代理引入cglib依赖UserService**MethodInterceptor**CglibProxyTestProxyFactoryProxyFactoryTest基础接
2021-04-09 00:37:20
95
原创 多线程-开启3个线程,循环打印输出结果ABC
** 问题: 开启3个线程,循环打印输出结果ABC (必须按照ABC的顺序显示) 10次 **结果:Thread-0 AThread-1 BThread-2 CThread-0 AThread-1 BThread-2 C文章目录SemaphoreSynchronizedLock ConditionLock Multi ConditionAtomicIntegerSemaphore private static void testPrintABC5() { Prin
2021-03-28 21:17:57
322
原创 UML-类图常用关系
UML:Unified Modeling LanguageUML:Unified Modeling Language(统一建模语言),使用UML进行建模的作用有哪些那:● 可以更好的理解问题● 可以及早的发现错误或者被遗漏的点● 可以更加方便的进行组员之间的沟通● 支持面向对象软件开发建模,可以更好的描述显示编程的情景类图类图用于展示系统中的类及其相互之间的关系。类图建模常用的方式是从概念层,到说明层,最后到实现层这么一个抽象层次逐步降低和细化的过程。常见关系对应线条对应类关系图解
2021-03-28 11:22:10
106
原创 Java四种Reference类型测试和PhtantomReference的应用示例
文章目录环境HardReferenceSoftReferenceWeakReferencPhantomReferenceReferenceQueueReference环境 /** * -Xmx64M 最大堆大小 * -Xms64M 初始化堆大小 * -XX:+PrintGCDetails 在控制台输出GC详细信息 * -Xmx64M -Xms64M -XX:+PrintGCDetails */ jdk\jdk11.0.9_11\bin\
2021-03-28 04:48:31
422
原创 基于LinkedList和Map实现LRUCache和SoftLRUCache
import java.util.HashMap;import java.util.LinkedList;import java.util.Map;/*** * * LRU: least recently used, 最近最少使用 */public class LRUCache<K, V> { /** * 用于记录key值的顺序 */ private final LinkedList<K> keyList = new Linke
2021-03-28 03:46:14
342
原创 查看JDK默认的垃圾收集器
命令java -XX:+PrintCommandLineFlags -versionJDK1.8.0_191$ ./java.exe -XX:+PrintCommandLineFlags -version-XX:InitialHeapSize=265930560 -XX:MaxHeapSize=4254888960 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLa
2021-03-28 03:41:41
460
原创 面试必问-线程池设置多少合适
CPU密集型任务 和 IO密集型任务线程池大小的设置原则, 阻抗原则线程数 = CPU核数 * (总运行时间/CPU繁忙时间)
2021-03-24 23:44:02
925
原创 Spring @Conditional 条件注册
@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)@ConditionalOnJndi:仅当通过JNDI提供某个资源时才加载bean@ConditionalOnJava:仅在运行特定版本的Java时加载bean:@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)@ConditionalOnMissingBean(
2021-03-23 13:55:21
231
原创 阻塞队列-BlockQueue常用方法总结
常见阻塞队列包含ArrayBlockingQueue、DelayQueue、 LinkedBlockingDeque、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,阻塞队列常用方法 add offer put take remove poll element peek 对比总结
2021-03-22 00:17:34
1096
原创 JVM 常用调优定位问题命令
文章目录jpsjpsjps -ljinfojinfo -flags 12368jinfo -sysprops 12368jstatjstat -class 12368 3000 3 类加载统计jstat -compiler 12368 3000 3 编译统计jstat -gc 12368 3000 3 垃圾回收统计jstat -gccapacity 12368 3000 3 堆内存统计jstat -gccause 12368 3000 3 显示垃圾回收的相关信息jstat -gcnew 12368 300
2021-03-21 23:23:52
519
9
原创 多线程——线程的常用方法
文章目录sleepyieldyield VS sleeppriority线程的上下文类加载器interrupt调用如下方法会使当前线程进入阻塞状态join如何关闭一个线程sleepsleep是一个静态方法,只有两个重载方法,其中一个传入毫秒数, 另一个既需要毫秒数也需要纳秒数。public static native void sleep(long millis) throws InterruptedException;public static void sleep(long millis,
2021-03-21 18:53:05
125
4
原创 Spring如何解决循环依赖源码解析
SpringBoot 在单例模式下如何解决循环依赖源码追踪,一次清晰完整的理解,设计到AbstractBeanFactory, AbstractAutowireCapableBeanFactory, DefaultSingletonBeanRegistry
2021-03-18 20:47:33
256
原创 多线程——线程的生命周期
文章目录线程的生命周期NewRunnableRunningBlockedTerminated线程的生命周期New当我们使用关键字new 创建一个线程对象时,此时它并不是处于执行状态,因为并没有调用start()启动该线程,这时只是Thread对象的的状态(New), 也即没有start之前, 该线程根本不存在,与我们用new 创建一个普通对象没有什么区别。New 状态通过start方法进入Runnable状态Runnable调用了线程对象的start方法,线程状态此时进入Runnable
2021-03-17 23:50:31
252
8
原创 Mysql 锁
文章目录InnoDB 存储引擎支持的锁MyISAM存储引擎支持的锁表级锁 VS 页级锁 VS 行级锁乐观锁什么是乐观锁如何使用乐观锁1、版本号2、CAS算法过程缺点1、 ABA问题2、循环时间长开销大3、只能保证一个共享变量的原子操作悲观锁共享锁(读锁 S)排他锁(写锁 X)如何显式指定共享锁或者排他锁显式指定共享锁显式指定排他锁查看等待锁的情况读锁和写锁的加锁关系意向锁意向共享锁(IS)意向排他锁(IX)锁策略行锁 (line lock)表锁 (talbe lock)Innodb行锁实现方式Record
2021-03-16 18:56:06
131
原创 Markdown 常用语法
文章目录简介基本语法标题粗体斜体块引用有序列表无序列表代码水平线网址和电子邮件地址超链接图片扩展语法自动生成目录表格代码块脚注标题IDMy Great Heading {#custom-id}自定义列表删除线任务列表转义字符简介Markdown是一种轻量级的标记语言,可用于将格式设置元素添加到纯文本文档中。Markdown 由John Gruber于2004年创建,如今已成为世界上最受欢迎的标记语言之一。Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。Markd
2021-03-16 15:29:06
180
原创 JVM 常用垃圾收集算法和垃圾收集器
JVM 常用垃圾收集算法和垃圾收集器垃圾收集算法标记-清除算法(Mark-Sweep)算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成之后统一回收掉所有被标记的对象。缺点:1、 标记和清除效率都不高2、 清除后会产生大量的不连续内存碎片,碎片太多,导致程序需要为大对象分配内存时无法找到足够的连续内存不得不触发另一次垃圾收集标记-整理算法标记整理在标记清除的基础上做了改进,第一阶段标记阶段,同标记清除的标记,标记出所有需要回收的对象,但是第二阶段整理阶段是:
2021-03-16 11:36:42
257
原创 Mysql日志系统
Mysql 日志系统文章目录Mysql 日志系统二进制日志(binlog)简介作用内容:什么时候产生:什么时候释放:对应的物理文件:其他重做日志(redo log)简介作用:内容:什么时候产生:什么时候释放:对应的物理文件:文件的大小和数量的配置:其他回滚日志(undo log)简介作用:内容:什么时候产生:什么时候释放:对应的物理文件:MySQL5.7之后的独立undo 表空间配置参数:其他普通查询日志(general log)错误日志(errorlog)慢查询日志(slow query log)中继日
2021-03-15 18:24:59
109
原创 Java 虚拟机动态类型支持
背景JDK1.7以前字节码指令集中invokevirtual、invokespecial、invokestatic、invokeinterface 第一个参数都是被调用方法的符号引用(CONSTANT_Methodref_info或者CONSTANT_InterfaceMethodref_info常量),方法的符号引用是在编译时产生的,而动态类型语言只有在运行期才能确定接受者类型。基于此,JDK1.7(JSR-292) 中invokedynamic指令以及java.lang.invoke包,此包主要目的
2021-03-06 22:30:16
186
原创 java javac javap
java javac javapjavahelpexample-versionrun main methodjavachelpexample-encodingjavaphelpexample-p-cjavahelpjava -help用法: java [-options] class [args...] (执行类) 或 java [-options] -jar jarfile [args...] (执行 jar 文件)其中选项包括:
2021-03-06 21:26:16
299
5
原创 JDK动态代理
动态代理JDK动态代理源码import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxyTest { interface IHello { void sayHello(); } static class Hello implements IHello {
2021-03-06 20:35:41
87
原创 Java 泛型擦除的理解及如何获取泛型的实际类型
Java 泛型擦除泛型java 字节码层面Java中获取泛型的类型信息实例化子类中获取泛型未实例化子类无法获取泛型List测试总结泛型泛型是JDK1.5之后的一项新增特性, 它的本质是参数化类型(Parametersized Type)的应用,即所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法的创建中,分别为泛型类、泛型接口和泛型方法。Java中的泛型只在程序源代码中存在, 在编译后的字节码文件中就已经替换为原来的原生类型(Raw Type), 并在相应的地方插入强制类型装换代码
2021-03-06 20:04:10
906
原创 Idea 执行单元测试时卡在resolving maven dependencies
Idea 执行单元测试时卡在resolving maven dependencies问题描述:解决方案:问题描述:执行如下测试时一直卡在Resolving Maven dependenciesjunit-jupiter-engineimport org.junit.jupiter.api.Test;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestclass SpringbootDemoApp
2021-02-04 16:47:57
543
原创 并发编程中的挑战
并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战。一、上下文的切换1.1 什么是上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程...
2019-05-07 23:23:12
117
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人