问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

spring低版本源码?

发布网友 发布时间:2024-10-04 14:36

我来回答

1个回答

热心网友 时间:2024-10-21 15:31

如何查看spring源码

1.准备工作:在官网上下载了Spring源代码之后,导入Eclipse,以方便查询。

2.打开我们使用Spring的项目工程,找到Web.xml这个网站系统配置文件,在其中找到Spring的初始化信息:

listener

listener-classorg.springframework.web.context.ContextLoaderListener/listener-class

/listener

由配置信息可知,我们开始的入口就这里ContextLoaderListener这个监听器。

在源代码中我们找到了这个类,它的定义是:

publicclassContextLoaderListenerextendsContextLoader

implementsServletContextListener{

/**

*Initializetherootwebapplicationcontext.

*/

publicvoidcontextInitialized(ServletContextEventevent){

this.contextLoader=createContextLoader();

if(this.contextLoader==null){

this.contextLoader=this;

}

this.contextLoader.initWebApplicationContext(event.getServletContext());

}

...

}

该类继续了ContextLoader并实现了监听器,关于Spring的信息载入配置、初始化便是从这里开始了,具体其他阅读另外写文章来深入了解。

二、关于IOC和AOP

关于SpringIOC网上很多相关的文章可以阅读,那么我们从中了解到的知识点是什么?

1)IOC容器和AOP切面依赖注入是Spring是核心。

IOC容器为开备银发者管理对象之间的依赖关系提供了便利和基础服务,其中Bean工厂(BeanFactory)和上下文(ApplicationContext)就是IOC的表现形式。BeanFactory是个接口类,只是对容器提供的最基本服务提供了定义,而DefaultListTableBeanFactory、XmlBeanFactory、ApplicationContext等都是具体的实现。

接口:

publicinterfaceBeanFactory{

//这里是对工厂Bean的转义定义,因为如果使用bean的名字检索IOC容器得到的对象是工厂Bean生成的对象,

//如果需要得到工厂Bean本身,需要使用转义的名字来向IOC容器检索

StringFACTORY_BEAN_PREFIX="";

//这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就象一个大的抽象工厂,用户可以根据名字得到需要的bean

//在Spring中,Bean和普通的JAVA对象老前不同在于:

//Bean已经包含了我们在Bean定义信息中的依赖关系的处理,同时Bean是已经被放到IOC容器中进行管理了,有它侍滚清自己的生命周期

ObjectgetBean(Stringname)throwsBeansException;

//这里根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:如果根名字取得的bean实例的Class类型和需要的不同的话。

ObjectgetBean(Stringname,ClassrequiredType)throwsBeansException;

//这里提供对bean的检索,看看是否在IOC容器有这个名字的bean

booleancontainsBean(Stringname);

//这里根据bean名字得到bean实例,并同时判断这个bean是不是单件,在配置的时候,默认的Bean被配置成单件形式,如果不需要单件形式,需要用户在Bean定义信息中标注出来,这样IOC容器在每次接受到用户的getBean要求的时候,会生成一个新的Bean返回给客户使用-这就是Prototype形式

booleanisSingleton(Stringname)throwsNoSuchBeanDefinitionException;

//这里对得到bean实例的Class类型

ClassgetType(Stringname)throwsNoSuchBeanDefinitionException;

//这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来

String[]getAliases(Stringname);

}

实现:

XmlBeanFactory的实现是这样的:

publicclassXmlBeanFactoryextendsDefaultListableBeanFactory{

//这里为容器定义了一个默认使用的bean定义读取器,在Spring的使用中,Bean定义信息的读取是容器初始化的一部分,但是在实现上是和容器的注册以及依赖的注入是分开的,这样可以使用灵活的bean定义读取机制。

privatefinalXmlBeanDefinitionReaderreader=newXmlBeanDefinitionReader(this);

//这里需要一个Resource类型的Bean定义信息,实际上的定位过程是由Resource的构建过程来完成的。

publicXmlBeanFactory(Resourceresource)throwsBeansException{

this(resource,null);

}

//在初始化函数中使用读取器来对资源进行读取,得到bean定义信息。这里完成整个IOC容器对Bean定义信息的载入和注册过程

publicXmlBeanFactory(Resourceresource,BeanFactoryparentBeanFactory)throws

BeansException{

super(parentBeanFactory);

this.reader.loadBeanDefinitions(resource);

}

Spring源码解析(二)-标签解析

????默认标签的解析是在parseDefaultElement函数中进行,销弊函数中的功能分别对4中标签(import、alias、bean、beans)做了不同的解析。其中bean标签的解析最为复杂也最为重要。

????默认的beanName初始为bean的id,若name存在为name,如果不存在beanName,那么根据Spring中提供的命名规则为当前bean生成对应的beanName.

????用于属性承载的BeanDefinition是一个接口,在Spring中存在三种实现:RootBeanDefinition、ChildBean-Definition以及GenericBeanDefinition,三种实现均继承了AbstractBeanDefinition。

????其中BeanDefinition是配置文件bean元素标签在容器中的内部表示形式。bean元素标签拥有class,scope,lazy-init等配置属性,BeanDefinition则提供了相应的beanClass,scope,lazyInit属性,BeanDefinition和bean中的属性一一对应。

????RootBeanDefinition是最为常用的实现类,对应一般性的bean标签;GenericBeanDefinition是2.5版本加碰雀入的bean文件配置属性定义类,是一站式服务类。

????解析默认标签中的自定义标签元素,首先是获取属性或者元素的命名空间,以此来判断该元素或者属性是否适用于自定义标签的解析条件,找出自定义类笑斗早型所对应的命名空间处理器并进行进一步的解析。自定义标签元素在默认标签中实际上就是属性。

????BeanDefinition的注册分为两部分:beanName、别名。注册完成之后通知监听器已经注册完成。

???在对bean进行定义时,除了使用id属性来指定名称,为了提供多个名称,可以使用alias标签来指定,所有名称都指向同一个bean。增加别名可以方便不同对象来调用。

import标签主要用于导入其他配置文件。

????类似于import标签的解析,是递归调用beans的解析过程。

????前言提到Spring根据命名空间来区分是默认标签与自定义标签。在很多情况下,我们需要为系统提供可配置化的支持,通过Spring提供的可扩展Schema的支持(XSD)来实现想要的配置。常见的自定义标签为事务标签(tx:annotation-driven)

Spring源码分析(一)XmlWebApplicationContext

spring是大家都会用的ioc框架,但是要真的了解spring还是需要好好研究一下才行,为此看了一些spring源码,所以开始写spring源码分析的文章,这个是第一篇,先从ioc容器的启动开始。

我们都御散知道,spring的ioc容器的最基本的接口就是BeanFactory,而ApplicationContext是包含了BeanFactory的所有信息,所以ioc容器在启动的时候就是从AbstractApplicationContext的refresh方法开始的

具体的启动流程就不说了,主要是这里有一个onRefresh方法,我们来看AbstractRefreshableWebApplicationContext这个类,在这个类中覆写了onRefresh方法

这是什么东西?别急,我们来看看themeSource是什么。

还是不太明白?那镇汪氏我们来看看AbstractRefreshableWebApplicationContext的结构

原来ThemeSource是一个接口,而AbstractRefreshableWebApplicationContext则实现了这个接口,在onRefresh把自己传进去了,好吧,这块就先看到这里。

我们直接到XmlWebApplicationContext这个类里,我们发现AbstractRefreshableApplicationContext类有一个方法loadBeanDefinitions,而XmlWebApplicationContext覆写了这个方法,我们来看看XmlWebApplicationContext是怎么实现的

这里我们要介绍ioc容器里的一个接口BeanDefinitionReader,而XmlBeanDefinitionReader是BeanDefinitionReader的一个实现类,负责对xml的配置文件进行读取,并放到ioc容器中。当读取完配置文件后,通过loadBeanDefinitions方法陵旅将bean注册到ioc容器中。

至此,ioc容器就启动完成。

XmlWebApplicationContext的分析就到这里了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
上市就跌的股票为什么 为什么新股都会暴跌 为什么新股上市都跌 身上有烧伤的伤疤怎么去除 石榴皮发霉还能吃吗?新鲜石榴的保存方法有哪些? 5岁上瑞思和英孚哪个好 瑞思和英孚哪个好?上过课后来说说各自的优缺点 瑞思和英孚哪个好?上过课后来分享各自的优缺点 怎么当历史老师 中学历史老师需求状况 ...发现牙龈肿的很高,碰一下很痛,好像发炎了,大家有没有好办法... 牙龈经常发炎的治疗方法有哪些 昨天三星s5下水,今天摄像头雾化是防水有问题吗? 三星8552摄像头进水了,照相会模糊吗 索尼T300相机一般拍摄尺寸选多大的效果会好些,我怎么总感觉照出来有点... 铁观音可以减肥吗铁观音的十种作用与功效及其冲泡方法 非师范类的可以考编吗? 非师范类考教师证的条件是什么 室内设计师和造价工程师相比较哪个薪水更高? 企业法人营业执照上的组织机构代码 企业组织机构代码是什么 借条期限五年到期起诉有效吗 宜宾有哪些餐厅值得一去? 宜宾熏肉在制作时需要注意什么? 把宜宾熏肉做得好吃的诀窍有哪些? (16分)迪迪·艾伦年轻时到一家电影公司打工,跟着知名电影剪辑师罗伯特... 从打碎花瓶这一现象中所概括出的"碎花瓶理论"为什么能帮助人们恢复文物... ...如下(这个世界上没有真正的错误,只有被忽略的智慧” 迪迪·艾伦年轻... 旺山公园有一个长90米,宽60米的长方形池塘, 暖暖环游世界现实交错花园1-5S高分搭配攻略介绍_暖暖环游世界现实交错花 ... 梦见三芒草属的预兆 梦见藏布杜鹃的预兆 梦见羽毛三芒草的预兆 ...里面鼓鼓的,还有一些耳鸣是怎么回事,怎么才能治好_百度拇指医生 我在eclipse导入的时候报错了 import com.transdt.core.crawljob.Requ... 谢菲尔德星期三足球俱乐部 sheff weds是什么足球队 什么是牙周膜息肉 牙周膜息肉是什么病 月季最香的花 最香的月季花(排行) 盘点10个最香的月季花品种 指甲下方(大概就是镶指甲的..肉吧)无故肿起来,没有划伤等等,按了... 宝宝手指长倒刺如何护理 牙周粘膜病科是做什么的 牙周病科是治疗什么的 牙体科和牙周科的区别 惨痛经历宫颈糜烂做了LEEP手术后后悔至极 利普刀治疗宫颈糜烂效果好吗? 谢菲尔德足球俱乐部的基本概况 最早的足球俱乐部 如果我是90后,那我该怎么跟80.70后沟通,有哪些主题?