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