日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring源码学习笔记1

發布時間:2025/4/16 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring源码学习笔记1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.Spring中最核心的兩個類

1)DefaultListableBeanFactory

  XmlBeanFactory繼承自DefaultListableBeanFactory,DefaultListableBeanFactory是整個bean加載的核心部分,是Spring加載及注冊bean的默認實現

2)XmlBeanDefinitionReader

2.示例代碼

BeanFactory bf=new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));

XmlBeanFactory.class
public
class XmlBeanFactory extends DefaultListableBeanFactory {private final XmlBeanDefinitionReader reader;public XmlBeanFactory(Resource resource) throws BeansException {this(resource, (BeanFactory)null);}public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {super(parentBeanFactory);this.reader = new XmlBeanDefinitionReader(this);this.reader.loadBeanDefinitions(resource);} }
public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
return this.loadBeanDefinitions(new EncodedResource(resource));
}
public int loadBeanDefinitions(EncodedResource encodedResource){
....  

  InputSource inputSource = new InputSource(inputStream);//通過SAX方式解析XML文件
....
  this.doLoadBeanDefinitions(inputSource, encodedResource.getResource());

} ? ?

3.配置文件的封裝

Resource implements InputStreamResource

?

4.AbstractAutowireCapableBeanFactory.ignoreDependencyInterface()

忽略給定接口的自動裝配功能

5.加載Bean

protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException {try {int validationMode = this.getValidationModeForResource(resource);//獲取xml文件的驗證模式 Document doc = this.documentLoader.loadDocument(inputSource, this.getEntityResolver(), this.errorHandler, validationMode, this.isNamespaceAware());//加載XML文件return this.registerBeanDefinitions(doc, resource);//返回注冊bean的信息} catch (BeanDefinitionStoreException var5) {throw var5;} catch (SAXParseException var6) {throw new XmlBeanDefinitionStoreException(resource.getDescription(), "Line " + var6.getLineNumber() + " in XML document from " + resource + " is invalid", var6);} catch (SAXException var7) {throw new XmlBeanDefinitionStoreException(resource.getDescription(), "XML document from " + resource + " is invalid", var7);} catch (ParserConfigurationException var8) {throw new BeanDefinitionStoreException(resource.getDescription(), "Parser configuration exception parsing XML from " + resource, var8);} catch (IOException var9) {throw new BeanDefinitionStoreException(resource.getDescription(), "IOException parsing XML document from " + resource, var9);} catch (Throwable var10) {throw new BeanDefinitionStoreException(resource.getDescription(), "Unexpected exception parsing XML document from " + resource, var10);}}

1)獲取xml文件的驗證模式

getValidationModeForResource(resource); protected int getValidationModeForResource(Resource resource) {
int validationModeToUse = this.getValidationMode();
if (validationModeToUse != 1) {
return validationModeToUse;
} else {
      //如果沒有設定模式則進行自動檢測模式
int detectedMode = this.detectValidationMode(resource);
return detectedMode != 1 ? detectedMode : 3;
}
} protected int detectValidationMode(Resource resource) {if (resource.isOpen()) {throw new BeanDefinitionStoreException("Passed-in Resource [" + resource + "] contains an open stream: " + "cannot determine validation mode automatically. Either pass in a Resource " + "that is able to create fresh streams, or explicitly specify the validationMode " + "on your XmlBeanDefinitionReader instance.");} else {InputStream inputStream;try {inputStream = resource.getInputStream();} catch (IOException var5) {throw new BeanDefinitionStoreException("Unable to determine validation mode for [" + resource + "]: cannot open InputStream. " + "Did you attempt to load directly from a SAX InputSource without specifying the " + "validationMode on your XmlBeanDefinitionReader instance?", var5);}try {
          //將自動檢測模式委托給了
XmlValidationModeDetector類
           return this.validationModeDetector.detectValidationMode(inputStream);
       }
catch (IOException var4) {
          throw new BeanDefinitionStoreException("Unable to determine validation mode for [" + resource + "]: an error occurred whilst reading from the InputStream.", var4);
       }
     }
  }

?

2)加載XML文件,并得到對應的Document

委托給DocumentLoader類

EntityResolver的用法

EntityResolver的作用是項目本身就可以提供一個如何尋找DTD聲明的方法,即由程序來實現尋找DTD聲明的過程,比如我們將DTD文件放到項目中某處,在實現時直接將此文檔讀取并返回給SAX即可。這樣就避免了通過網絡來尋找相應的聲明。

驗證文件默認的加載方式是通過URL進行網絡下載獲取,這樣會造成延遲,用戶體驗也不好,一般的做法都是將驗證文件放在自己的工程里。

public interface EntityResolver {public abstract InputSource resolveEntity (String publicId,String systemId)throws SAXException, IOException;}

3)返回注冊bean的信息

public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
      //單一職責原則BeanDefinitionDocumentReader documentReader
= this.createBeanDefinitionDocumentReader();documentReader.setEnvironment(this.getEnvironment());int countBefore = this.getRegistry().getBeanDefinitionCount();
      //加載及注冊beandocumentReader.registerBeanDefinitions(doc,
this.createReaderContext(resource));return this.getRegistry().getBeanDefinitionCount() - countBefore;} public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {this.readerContext = readerContext;this.logger.debug("Loading bean definitions");Element root = doc.getDocumentElement();this.doRegisterBeanDefinitions(root);} 解析并注冊BeanDefinitions
protected
void doRegisterBeanDefinitions(Element root) {String profileSpec = root.getAttribute("profile");if (StringUtils.hasText(profileSpec)) {Assert.state(this.environment != null, "Environment must be set for evaluating profiles");String[] specifiedProfiles = StringUtils.tokenizeToStringArray(profileSpec, ",; ");if (!this.environment.acceptsProfiles(specifiedProfiles)) {return;}}BeanDefinitionParserDelegate parent = this.delegate;this.delegate = this.createHelper(this.readerContext, root, parent);this.preProcessXml(root);//模板方法模式this.parseBeanDefinitions(root, this.delegate);this.postProcessXml(root);this.delegate = parent;}

?

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {if (delegate.isDefaultNamespace(root)) {NodeList nl = root.getChildNodes();for(int i = 0; i < nl.getLength(); ++i) {Node node = nl.item(i);if (node instanceof Element) {Element ele = (Element)node;if (delegate.isDefaultNamespace(ele)) {this.parseDefaultElement(ele, delegate);//處理默認Bean聲明} else {delegate.parseCustomElement(ele);//處理自定義Bean聲明}}}} else {delegate.parseCustomElement(root);}}

?

轉載于:https://www.cnblogs.com/lvjygogo/p/8974506.html

總結

以上是生活随笔為你收集整理的Spring源码学习笔记1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。