refreshContext(context)方法源码探究】的更多相关文章

该方法目的是刷新应用上下文,是容器启动最主要的方法,其实现是一个模板方法,内容巨大,所以先看模板方法都做了哪些事,然后再细看每个方法的实现机制. refreshContext(context)方法首先调用了本类中一个refresh(context)方法: 然后在该方法中,context变身AbstractApplicationContext调用了后者的refresh()方法,该方法就是上面所述的模板方法 里面规定了刷新应用上下文所必须走的12步流程: 1.准备刷新--->2.获取刷新bean工厂…
该方法目的是创建一个环境对象,并且根据环境类型,自动判断是创建web环境对象,还是标准非web环境对象. 首先该方法源于prepareEnvironment准备环境: 然后进入该方法源码: 可以发现:根据webEnvironment字段,可以判断要生成的环境的类型,此处添加了web环境的jar包,所以是标准的Servlet环境. 这里直接new StandardServletEnvironment()创建对象,查看StandardServletEnvironment构造器,发现是空实现,好像什么…
该方法目的是做刷新上下文前的准备工作: 首先清空bean扫描器map中的内容,然后调用父类的prepareRefresh方法: 父类的准备刷新方法,主要做了3个工作: 1.简单的标志赋值---->2.初始化属性源---->3.验证必须的属性是否都有 其中初始化属性源,主要工作是:判断servletContext和servletConfig是否存在,如果存在就将它们添加到属性源中,源码如下: 而验证必须的属性,则简单,因为有一个专门的属性集盛放的是必须属性,验证的过程是将其打开,查看每个属性是否…
1. SpringBoot读取配置文件源码探究 1.1. 概览 springboot的源码是再原来的Spring源码上又包了一层,看过spring源码都知道,当我们从入口debug进去的时候,原来的Spring源码都集中在refreshContext方法,SpringBoot的主要运行步骤,基本都包含在这个方法里了,而这个方法就是我们运行Springboot的主函数SpringApplication.run(Application.class, args);经过几步后到达的 public Con…
前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 119:我们怎样才能到你家? 他说:你们不是有消防车吗? 119说:烧死你个傻B算了. 路漫漫其修远兮,吾将上下而求索! github:https://github.com/youzhibing 码云(gitee):https://gitee.com/youzhibing 前情回顾 上篇博客中,讲到了s…
Vue源码探究-虚拟DOM的渲染 在虚拟节点的实现一篇中,除了知道了 VNode 类的实现之外,还简要地整理了一下DOM渲染的路径.在这一篇中,主要来分析一下两条路径的具体实现代码. 按照创建 Vue 实例后的一般执行流程,首先来看看实例初始化时对渲染模块的初始处理.这也是开始 mount 路径的前一步.初始包括两部分,一是向 Vue 类原型对象上挂载渲染相关的方法,而是初始化渲染相关的属性. 渲染的初始化 下面代码位于vue/src/core/instance/render.js 相关属性初始…
一.项目搭建 1.pom.xml <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>org.springframework</gr…
1. spring-cloud-sleuth+zipkin源码探究 1.1. 前言   粗略看了下spring cloud sleuth core源码,发现内容真的有点多,它支持了很多类型的链路追踪,我就找其中一个比较有代表性的深入剖析下源码结构和内容 1.2. spring-cloud-sleuth-core源码解析 1.2.1. 结构 可以看到源码中支持的追踪类型有很多,支持async,hystrix,websocket,rxjava,Spring mvc,servlet,spring re…
Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局API来强化功能开发,API的使用示例官网上都有说明,无需多言.这里主要来看一下全局API模块的实现.全局API的文件夹里有一个入口文件,各个功能分开定义,在这个入口文件中统一注入. 入口文件index.js /* @flow */ // 从各个模块导入功能函数 import config from '../config' import { initUse } from './use'…
Vue源码探究-事件系统 本篇代码位于vue/src/core/instance/events.js 紧跟着生命周期之后的就是继续初始化事件相关的属性和方法.整个事件系统的代码相对其他模块来说非常简短,分几个部分来详细看看它的具体实现. 头部引用 import { tip, toArray, hyphenate, handleError, formatComponentName } from '../util/index' import { updateListeners } from '../…
Vue源码探究-状态初始化 Vue源码探究-源码文件组织 Vue源码探究-虚拟DOM的渲染 本篇代码位于vue/src/core/instance/state.js 继续随着核心类的初始化展开探索其他的模块,这一篇来研究一下Vue的状态初始化.这里的状态初始化指的就是在创建实例的时候,在配置对象里定义的属性.数据变量.方法等是如何进行初始处理的.由于随后的数据更新变动都交给观察系统来负责,所以在事先弄明白了数据绑定的原理之后,就只需要将目光集中在这一部分. 来仔细看看在核心类中首先执行的关于 s…
Vue源码探究-源码文件组织 源码探究基于最新开发分支,当前发布版本为v2.5.17-beta.0 Vue 2.0版本的大整改不仅在于使用功能上的优化和调整,整个代码库也发生了天翻地覆的重组.可见随着使用者的增加与声名传播,Vue自身的格局发生了很大的突破,特别体现在对Weex框架做了内部支持.不管在未来是使用Weex或者与NativeScript结合做跨平台应用开发,都还是能与React.Angular保持三足鼎立的势头. Vue的github仓库根目录 先来大致了解一下整个项目的结构(摘译自…
1. @Async源码探究 1.1. 上代码 @SpringBootApplication @EnableAsync public class SpringbootLearnApplication { public static void main(String[] args) { SpringApplication.run(SpringbootLearnApplication.class, args); } } @Service public class CreatingThread08Ser…
1. Sharding-Jdbc源码探究-读写分离 1.1. 主入口 找到源码入口 这一个类围绕了springboot配置属性的加载,加载了spring.shardingsphere.datasource.names配置的数据源,遍历存储到了Map容器 可以看到它还有个@ConditionalOnProperty(prefix = "spring.shardingsphere", name = "enabled", havingValue = "true&…
Vue源码探究-数据绑定的实现 本篇代码位于vue/src/core/observer/ 在总结完数据绑定实现的逻辑架构一篇后,已经对Vue的数据观察系统的角色和各自的功能有了比较透彻的了解,这一篇继续仔细分析下源码的具体实现. Observer // Observer类用来附加到每个观察对象上. // 将被观察目标对象的属性键名转换成存取器, // 以此收集依赖和派发更新 /** * Observer class that is attached to each observed * obje…
很早就知道在多线程环境中,HashMap不安全,应该使用ConcurrentHashMap等并发安全的容器代替,对于ConcurrentHashMap也有一定的了解,但是由于没有深入到源码层面,很多理解都是浮于表面,稍微深一点的东西就不是很懂.这两天终于下定决心将ConcurrentHashMap的源码探究了一遍,记录一下心得体会,算是对阅读源码的一个总结吧.需要提醒读者注意,因为个人水平有限,且本文本质上来讲是留给未来的自己进行查阅的总结,所以难免会有错漏,一经发现,本人会尽快纠正,也欢迎大家…
CyclicBarrier也叫回环栅栏,能够实现让一组线程运行到栅栏处并阻塞,等到所有线程都到达栅栏时再一起执行的功能."回环"意味着CyclicBarrier可以多次重复使用,相比于CountDownLatch只能使用一次,CyclicBarrier可以节省许多资源,并且还可以在构造器中传入任务,当栅栏条件满足时执行这个任务.CyclicBarrier是使用了ReentrantLock,主要方法在执行时都会加锁,因此并发性能不是很高. 1.相关字段 //重入锁,CyclicBarri…
ReentrantLock是一种可重入锁,可重入是说同一个线程可以多次获取同一个锁,内部会有相应的字段记录重入次数,它同时也是一把互斥锁,意味着同时只有一个线程能获取到可重入锁. 1.构造函数 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } ReentrantLo…
ReentrantReadWriteLock实现了可重入的读锁和写锁,其中读锁是共享锁,写锁是互斥锁.与ReentrantLock类似,ReentrantReadWriteLock也提供了公平锁和非公平锁两种实现,以满足不同的场景.因此,实际在使用时,会涉及到读锁.写锁.公平锁.非公平锁四个不同的概念,这也使得ReentrantReadWriteLock更加复杂一些. 1.核心字段与构造器 private final ReentrantReadWriteLock.ReadLock readerL…
前言     相信使用过Asp.Net Core开发框架的人对自带的DI框架已经相当熟悉了,很多刚开始接触.Net Core的时候觉得不适应,主要就是因为Core默认集成它的原因.它是Asp.Net Core基础核心框架之一,对于Asp.Net Core来说DI就灵魂,已经深入到这框架的骨髓里了.对于IOC和DI,可能每个人都能说出自己的理解.IOC全称是Inversion of Control翻译成中文叫控制反转,简单的说就是把对象的控制权反转到IOC容器中,由IOC管理其生命周期.DI全称是…
JDK动态代理案例实现:实现 InvocationHandler 接口重写 invoke 方法,其中包含一个对象变量和提供一个包含对象的构造方法: public class MyInvocationHandler implements InvocationHandler { Object target;//目标对象 public MyInvocationHandler(Object target){ this.target=target; } /** * @param proxy 代理对象 *…
由前文可得知, Spring Framework的自动装配有两种方式:xml配置和注解配置: 自动装配的类型有: (1)xml配置中的byType根据类型查找(@Autowired注解是默认根据类型查找,类型查找不到会使用名称查找): (2)xml配置中的byName根据名称查找,它是xml配置中根据setter方法来查找(@Resource注解也是根据名称查找,但它是根据属性名称来查找,跟setter方法无关,所以setter方法可以不用写,可以使用type指定类): 如果没有上面的在xml中…
Context包源码解析 Context就相当于一个树状结构 最后请回答一下这个问题:context包中的方法是线程安全吗? Context包中主要有一个接口和三个结构体 Context接口 type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{} } 结构体 type valueCt…
AQS源码探究---竞争锁资源 我们进入ReentrantLock源码中查看其内部类 Sync 对AQS进行扩展公共方法并定义抽象方法的抽象类 FaireSync 实现公平锁的AQS的实现类 UnFairSync 实现非公平锁的ASQ的实现类 我使用例子进行的debug,然后一步一步看源码.例子在文章最后面 以下流程皆以非公平锁为例 线程竞争锁资源 AQS的state解释: 0 表示锁没有被占用 1 表示锁被占用了 > 1 表示锁被重入了 PS: ReentrantLock是可重入锁 获得锁执行…
Java split方法源码分析 public String[] split(CharSequence input [, int limit]) { int index = 0; // 指针 boolean matchLimited = limit > 0; // 是否限制匹配个数 ArrayList<String> matchList = new ArrayList<String>(); // 匹配结果队列 Matcher m = matcher(input); // 待切…
上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel模块,因为我们先前主要分析的split_1_*对应的是rmergel,我们先从rmergel查看,如下 ....................................................... split_1(X, Y, [], R, Rs) -> rmergel([[Y, X…
排序算法一直是各种语言最简单也是最复杂的算法,例如十大经典排序算法(动图演示)里面讲的那样 第一次看lists的sort方法的时候,蒙了,几百行的代码,我心想要这么复杂么(因为C语言的冒泡排序我记得不超过30行),于是自己就实现了下 结果更蒙了 bubble_sort(L)-> bubble_sort(L,length(L)). bubble_sort(L,0)-> L; bubble_sort(L,N)-> bubble_sort(do_bubble_sort(L),N-1). do_…
>TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码     TreeSet集合使用实例 package cn.itcast_05; import java.util.TreeSet; /* * TreeSet:能够对元素按照某种规则进行排序. * 排序有两种方式 * A:自然排序 * B:比较器排序 * * TreeSet集合的特点:排序和唯一 * * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的…
invalidate方法源码分析 在之前分析View的绘制流程中,最后都有调用一个叫invalidate的方法,这个方法是啥玩意?我们来看一下View类中invalidate系列方法的源码(ViewGroup没有重写这些方法),如下: /**  * Mark the area defined by dirty as needing to be drawn. dirty代表需要重新绘制的脏的区域  * , 0, mRight - mLeft, mBottom - mTop, invalidateC…
Linq分组操作之GroupBy,GroupJoin扩展方法源码分析 一. GroupBy 解释: 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值. 查询表达式: var list = new List<object>() { 20, 30, 24 };查询表达式: var query = from n in list group n by n into grp select new { MyKey = grp.Key, MyValue = grp.Count()…