首页 > 编程语言 > 详细

Spring之IOC容器的加载过程

时间:2020-04-09 17:09:27      阅读:508      评论:0      收藏:0      [点我收藏+]

1.IOC容器的加载

技术分享图片

 

 

 

1 ClassPathResource classPathResource=new ClassPathResource("spring-mvc.xml");
2         DefaultListableBeanFactory factory=new DefaultListableBeanFactory();
3         XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(factory);
4         reader.loadBeanDefinitions(classPathResource);

 

  1 //IOC 容器加载的核心方法
  2 public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
  3                  try {
  4                 InputStream inputStream = encodedResource.getResource().getInputStream();
  5                 try {
  6                     //一:读取xml文件
  7                     InputSource inputSource = new InputSource(inputStream);
  8                     if (encodedResource.getEncoding() != null) {
  9                         inputSource.setEncoding(encodedResource.getEncoding());
 10                     }
 11                      //二:加载 beanefinition
 12                     var5 = this.doLoadBeanDefinitions(inputSource, encodedResource.getResource());
 13                 } finally {
 14                     inputStream.close();
 15                 }
 16             } 
 17 
 18             return var5;
 19         }
 20     }
 21 
 22 
 23 protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException {
 24         try {
 25              //一 1) 将xml文件转换为document
 26             Document doc = this.doLoadDocument(inputSource, resource);
 27             return this.registerBeanDefinitions(doc, resource);
 28 }
 29 }
 30 
 31            //一 2) 开始执行
 32   public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
 33         this.readerContext = readerContext;
 34         this.logger.debug("Loading bean definitions");
 35         Element root = doc.getDocumentElement();
 36         this.doRegisterBeanDefinitions(root);
 37     }
 38 
 39  protected void doRegisterBeanDefinitions(Element root) {
 40        
 41         this.preProcessXml(root);
 42       //三 解析Element 获取xml内容
 43         this.parseBeanDefinitions(root, this.delegate);
 44         this.postProcessXml(root);
 45         this.delegate = parent;
 46     }
 47     //解析Element 得到node 判断node内容
 48  protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
 49         if (delegate.isDefaultNamespace(root)) {
 50             NodeList nl = root.getChildNodes(); 
 52             for(int i = 0; i < nl.getLength(); ++i) {
 53                 Node node = nl.item(i);
 54                 if (node instanceof Element) {
 55                     Element ele = (Element)node;
 56                     if (delegate.isDefaultNamespace(ele)) {
 57                       //读取document的内容
 58                         this.parseDefaultElement(ele, delegate);
 59                     } else {
 60                         delegate.parseCustomElement(ele);
 61                     }
 62                 }
 63             }
 64         } else {
 65             delegate.parseCustomElement(root);
 66         }
 67 
 68     }
 69 
 70       //四 判断xml中(document中节点的类型)
 71 private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
 72         if (delegate.nodeNameEquals(ele, "import")) {
 73             this.importBeanDefinitionResource(ele);
 74         } else if (delegate.nodeNameEquals(ele, "alias")) {
 75             this.processAliasRegistration(ele);
 76         } else if (delegate.nodeNameEquals(ele, "bean")) {
//五 载入beanDefinition
77 this.processBeanDefinition(ele, delegate); 78 } else if (delegate.nodeNameEquals(ele, "beans")) { 79 this.doRegisterBeanDefinitions(ele); 80 } 81 82 } 83 protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { 84 BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); 85 if (bdHolder != null) { 86 bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder); 87 88 try { 89 BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, this.getReaderContext().getRegistry()); 90 } catch (BeanDefinitionStoreException var5) { 91 this.getReaderContext().error("Failed to register bean definition with name ‘" + bdHolder.getBeanName() + "‘", ele, var5); 92 } 93 94 this.getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder)); 95 } 96 97 } 98 //六 注册 BeanDefinitionReaderUtils 99 public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException { 100 //获取bean的名称 101 String beanName = definitionHolder.getBeanName(); 102 // 注册bean 并将bean放入到ioc容器里面 103 registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); 104 String[] aliases = definitionHolder.getAliases(); 105 if (aliases != null) { 106 String[] var4 = aliases; 107 int var5 = aliases.length; 108 109 for(int var6 = 0; var6 < var5; ++var6) { 110 String alias = var4[var6];
111 //七 加载其他信息 如:是否是单例,是否允许重载 是否是abstract 类等 112 registry.registerAlias(beanName, alias); 113 } 114 } 115 116 } 117 //DefaultListableBeanFactory 118 public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException { 119 Assert.hasText(beanName, "Bean name must not be empty"); 120 Assert.notNull(beanDefinition, "BeanDefinition must not be null"); 121 if (beanDefinition instanceof AbstractBeanDefinition) { 122 try { 123 ((AbstractBeanDefinition)beanDefinition).validate(); 124 } catch (BeanDefinitionValidationException var9) { 125 throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName, "Validation of bean definition failed", var9); 126 } 127 } 128 //bean 已经存在 129 BeanDefinition existingDefinition = (BeanDefinition)this.beanDefinitionMap.get(beanName); 130 if (existingDefinition != null) { 131 //不允许覆盖 报异常 132 if (!this.isAllowBeanDefinitionOverriding()) { 133 throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName, "Cannot register bean definition [" + beanDefinition + "] for bean ‘" + beanName + "‘: There is already [" + existingDefinition + "] bound."); 134 } 137 this.beanDefinitionMap.put(beanName, beanDefinition); 138 } else { 139 if (this.hasBeanCreationStarted()) { 140 Map var4 = this.beanDefinitionMap; 141 synchronized(this.beanDefinitionMap) { 142 //将bean放入容器 143 this.beanDefinitionMap.put(beanName, beanDefinition); 144 List<String> updatedDefinitions = new ArrayList(this.beanDefinitionNames.size() + 1); 145 updatedDefinitions.addAll(this.beanDefinitionNames); 146 updatedDefinitions.add(beanName); 147 this.beanDefinitionNames = updatedDefinitions; 148 if (this.manualSingletonNames.contains(beanName)) { 149 Set<String> updatedSingletons = new LinkedHashSet(this.manualSingletonNames); 150 updatedSingletons.remove(beanName); 151 this.manualSingletonNames = updatedSingletons; 152 } 153 } 154 } else { 155 this.beanDefinitionMap.put(beanName, beanDefinition); 156 this.beanDefinitionNames.add(beanName); 157 this.manualSingletonNames.remove(beanName); 158 } 159 160 this.frozenBeanDefinitionNames = null; 161 } 162 163 if (existingDefinition != null || this.containsSingleton(beanName)) { 164 this.resetBeanDefinition(beanName); 165 } 166 167 }

2.BeanDefinition是什么?

是一个接口,里面定义了一些bean的元数据,如beanName,score等

3.类图

 

Spring之IOC容器的加载过程

原文:https://www.cnblogs.com/fanBlog/p/12667285.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!