看文章之前 首先问自己几个问题
1 容器是什么?
2 容器有什么作用? 维护Map<beanName,BeanDefinition> 的映射关系
3 容器实现原理?
4.容器有哪些? XmlBeanFactory 和AppContext有什么区别?
一 . Spring的核心类 DefaultListableBeanFactory 和 XmlBeanFactory :
1.DefaultListableBeanFactory 是Spring注册加载bean的默认实现
2. XmlBeanFactory 继承了 DefaultListableBeanFactory 并且进行了扩展 ,使用了自定义的XML读取器 XmlBeanDefinitionReader
二 .首先我们来一个简单的列子:
1创建Account
2给Account bean 配置
3测试
4例子简单的分析
BeanFactory bf =new XmlBeanFactory(new ClassPathResource("super-bean.xml"));
1.Resource resource = new ClassPathResource("super-bean.xml") 资源加载器 通过资源文件的路径 找到并加载资源返回Resource
2.new XmlBeanFactory(Resource resource) XmlBeanFactory调用XmlBeanDefinitionReader.loadBeanDefinitions(resource)加载并注册资源
三 .接下来我们跟着资源文件加载封装过程来进行分析:
1.资源加载器根据资源文件的路径找到资源文件并加载 获得Resorce
2.将Resorce封装成EncodedResource (加入了编码元素)
3.获取EncodedResource中的资源输入流 将InputSource实例化 并设置encoding参数
-- 1. InputStream inputStream = encodedResource.getResource().getInputStream();
-- 2.InputSource inputSource =new InputSource(inputStream); inputSource.setEncoding(encodedResource.getEncoding());
4. 加载资源文件并获取Document
-- 1.获取对XML的验证模式 (XmlBeanDefinitionReader#getValidationModeForResource(resource))
--2.创建DocumentBuilderFactory 然后通过DocumentBuilderFactory创建DocumentBuilder进而解析InputSource创建Document
5.获取Element (Document.getDocumentElement())
四.解析及注册BeanDefinition
其实 2-5都是在XmlBeanDefinitionReader中完成的,XmlBeanDefinitionReader 对XML配置资源文件读取 解析 现在已经拿到资源元素Element ,那接下来就可以进行Bean注册了,XmlBeanDefinitionReader 将注册bean的工作委托给BeanDefinitionDocumentReader,如下图所示:
我们来分析一下documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
4.1 首先 获取参数 XmlReaderContext readerContext = createReaderContext(resource);
XmlReaderContext 继承了 ReaderContext 并扩展XmlBeanDefinitionReader,NamespaceHandlerResolver等参数
-- 1. XmlBeanDefinitionReader:XML配置读取器
-- 2. NamespaceHandlerResolver : 可以通过namespaceUri来获取NamespaceHandler
4.2 进入DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions(Element root)
这个方法里总结出来就三个点
1.获取BeanDefinitionParserDelegate实例-----> createDelegate(getReaderContext(), root, parent) 并向监听器中注册defaultsDefinition(上面4.1 分析说道 首先通过getReaderContext() 获取参数 XmlReaderContext ,XmlReaderContext继承了ReaderContext,这里的监听器就是eventListener))
BeanDefinitionParserDelegate中包含基本配置参数的定义和注册的bean的方法,如下图所示:
2.获取环境变量profile (通常用来区分生产环境和开发环境)
3标签解析&注册bean --->parseBeanDefinitions(root, this.delegate);
Spring中标签分为两种
1.Spring默认的标签 如<bean id="account" class
2.自定义标签 如<aop:aspectj-autoproxy
简单流程图如下:
spring默认标签和自定义标签解析流程图
网友评论