- 博客(26)
- 收藏
- 关注
原创 invokeBeanFactoryPostProcessors
refresh里面的invokeBeanFactoryPostProcessors方法。这个方法干了什么呢?,执行所有实现了 BeanDefinitionRegistryPostProcessor接口的bd ,会执行所有实现了 BeanFactoryPostProcessor接口的bd。public interface BeanFactoryPostProcessor { /** * Modify the application context's internal bean factor
2021-05-29 23:31:03
220
原创 BeanDefinition
BeanDefinition是spring里面bean的一个建模对象,就相当于class对象是普通java对象的建模对象一样。可能在spring作用的各种业务场景中,class对象并不能完成spring对bean的抽象,所以弄了一个BeanDefinition作为bean的抽象建模对象。看看BD的UML类图的继承关系AttributeAccessor就是对Attribute的增删改查,Attribute是一个map<String,Object>,bd里的一个容器。这个map里面会
2021-05-29 23:29:26
218
原创 refresh的准备
@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. //准备工作 比如对系统变量的校验等等 prepareRefresh(); // Tell the subclass to refresh the .
2021-05-23 16:24:27
188
原创 ClassPathBeanDefinitionScanner
上一篇AnnotatedBeanDefinitionReader中提到了ClassPathBeanDefinitionScanner,这两个都是AnnotationConfigApplicationContext中的属性,现在就看看这个ClassPathBeanDefinitionScanner在Spring上下文中干了啥 public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionR
2021-05-21 21:14:41
900
原创 AnnotatedBeanDefinitionReader
在AnnotationConfigApplicationContext可以实现基于Java的配置类加载spring的应用上下文,应该都蛮熟悉的,而在这个类里面,有两个特别重要的属性,就是这两个属性,在调用refresh()之前,帮这个类,干了很多的事情。这篇讲的就是其中一个属性AnnotatedBeanDefinitionReader这个类,下面就解析它是干嘛的 public AnnotationConfigApplicationContext() { this.reader = new An
2021-05-21 21:14:33
722
原创 clearMetadataCache解析
跟着代码看了前面几篇文章,现在再来看void clearMetadataCache();这个BeanFactoryPostProcessor的扩展点方法,就可以搞清楚它的意思了 public void clearMetadataCache() { //表示mergedbdmap当中的bd过期了 没有冻结 super.clearMetadataCache(); this.mergedBeanDefinitionHolders.clear(); clearByTypeCache
2021-05-20 20:44:22
358
原创 freezeConfiguration Spring冻结的解析
/** * 冻结所有bean定义,表示已注册的bean定义将不会被进一步修改或后处理。 * <p>This allows the factory to aggressively cache bean definition metadata. */ void freezeConfiguration(); @Override public void freezeConfiguration() { this.configurationFrozen = true; th..
2021-05-20 20:43:57
1004
原创 registerBeanDefinition
public interface BeanDefinitionRegistry extends AliasRegistry { /** * 在此注册表中注册一个新的bean定义。必须支持RootBeanDefinition和ChildBeanDefinition。 * @param beanName 要注册的bean实例的名称 * @param beanDefinition 要注册的bean实例的定义 *指定的bean名称,我们不允许覆盖它 * @see GenericBeanDe.
2021-05-19 23:15:31
2171
原创 mergedBeanDefinition
spring的生命周期里,其实并不只是在applicationContext上下文里get bd,就丢到单例池里,而是会进行一步mergeBeanDefinition操作,也就是合并BDBeanDefnition(BD)是没有mergedBeanDefinition这个类型,它只是进行了个合并为什么要合并beanDefinition,这是因为BD存在父子关系,这个可能是业务逻辑的需要吧,这个暂时不太明白哈。先debug看一段代码吧public class TestSpring { publi
2021-05-19 23:15:19
527
原创 clearByTypeCache方法深入解析
private void clearByTypeCache() { this.allBeanNamesByType.clear(); this.singletonBeanNamesByType.clear(); }看看clearByTypeCache()方法的代码,做的事情很简单,就是清楚这两个map,那么这两个map到底是啥玩意呢? /** Map of singleton and non-singleton bean names, keyed by dependency type..
2021-05-19 23:14:17
304
原创 BeanFactoryPostProcessor扩展类的API调用分析
BeanFactoryPostProcessor它是bean工厂的处理器,主要是提供给程序员扩展的;在spring容器运行期间可以让程序员对BeanFactory组件进行设置;这个咱们肯定都知道,BeanFactoryPostProcessor是Spring给程序员的个扩展点,而这个扩展点,是怎么扩展呢?可以看看这个接口@FunctionalInterfacepublic interface BeanFactoryPostProcessor { void postProcessB.
2021-05-18 00:05:09
135
原创 自定义注解
在Spring里面随处都可以看到各种各样的注解,所以再学习Spring源码之前,必须得搞定注解是什么,他们有什么用。所以咋们尝试自己写一个注解,也就是自定义注解package org.shadow.test;public @interface Zhou { public String value() default " "; public int age() default 2;}可以看看这个代码,也就是我们自定义的注解,接口那加个@就是了,然后下面自己定义注解里的参数。也就是我...
2021-05-17 15:28:52
233
原创 虚拟内存和memory.c解析
问题:1.在运行应用程序的时候,是把所有的代码和数据全部加载到内存中么?如果不是,那么在用到一些代码而这些代码不在内存中该肿么办?2.在fork一个进程的时候,我们完全的为子进程拷贝了父进程的内存空间,那么这个进程的拷贝是真的创建了两个完全一个的内存块在物理内存中么?如果不是,那操作系统怎么做的(写时拷贝)memory.c内存管理主要实现了两个重要方式:1.分页机制:缺页重读2.内存读写权限:用时拷贝在页目录和页表表项结构中会空余12位的长度供其它权限使用其中: ...
2021-05-16 21:36:48
379
原创 内存管理机制
目的: 1.了解Linux内存的管理机制(分段 分页) 2.了解虚拟内存和物理内存的映射方式 3.了解操作系统内存与磁盘的交互(分页机制--->缺页重读机制,用时拷贝机制) 4.应用程序如何高效使用内存和高级程序的设计方法名词: 内存以页为单位存在,一页为4k的大小 逻辑地址:程序员看到的地址,Linux操作系统分配给每个进程的独立地址 线性地址:总线地址ARM CP...
2021-05-16 09:21:24
109
原创 进程的销毁
1.进程的销毁流程 1.1exit是销毁函数------------一个系统调用-------do exit首先该函数会释放进程的代码段和数据段占用的内存 1.2关闭进程打开的所有文件,对当前的目录和i结点进行同步(文件操作) 1.3如果当前要销毁的进程有子进程,那么就让1号进程作为新的父进程(init进程) 1.4如果当前进程是一个会话头进程,则会终止会话中的所有进程 1.5改变当前进程的运行状态,变成...
2021-05-15 13:28:08
674
原创 进程调度与进程切换
进程调度void schedule(void) 进程调度函数void schedule (void){ int i, next, c; struct task_struct **p; // 任务结构指针的指针。/* 检测alarm(进程的报警定时值),唤醒任何已得到信号的可中断任务 */// 从任务数组中最后一个任务开始检测alarm。 for (p = &LAST_TASK; p > &FIRST_TASK; --p) if (*p) {//.
2021-05-14 16:45:26
877
原创 进程的初始化与创建
main.c入口void main_rename(void) /* 这里确实是void,并没错。 */{ /* 在startup 程序(head.s)中就是这样假设的。 *//* * 此时中断仍被禁止着,做完必要的设置后就将其开启。 */ // 下面这段代码用于保存: // 根设备号 -> ROOT_DEV; 高速缓存末端地址 -> buffer_memory_end; // 机器内存数 -> memory_end;主内存开始地址 -> main_memor
2021-05-13 23:59:24
742
原创 进程的数据结构
struct task_struct{/* these are hardcoded - don't touch */ long state; /* -1 unrunnable, 0 runnable, >0 stopped */ long counter; long priority; long signal; struct sigaction sigaction[32]; long blocked; /* bitmap of masked signals *//* var.
2021-05-13 23:58:54
169
原创 JIFFIES——系统滴答
CPU内部有一个RTC,会在上电的时候调用mktime函数算出从1970年1月1日0时开始到当前开机点所过的秒数long kernel_mktime (struct tm *tm){ long res; int year; year = tm->tm_year - 70; // 从70 年到现在经过的年数(2 位表示方式), // 因此会有2000 年问题。 /* magic offsets (y+1) needed to get leapyears right. *..
2021-05-13 21:23:42
351
原创 system_call.s
_system_call: cmp eax,nr_system_calls-1 ;// 调用号如果超出范围的话就在eax 中置-1 并退出。 ja bad_sys_call push ds ;// 保存原段寄存器值。 push es push fs push edx ;// ebx,ecx,edx 中放着系统调用相应的C 语言函数的调用参数。 push ecx ;// push %ebx,%ecx,%edx as parameters push ebx ;// to the system .
2021-05-13 15:21:06
173
原创 中断
目的:1.硬件的中断响应---->内核驱动中的中断2.系统调用的函数响应(sys_call)--->系统调用3.自定义中断---->软件的软中断模式4.信号中断---->对了解信号的使用 创建5.系统的异常和错误---->系统的异常获取 了解系统异常的作用1.Linux的中断机制 1.1 分类:硬件中断 软件中断 硬中断:由电脑主机的B259A类似的硬件中断控制芯片发出的中断...
2021-05-13 15:12:54
103
原创 Dubbo服务导出源码解析
服务导出要做的几件事情1.确定服务的参数2.确定服务支持的协议3.构造服务最终的URL4.将服务URL注册到注册中心去5.根据服务支持的不同协议,启动不同的Server,用来接收和处理请求6.因为Dubbo支持动态配置服务参数,所以服务导出时还需要绑定一个监听器Listener来监听服务的参数是否有修改,如果发现有修改,则需要重新进行导出主要就是两个 1.构造URL 2.注册URL到注册中心服务概念的演化:1.DemoSer...
2021-05-08 14:11:50
297
原创 Dubbo整合Spring源码解析
@EnableDubbo注解@EnableDubboConfig @DubboComponentScan这个注解里面的这两个注解,让Dubbo和Spring能够完美整合,使得Dubbo的各种配置,能够自然转换为bean放入IOC中。// @EnableDubboConfig注解用来将properties文件中的配置项转化为对应的Bean// @DubboComponentScan注解用来扫描服务提供者和引用者(@Service)@EnableDubboConfig...
2021-05-05 23:45:31
342
原创 Dubbo SPI详解
Dubbo SPI的使用ExtensionLoader<Person> extensionLoader = ExtensionLoader.getExtensionLoader(Person.class); Person person = extensionLoader.getExtension("black");通过ExtensionLoader得到Person类的扩展点,然后通过getExtension方法,可以得到这个接口扩展点下面的子类,并可以使用这个类的方法
2021-05-05 18:02:11
288
原创 Zookeeper服务器启动源码
Zookeeper服务器启动源码Zookeeper服务器启动的main入口类是QuorumPeerMain 。它作为服务器单机或集群的启动类,mian函数为入口。 public static void main(String[] args) { QuorumPeerMain main = new QuorumPeerMain(); try { main.initializeAndRun(args); } catch ...
2021-05-01 16:20:11
495
原创 Java SPI
Java SPI API和SPI API也就是咋们老听见,API,调用jdk的API啥的,而API大家应该都知道,(Application Programming Interface),我蹩脚的英文也能知道是应用程序接口,也就是程序员,写了一段代码,制定了这个接口,而且完成了对接口的实现。它的特点是调用方仅仅依赖接口调用,且无权选择不同的实现。调用过jdk的一些api的,应该都很熟悉。SPI(Service Provider Interface),服务提供接口.SPI的思想就和API.
2021-04-30 22:28:56
172
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人