创意电子

标题: 绝对干货!Spring框架源码剖析附步调 [打印本页]

作者: 五毛猿    时间: 2021-10-14 20:53
标题: 绝对干货!Spring框架源码剖析附步调
Spring框架源码剖析01-(xml设置剖析)

环境: spring5.X + idea
Spring 是一个工厂,是一个负责对象的创建和维护的工厂。它给我提供了一个功能齐备而且方便我们使用的ApplicationContext子接口,它最底层的接口是BeanFactory。在这个BeanFactory下面衍生了各种功能的子接口。
容器管理HierarchicalBeanFatory
主动注入AutowireCapableBeanFactory
读取设置信息ListableBeanFactory
可以自行找一下BeanFactory类关系图,它有一个子实现类XmlBeanFactory,先说一下XML设置文件的读取
ListableBeanFactory 是读取设置信息的,它的子实现类XmlBeanFactory就是读取xml文件的具体实现。而ApplicationContext继承了ListableBeanFactory并对xml剖析做了进一步的封装所以再我们使用ApplicationContext时直接给他一个对应位置的资源文件名它就会帮我们读取到设置信息。ApplicationContext ctx = new ClassPathXmlApplicatiionContext("applicationContext.xml");User user = ctx.getBean("user"); //我们直接用最底层的接口 BeanFactory 获取xml信息BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));User user = bf.getBean("user");说明:

InputStream getInputStream() throws IOException;而ClassPathResource 对这个方法的实现就是通过类大概类加载器实现的
if (this.clazz != null) {        is = this.clazz.getResourceAsStream(this.path);}else if (this.classLoader != null) {        is = this.classLoader.getResourceAsStream(this.path);}获取了输入流那就自然可以获取文件的内容了。
2.Spring获取xml内容后通过XmlBeanDefinitionReader剖析设置文件的内容封装成BeanDefinition方便后续使用。
/前边说了是XmlBeanFactory具体实现获取xml信息的功能1. public class XmlBeanFactory extends DefaultListableBeanFactory {    //xmlBeanFactory 中直接实例化 xmlBeanDefinitionReader        private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);.....        public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {                super(parentBeanFactory);                this.reader.loadBeanDefinitions(resource);        }  }2. public class XmlBeandefinitionReader extends AbstractBeanDefinitionReader{        public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {                ......                try (                        //获取输入流                        InputStream inputStream = encodedResource.getResource().getInputStream()) {                        //xml 剖析工具类                          InputSource inputSource = new InputSource(inputStream);                        if (encodedResource.getEncoding() != null) {                                inputSource.setEncoding(encodedResource.getEncoding());                        }                        //开始具体剖析                        return doLoadBeanDefinitions(inputSource, encodedResource.getResource());                }                ......        };                        protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)                throws BeanDefinitionStoreException {                try {                        // xml 剖析为 document                         Document doc = doLoadDocument(inputSource, resource);                        // document 转 beanDefinition                        int count = registerBeanDefinitions(doc, resource);                        if (logger.isDebugEnabled()) {                                logger.debug("Loaded " + count + " bean definitions from " + resource);                        }                        return count;                }        }   }3. public class DefaultBeanDefinitionDocumentReader implements BeanDefinitionDocumentReader {           protected void doRegisterBeanDefinitions(Element root){                   ...                   preProcessXml(root);                   parseBeanDefinitions(root,this,dalegate);                   postProcessXml(root);           };        protected void parseBeanDefinitions(Element root,BeanDefinitionParseDelegate 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)) {                                                //剖析根本标签                                                parseDefaultElement(ele, delegate);                                        }                                        else {                                                //剖析自定义标签                                                delegate.parseCustomElement(ele);                                        }                                }                        }                }        }           }解释说明:





欢迎光临 创意电子 (https://wxcydz.cc/) Powered by Discuz! X3.4