如何实现一个简易版的 Spring - 如何实现 @Component 注解 (5)

这一步其实并不需要再修改创建 Bean 的代码了,创建的逻辑都是一样的,只需要将之前读取 XML 配置文件那里使用上文提到的扫描器 ClassPathBeanDefinitionScanner 扫描并注册到 BeanFactory 中即可,读取配置文件的 XmlBeanDefinitionReader 类的读取解析配置文件的方法修改如下:

public void loadBeanDefinition(Resource resource) { try (InputStream is = resource.getInputStream()) { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(is); Element root = document.getRootElement(); // <beans> Iterator<Element> iterator = root.elementIterator(); while (iterator.hasNext()) { Element element = iterator.next(); String namespaceUri = element.getNamespaceURI(); if (this.isDefaultNamespace(namespaceUri)) { parseDefaultElement(element); } else if (this.isContextNamespace(namespaceUri)) { parseComponentElement(element); } } } catch (DocumentException | IOException e) { throw new BeanDefinitionException("IOException parsing XML document:" + resource, e); } } private void parseComponentElement(Element element) { String basePackages = element.attributeValue(BASE_PACKAGE_ATTRIBUTE); // 读取指定包路径下的类转换为 BeanDefinition 并注册到 BeanFactory 中 ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry); scanner.doScanAndRegistry(basePackages); }

到这里实现 @Component 注解的主要流程已经介绍完毕,完整代码已上传至仓库 GitHub 。

总结

本文主要介绍了实现 @Component 注解的主要流程,以上只是实现的最简单的功能,但是基本原理都是类似的,有问题欢迎留言讨论。下篇预告:如何实现 @Autowried 注解

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjyjz.html