ImageVerifierCode 换一换
格式:DOCX , 页数:42 ,大小:431.38KB ,
资源ID:17898403      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17898403.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Spring源码解析beanfactoryWord格式文档下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Spring源码解析beanfactoryWord格式文档下载.docx

1、 return testStr; public void setTestStr(String testStr) beans xmlns=http:/www.springframework.org/schema/beans xmlns:xsi=/www.w3.org/2001/XMLSchema-instancecontext=/www.springframework.org/schema/context xsi:schemaLocation=/www.springframework.org/schema/beans /bean/beansuml类图上次看的时候就画过这个图,这次做了细化和调整。

2、XmlBeanFactory继承关系AliasRegistry定义对Alias的简单增删改等操作;SimpleAliasRegistry使用currenthashmap作为缓存,并对接口AliasRegisty进行实现;SingletonBeanRegistry定义对单例的获取及获取;DefaultSingletonBeanRegistry是SingletonBeanRegistry的实现;FactoryBeanRegistrySupport在DefaultSingletonBeanRegistry基础上,增加对FactorBean的特殊处理功能;BeanFactory定义获取bean及bea

3、n的各种属性;HierarchicalBeanFactory继承BeanFactory,增加对parentFactory的支持;ConfigurableBeanFactory提供配置各种factory的方法;ListableBeanFactory根据不同条件获取bean的配置清单;AutowireCapableBeanFactory提供创建bean,自动注入,初始化已经应用bean后的处理器;AbstractBeanFactory综合FactoryBeanRegistrySupport和ConfigurableBeanFactory功能;ConfigurableListableBeanFact

4、ory是BeanFactory的配置清单,指定忽略类型和接口等;AbstractAutowireCapableBeanFactory综合AbstractBeanFactory并对接口AutowireCapalbeBeanFactory的实现;BeanDefinitionRegistry定义对BeanDefinition的curd操作;DefaultListableBeanFactory综合所有功能,主要是bean注册后的处理;XmlBeanFactory对DefaultListableBeanFactory类进行了扩展,主要是从xml文档读取BeanDefinition,对于注册以及获取Bea

5、n都是从父类DefaultLisstableBean继承的方法去实现,与父类的不同就是增加了XmlBeanDefinitionReader类型的reader属性,在XmlBeanFactory中主要使用reader属性对资源文件进行读取和注册;XmlBeanDefinitionReaderEnvironmentCapable定义获取Environment的方法;BeanDefinitionReader主要定义资源文件读取并转化为BeanDefinition的各种功能;AbstractBeanDefinitionReader对接口的实现;ResourceLoader资源加载器,根据给定的资源文件

6、地址返回对应的Resource;DocumentLoader资源文件转化为Document的功能;BeanDefinitionDocumentReader读取Document并注册BeanFinition的功能;BeanDefinitionParserDelegate定义解析element的各种方法;BeanDefinitionBeanDefinition配置文件bean元素在容器的内部表现形式;ChildBeanDefinition父子bean中的子bean;GenericBeanDefinition2.5后加入,一站式的服务类;RootBeanDefinition对应一般性的bean元素标

7、签,父子bean中的父bean可以用此表示,没有父bean的bean也使用来表示;xml解析beanDefinitionBeanFactory ctx = new XmlBeanFactory(new ClassPathResource(资源文件抽象new ClassPathResource()spring将外部的资源封装成内部使用Resource,可以从文件,class,jar,还有context上下文:我这里使用ClassPathResource加载spring文件,当然也可以使用FileSystemResource从文件系统路径加载。loadBeanDefinitionnew XmlBe

8、anFactory(new ClassPathResource(调用XmlBeanFactory构造/ XmlBeanFactorypublic XmlBeanFactory(Resource resource) throws BeansException this(resource, null);public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException super(parentBeanFactory); this.reader.loadBeanDefinition

9、s(resource);在条用super的时候会设置parentBeanFactory,好像只要mvc的时候才看到设置,其他地方基本没用到。/AbstractAutowireCapableBeanFactorypublic AbstractAutowireCapableBeanFactory(BeanFactory parentBeanFactory) this(); setParentBeanFactory(parentBeanFactory);public AbstractAutowireCapableBeanFactory() super(); /忽略一些依赖,在getbean的时候,在

10、实例化属性填充后,会检查设置这些依赖关系, /然后再去调用实现InitializingBean的afterPropertiesSet方法和自定义的Init-Method ignoreDependencyInterface(BeanNameAware.class); ignoreDependencyInterface(BeanFactoryAware.class); ignoreDependencyInterface(BeanClassLoaderAware.class);/AbstractBeanFactorypublic void setParentBeanFactory(BeanFacto

11、ry parentBeanFactory) if (this.parentBeanFactory != null & this.parentBeanFactory != parentBeanFactory) throw new IllegalStateException(Already associated with parent BeanFactory: + this.parentBeanFactory); this.parentBeanFactory = parentBeanFactory;在这些完了后会调用/xmlbeanfactorythis.reader.loadBeanDefini

12、tions(resource);XmlBeanFactory使用XmlBeanDefinitionReader来解析和注册bean定义。/XmlBeanDefinitionReaderpublic int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException /EncodedResource做了编码处理,getReader时如果有编码就使用,没有就不适用 return loadBeanDefinitions(new EncodedResource(resource);public int loadB

13、eanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException . try InputStream inputStream = encodedResource.getResource().getInputStream(); InputSource inputSource = new InputSource(inputStream); if (encodedResource.getEncoding() != null) inputSource.setEncoding(encodedResour

14、ce.getEncoding(); return doLoadBeanDefinitions(inputSource, encodedResource.getResource(); finally inputStream.close();看了下,spring中习惯doXXX来表示真正干活的代码,XXX来做主流程控制。自己写代码的时候有时流程会不清晰,会乱,后来还是从spring里面学会这招,先提炼主流程,然后再分配。protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws Bea

15、nDefinitionStoreException int validationMode = getValidationModeForResource(resource); Document doc = this.documentLoader.loadDocument( inputSource, getEntityResolver(), this.errorHandler, validationMode, isNamespaceAware(); return registerBeanDefinitions(doc, resource);xml文件校验和解析int validationMode

16、= getValidationModeForResource(resource);xml文档的2种校验方式:DTD和XSD,通过getValidationModeForResource来获取,DTD的会包含DOCTYPE,所以通过解析这个是否存在判断。校验过后就是通过DefaultDocumentLoader将xml文件解析Document,xml文件解析一般就是SAX、Dom、jdom,dom4j。registerBeanDefinitionspublic int registerBeanDefinitions(Document doc, Resource resource) throws

17、BeanDefinitionStoreException /将DefaultBeanDefinitionDocumentReader转为BeanDefinitionDocumentReader BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader(); /this.getEnvironment()获取到的是StandardEnvironment,可以用来获取系统变量和环境变量 documentReader.setEnvironment(this.getEnvironment(); int

18、 countBefore = getRegistry().getBeanDefinitionCount(); /使用DefaultBeanDefinitionDocumentReader解析document documentReader.registerBeanDefinitions(doc, createReaderContext(resource); return getRegistry().getBeanDefinitionCount() - countBefore;protected XmlReaderContext createReaderContext(Resource resou

19、rce) if (this.namespaceHandlerResolver = null) /DefaultNamespaceHandlerResolver,主要用来获取标签的解析, /特别是自定义标签的解析,后面单独讲下这个,里面最重要的方法NamespaceHandler resolve(String namespaceUri) this.namespaceHandlerResolver = createDefaultNamespaceHandlerResolver(); return new XmlReaderContext(resource, this.problemReporter

20、, this.eventListener, this.sourceExtractor, this, this.namespaceHandlerResolver);最终还是委托DefaultBeanDefinitionDocumentReader来解析Document。/DefaultBeanDefinitionDocumentReaderpublic void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) this.readerContext = readerContext; logger.debug

21、(Loading bean definitions Element root = doc.getDocumentElement(); doRegisterBeanDefinitions(root);protected void doRegisterBeanDefinitions(Element root) /profile属性,类似maven -p,可以定义不同环境下的bean定义,配合环境变量spring.profiles.active使用 String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE); if (StringUtils.h

22、asText(profileSpec) Assert.state(this.environment != null, environment property must not be null String specifiedProfiles = StringUtils.tokenizeToStringArray(profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS); if (!this.environment.acceptsProfiles(specifiedProfiles) return;

23、/ any nested elements will cause recursion in this method. In / order to propagate and preserve default-* attributes correctly, / keep track of the current (parent) delegate, which may be null. Create / the new (child) delegate with a reference to the parent for fallback purposes, / then ultimately

24、reset this.delegate back to its original (parent) reference. / this behavior emulates a stack of delegates without actually necessitating one. BeanDefinitionParserDelegate parent = this.delegate; / BeanDefinitionParserDelegate this.delegate = createHelper(readerContext, root, parent); preProcessXml(

25、root); /子类实现 parseBeanDefinitions(root, this.delegate); postProcessXml(root); this.delegate = parent;protected BeanDefinitionParserDelegate createHelper(XmlReaderContext readerContext, Element root, BeanDefinitionParserDelegate parentDelegate) BeanDefinitionParserDelegate delegate = new BeanDefiniti

26、onParserDelegate(readerContext, environment); delegate.initDefaults(root, parentDelegate); return delegate;/BeanDefinitionParserDelegatepublic void initDefaults(Element root, BeanDefinitionParserDelegate parent) populateDefaults(this.defaults, (parent != null ? parent.defaults : null), root); this.r

27、eaderContext.fireDefaultsRegistered(this.defaults);/收集一些默认属性protected void populateDefaults(DocumentDefaultsDefinition defaults, DocumentDefaultsDefinition parentDefaults, Element root) String lazyInit = root.getAttribute(DEFAULT_LAZY_INIT_ATTRIBUTE); if (DEFAULT_VALUE.equals(lazyInit) lazyInit = pa

28、rentDefaults ! parentDefaults.getLazyInit() : FALSE_VALUE; defaults.setLazyInit(lazyInit); String merge = root.getAttribute(DEFAULT_MERGE_ATTRIBUTE); if (DEFAULT_VALUE.equals(merge) merge = parentDefaults ! parentDefaults.getMerge() : defaults.setMerge(merge); String autowire = root.getAttribute(DEFAULT_AUTOWIRE_ATTRIBUTE); if (DEFAULT_VALUE.equals(au

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1