自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 使用mysql实现定时任务队列

使用mysql实现定时任务队列1、首先创建一个叫MysqlQueue的类封装对mysql队列的操作。这个类其实比较简单,提供了take方法和pull方法来加载以及释放mysql中的记录。@Componentpublic class MysqlQueue { @Autowired private DataSetService dataSetService; @Autowired private SyncLogService syncLogService; @Tr

2022-05-10 14:53:24 1030

原创 老生谈spring(二十六):推断构造器初探

老生谈spring(二十六):推断构造器初探先看几个例子:1、当只有一个默认构造器时。@Componentpublic class C { public C(){ System.out.println("默认构造器"); }}这时没得选,只会反射这个默认的构造器。2、只有一个有参构造器。@Componentpublic class C { public C(A a){ System.out.println("有参构造函数" + a

2022-05-09 15:21:32 438 1

原创 老生谈spring(二十五):手动装配VS自动装配

老生谈spring(二十五):手动装配VS自动装配1、手动装配手动装配是可以进行value和ref进行配置,因为他已经明确了指定的属性值,这个称之为手动装配。手动装配分为:模式注解装配例子:其实就是使用@Component注解,或者@Component注解的拓展,比如@Controller、@Service、Repository、@Configruation等,这也是我们最常用的一种方式,直接通过spring mvc的注解把组件bean注入到spring容器中。@Enable模块装配例

2022-04-26 16:02:31 1444

原创 老生谈spring:自定义标签(番外)

资深小白谈spring(番外一):自定义标签

2022-01-21 22:05:41 377

原创 老生谈spring(二十四):Bean实例的创建(三)

老生谈spring(二十二):Bean实例的创建(三)1、这节我们来看看FactoryMethod有参数的情况,首先创建个B类,让spring管理。@Componentpublic class B {}2、然后在A类里使用构造方法注入B对象。public class A { private B b; public A(B b){ this.b = b; System.out.println("a init.."); }}3、a方法

2022-01-06 22:18:32 346

原创 老生谈spring(二十三):Bean实例的创建(二)

老生谈spring(二十二):Bean实例的创建(二)1、如果BeanDefiniton的factoryMethodName属性不为空,则进入instantiateUsingFactoryMethod的创建逻辑。 if (mbd.getFactoryMethodName() != null) { return instantiateUsingFactoryMethod(beanName, mbd, args); }2、点进instantiateUsingFactoryMethod方法你会

2021-12-30 22:09:41 371

原创 老生谈spring(二十二):Bean实例的创建(一)

老生谈spring(二十二):推断构造器

2021-12-26 17:10:13 264

原创 老生谈spring(二十一):循环依赖(三)

资深小白谈spring(二十一):循环依赖(三)1、本节将解答上节留下的两个问题,首先看第一个问题为什么三级缓存要缓存一个Bean的工厂?要解答这个问题首先就要搞明白,spring注入的是Java对象还是一个spring bean(下面统称为bean)。有人可能没有弄明白这两个的关系,众所周知,bean就是一个Java对象,但是Java对象并不一定就是bean。举个最简单的例子,直接new一个对象,这个对象肯定是Java对象,但它不是spring创建的也不被spring管理,它也不具备bean的一些特性,

2021-10-11 17:23:56 171

原创 老生谈spring(二十):循环依赖(二)

资深小白谈spring(二十):循环依赖(二)1、首先看doGetBean的方法,进来对name进行一个解析,如果是别名转换成beanName。然后二话不说,调用getSingleton方法去拿这个实例。

2021-10-09 18:37:49 170

原创 老生谈spring(十九):循环依赖(一)

资深小白谈spring(十九):循环依赖(一)1、spring是否支持循环依赖,我们举个例子来证明一下。定义两个类A和B:@Componentpublic class A { @Autowired private B b;}@Componentpublic class B { @Autowired private A a;}...

2021-10-09 09:04:57 147

原创 老生谈spring(十八):getBean

资深小白谈spring(十八):getBean1、preInstantiateSingletons这个方法会遍历beanNames时首先判断这个bean是不是FactoryBean,如果是则创建FactoryBean,否则直接getBean创建这个bean。这个方法在容器初始化的时候被调用,至于单例的非懒加载的bean才会被创建。2、getBean调用了doGetBean方法,看了这么久的spring代码,想必你已经指定带do的方法才是真正干活的。(doGetBean方法稍长,将拆分成几段)3、do

2021-09-29 11:29:05 259

原创 老生谈spring(十七):BeanDefinition的合并原理

资深小白谈spring(十七):preInstantiateSingletons序言:前面用了比较多的章节讲解了spring从创建容器、扫描得到BeanDefinitionMap、BeanFactoryPostProcessor的初始化及其方法的执行以及BeanPostProcessor的初始化和注册等等,接下来将进入spring framework的重中之重:IOC和AOP的源码讲解。本节开始将正式开始讲解spring bean创建的一系列生命周期,内容精彩不要错过哦。1、在finishBeanFac

2021-09-29 08:44:28 723

原创 老生谈spring(十六):registerBeanPostProcessors

资深小白谈spring(十六):registerBeanPostProcessors1、registerBeanPostProcessors调用了PostProcessorRegistrationDelegate的registerBeanPostProcessors方法,该方法做的事情就三样:创建BeanPostProcessors、排序以及注册。public static void registerBeanPostProcessors( ConfigurableListableBeanFact

2021-09-24 09:03:24 299

原创 老生谈spring(十五):invokeBeanFactoryPostProcessors

资深小白谈spring(十五):invokeBeanFactoryPostProcessors1、上一节给大家展示了BeanFactoryPostProcessor的作用,现在给大家讲解它是如何生效的。前面几节已经带大家清楚地看到,开启了注解模式以后就会扫描指定包的所有含Component注解的class。所以只要加了Component的class都会被扫描器扫描到,扫描完了以后就会进入refresh的invokeBeanFactoryPostProcessors方法:2、invokeBeanFacto

2021-09-23 09:46:20 1072

原创 老生谈spring(十四):BeanFactoryPostProcessor

资深小白谈spring(十四):invokeBeanFactoryPostProcessors序言:前面已经详细地讲解了obtainFreshBeanFactory方法,这个方法把xml文件解析为BeanDefinition然后逐个注册到beanDefinitionMap容器。接下来给大家讲解spring bean的创建过程,虽然这个过程非常长,也会分很多章节进行逐步讲解,但还是会尽量地把这个过程清晰完整地展示给大家。1、首先给大家理清一下spring启动的整个流程思路(refresh):1)obta

2021-09-18 12:23:24 432 1

原创 老生谈spring(十三):doScan的扫描原理

资深小白谈spring(资深小白谈spring(十三):doScan的扫描原理1、上一节讲了filter过滤器,这节带大家了解doScan的扫描原理:2、在doScan方法中,扫描的主要逻辑就在findCandidateComponents方法中,如果没有特殊配置,findCandidateComponents方法主要是调scanCandidateComponents方法进行扫描。3、遍历路径的代码只是个for循环就不看了,我们主要看的还是过滤器怎么进行过滤的。4、从代码就可以看到,使用match方

2021-09-17 18:35:30 900

原创 老生谈spring(十二):ClassPathBeanDefinitionScanner的filter设置

资深小白谈spring(十二):ClassPathBeanDefinitionScanner的filter设置1、创建扫描器时如果没配置则使用默认的过滤器对扫描的类进行过滤2、createScanner值做了一件事就是new一个ClassPathBeanDefinitionScanner扫描器。3、ClassPathBeanDefinitionScanner的构造方法判断是否使用默认的过滤器,useDefaultFilters默认是true的。4、默认的过滤器中首先会有一个include过滤器去过

2021-09-16 09:08:59 371

原创 老生谈spring(十一):自定义标签之component-scan

资深小白谈spring(十一):自定义标签之component-scan1、上一节讲到了spring通过resolve方法解析spring.handlers文件得到context的解析类,现在接着来看resolve方法。反射得到这个handler类以后用BeanUtils创建这个类的实例,调用init方法后放到handlerMappings容器中。2、以context:component-scan为例,我们知道context的命名空间是由ContextNamespaceHandler来负责处理的,那么我

2021-09-15 09:08:15 321

原创 老生谈spring(十):自定义标签之DefaultNamespaceHandlerResolver

资深小白谈spring(十):自定义标签之DefaultNamespaceHandlerResolver1、本节主要讲DefaultNamespaceHandlerResolver,首先看它的构造方法。它调用的是重载的构造方法,并且传了DEFAULT_HANDLER_MAPPINGS_LOCATION,DEFAULT_HANDLER_MAPPINGS_LOCATION就是项目路径META-INF下的spring.handlers文件。2、重载的构造方法只是做了简单的赋值,把spring.handler

2021-09-14 10:02:50 397

原创 老生谈spring(九):自定义标签之初探

资深小白谈spring(九):自定义标签解析1、使用自定义标签,启动注解扫描得到class bean。注意在beans标签上需要引入context的uri,这个uri的作用在后面讲解。2、可以看到运行结果是正确的:3、想要了解context这种自定义标签的作用,首先看registerBeanDefinitions方法,这里会有个createReaderContext方法。4、这个createReaderContext会调用一个getNamespaceHandlerResolver的方法。5、

2021-09-14 09:12:34 200

原创 老生谈spring(八):BeanDefinition的注册

资深小白谈spring(八):BeanDefinition的注册1、通过解析bean标签得到创建BeanDefinition的过程已经简单地讲完了,那么下面processBeanDefinition方法(DefaultBeanDefinitionDocumentReader类里)。创建玩Bean Definition并封装成BeanDefinitionHolder以后,就调用BeanDefinitionReaderUtils.registerBeanDefinition进行注册 protected vo

2021-09-13 17:20:36 473

原创 老生谈spring(七):xml的setter注入原理

资深小白谈spring(七):xml的setter注入原理1、xml的setter注入和构造器的注入原理相似,先对xml和Aclass修改成setter注入public class A { private String name; public void setName(String name) { this.name = name; } @Override public String toString() { return "

2021-09-13 09:38:01 624

原创 老生谈spring(六):xml的构造器注入原理

资深小白谈spring(六):xml的构造器注入1、我对第一节中的A类做一个小小的修改,在构造方法中注入一个name属性:public class A { private String name; /** * 构造注入 * * @param name */ A(String name) { this.name = name; } @Override public String toString(

2021-09-10 16:45:15 801

原创 老生谈spring(五):parseBeanDefinitionElement对bean标签的处理

资深小白谈spring(五):processBeanDefinition对bean标签的处理1、上一节我们知道了bean标签的处理主要是通过processBeanDefinition方法,现在我们主要关注BeanDefinitionParserDelegate的parseBeanDefinitionElement方法,这个方法会让我们得到一个Bean Definition对象。protected void processBeanDefinition(Element ele, BeanDefinition

2021-09-09 09:31:45 395

原创 老生谈spring(四):xml的解析

资深小白谈spring(四):xml的解析1、接着上一节,我们继续看loadBeanDefinitions代码(代码被我简化成伪代码)public int loadBeanDefinitions(String location, @Nullable Set<Resource> actualResources) throws BeanDefinitionStoreException { ResourceLoader resourceLoader = getResourceLoader();

2021-09-08 18:50:41 433

原创 老生谈spring(三):初步了解Resource

资深小白谈spring(三):初步了解Resource1、接着看上一节的loadBeanDefinitions,这个方法的前几行都是构建beanDefinitionReader,最后一行则是调用loadBeanDefinitions进行xml的解析和注册,下面重点看这个方法。 @Override protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOExce

2021-09-08 18:47:00 266

原创 老生谈spring(一):spring的xml定义bean

spring源码精讲序言精者简也,这里我会用最简单、最通俗易懂的方式给大家讲解spring源码。如果你对spring源码非常感兴趣但又苦于spring源码的羞涩难懂,那么这些篇章就非常适合你。我会带大家以最清晰、最直观的方式阅读spring源码。初次以外,我还会带大家写一些自己的框架,然后通过spring的规范去整合这些框架以及功能。(我的spring版本是5.1.6.RELEASE)。spring官网:https://spring.io/资深小白谈spring(一):spring的xml定义bean

2021-09-08 18:45:03 581

原创 老生谈spring(二):初步了解ClassPathXmlApplicationContext

资深小白谈spring(二):初步了解ClassPathXmlApplicationContext1、在上一节中讲到启动容器的主要代码就是context.refresh();现在带大家认识这个refresh方法。2、点进这个方法你会发现,refresh是父类AbstractApplicationContext的方法,它采用了模板的设计模式,定义了一套spring容器启动时的抽象方法以及调用顺序。我们先不关心其他的,就只看obtainFreshBeanFactory方法。 @Override publ

2021-09-08 18:43:42 486

原创 深入理解JAVA虚拟机

深入理解JAVA虚拟机了解JVM的内存结构了解JVM的内存结构众所周知,虚拟机的内存可以划分为:运行时数据区和直接内存(堆外内存),而运行时数据区又可以划分为方法区、堆、虚拟机栈、本地方法栈和程序计算器。其中方法区和堆是线程共享的,虚拟机栈、本地方法栈和程序计数器则是线程私有的,每个线程都有一份。为了更清晰的看到内存结构,我们需要借助两个jdk的工具:jps和HSDB,jps可以查看到java的进程,HSDB可以看到进程里面的内存详细的信息。首先写个java的demo来测试一下:/** * VM

2021-06-27 08:55:02 290

原创 如何手写一个线程池(附线程池的用法)

#mermaid-svg-xt95PAn8LwS4Er5V .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-xt95PAn8LwS4Er5V .label text{fill:#333}#mermaid-svg-xt95PAn8LwS4Er5V .node rect,#mermaid-svg-xt95PAn8Lw

2020-11-12 09:41:12 1163 3

原创 深入理解AQS框架

深入理解AQS框架如何自己手动实现一把锁?ReentrantLock的内部结构以及源码分析非公平锁可打断和不可打断的区别公平锁解锁过程await队列读写锁如何自己手动实现一把锁?在讲解ReentrantLock之前,我会先演示如何用AQS的框架手动实现一把锁。首先,我们定义一个自己的Sync类去继承AQS的模板类AbstractQueuedSynchronizer并且提供这个类里面抽象方法的实现,代码如下: /** * 实现独占锁,锁状态0代表未获取锁,1代表已经获取到锁 */

2020-10-28 13:57:19 261

原创 深入理解synchronized关键字

并发编程之synchronized欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习

2020-10-23 15:57:17 566

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除