当前位置: 首页 > news >正文

如何在阿里网站做外单怎样做信息收费网站

如何在阿里网站做外单,怎样做信息收费网站,上海的网站建设公司,深圳模板网站建设公司前面几章的内容已经介绍了BeanFactory创建前的准备工作#xff0c;以及加载XML配置文件前的准备的步骤。本章会着重介绍解析XML的步骤。 registerBeanDefinitions 前几个方法不做过多的赘述#xff0c;着重看registerBeanDefinitions方法中解析XML的步骤。 public int regi…前面几章的内容已经介绍了BeanFactory创建前的准备工作以及加载XML配置文件前的准备的步骤。本章会着重介绍解析XML的步骤。 registerBeanDefinitions 前几个方法不做过多的赘述着重看registerBeanDefinitions方法中解析XML的步骤。 public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {// 对xml的beanDefinition进行解析BeanDefinitionDocumentReader documentReader createBeanDefinitionDocumentReader();int countBefore getRegistry().getBeanDefinitionCount();// 完成具体的解析过程documentReader.registerBeanDefinitions(doc, createReaderContext(resource));return getRegistry().getBeanDefinitionCount() - countBefore;}doRegisterBeanDefinitions 之前已经将XML转换成了Document对象所以Element 元素就是XML配置文件中的最外层标签 beans 并且看beans标签中是否配置了default-lazy-initdefault-merge等属性如果配置了则进行赋值。其中defaultNamespace就是XML配置文件中beans标签的xmlns属性中所对应的。主要是用来在网上对应地址进行校验XML。 protected void doRegisterBeanDefinitions(Element root) {// Any nested beans elements will cause recursion in this method. In// order to propagate and preserve beans default-* attributes correctly,// keep track of the current (parent) delegate, which may be null. Create// the new (child) delegate with a reference to the parent for fallback purposes,// then ultimately reset this.delegate back to its original (parent) reference.// this behavior emulates a stack of delegates without actually necessitating one.BeanDefinitionParserDelegate parent this.delegate;//创建Delegate并且看beans标签中是否配置了default-lazy-initdefault-merge等属性设置默认值this.delegate createDelegate(getReaderContext(), root, parent);//defaultNamespace http://www.springframework.org/schema/beansif (this.delegate.isDefaultNamespace(root)) {String profileSpec root.getAttribute(PROFILE_ATTRIBUTE);if (StringUtils.hasText(profileSpec)) {String[] specifiedProfiles StringUtils.tokenizeToStringArray(profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);// We cannot use Profiles.of(...) since profile expressions are not supported// in XML config. See SPR-12458 for details.if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {return;}}}preProcessXml(root);parseBeanDefinitions(root, this.delegate);postProcessXml(root);this.delegate parent;}parseBeanDefinitions 解析XML的具体操作从beans标签节点开始逐层像里面遍历 protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {if (delegate.isDefaultNamespace(root)) {//获取childNodeNodeList 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);}}}}else {delegate.parseCustomElement(root);}}parseDefaultElement 默认namespace则走parseDefaultElement方法进行解析只有Spring默认的标签才会执行这个解析方式默认标签共有import、alias、bean和beans四种。 private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {importBeanDefinitionResource(ele);}else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {processAliasRegistration(ele);}else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {processBeanDefinition(ele, delegate);}else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {// recursedoRegisterBeanDefinitions(ele);}}processBeanDefinition 每种对应的解析方式也不同以bean标签为例。创建一个BeanDefinitionHolder 对象用来封装 protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {// beanDefinitionHolder是beanDefinition对象的封装类封装了BeanDefinitionbean的名字和别名用它来完成向IOC容器的注册// 得到这个beanDefinitionHolder就意味着beandefinition是通过BeanDefinitionParserDelegate对xml元素的信息按照spring的bean规则进行// 解析得到的BeanDefinitionHolder bdHolder delegate.parseBeanDefinitionElement(ele);if (bdHolder ! null) {bdHolder delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);try {// Register the final decorated instance.// 向ioc容器注册解析得到的beandefinition的地方BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());}catch (BeanDefinitionStoreException ex) {}// Send registration event.// 在beandefinition向ioc容器注册完成之后发送消息getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));}}解析bean标签 获取bean标签中id属性和name属性并检查唯一性调用parseBeanDefinitionElement进一步解析bean下其他节点属性。 parseBeanDefinitionElement Nullablepublic BeanDefinitionHolder parseBeanDefinitionElement(Element ele, Nullable BeanDefinition containingBean) {// 解析id属性String id ele.getAttribute(ID_ATTRIBUTE);// 解析name属性String nameAttr ele.getAttribute(NAME_ATTRIBUTE);// 如果bean有别名的话那么将别名分割解析ListString aliases new ArrayList();if (StringUtils.hasLength(nameAttr)) {String[] nameArr StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);aliases.addAll(Arrays.asList(nameArr));}String beanName id;if (!StringUtils.hasText(beanName) !aliases.isEmpty()) {beanName aliases.remove(0);}if (containingBean null) {checkNameUniqueness(beanName, aliases, ele);}// 对bean元素的详细解析AbstractBeanDefinition beanDefinition parseBeanDefinitionElement(ele, beanName, containingBean);if (beanDefinition ! null) {if (!StringUtils.hasText(beanName)) {try {// 如果不存在beanname那么根据spring中提供的命名规则为当前bean生成对应的beanNameif (containingBean ! null) {beanName BeanDefinitionReaderUtils.generateBeanName(beanDefinition, this.readerContext.getRegistry(), true);}else {beanName this.readerContext.generateBeanName(beanDefinition);// Register an alias for the plain bean class name, if still possible,// if the generator returned the class name plus a suffix.// This is expected for Spring 1.2/2.0 backwards compatibility.String beanClassName beanDefinition.getBeanClassName();if (beanClassName ! null beanName.startsWith(beanClassName) beanName.length() beanClassName.length() !this.readerContext.getRegistry().isBeanNameInUse(beanClassName)) {aliases.add(beanClassName);}}}catch (Exception ex) {error(ex.getMessage(), ele);return null;}}String[] aliasesArray StringUtils.toStringArray(aliases);return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);}return null;}parseBeanDefinitionElement createBeanDefinition中创建的是GenericBeanDefinition将解析好的属性值放到GenericBeanDefinition中并封装到BeanDefinitionHolder中。 public AbstractBeanDefinition parseBeanDefinitionElement(Element ele, String beanName, Nullable BeanDefinition containingBean) {this.parseState.push(new BeanEntry(beanName));// 解析class属性String className null;if (ele.hasAttribute(CLASS_ATTRIBUTE)) {className ele.getAttribute(CLASS_ATTRIBUTE).trim();}// 解析parent属性String parent null;if (ele.hasAttribute(PARENT_ATTRIBUTE)) {parent ele.getAttribute(PARENT_ATTRIBUTE);}try {// 创建装在bean信息的AbstractBeanDefinition对象实际的实现是GenericBeanDefinitionAbstractBeanDefinition bd createBeanDefinition(className, parent);// 解析bean标签的各种其他属性parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);// 设置description信息bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));// 解析元数据parseMetaElements(ele, bd);// 解析lookup-method属性parseLookupOverrideSubElements(ele, bd.getMethodOverrides());// 解析replaced-method属性parseReplacedMethodSubElements(ele, bd.getMethodOverrides());// 解析构造函数参数parseConstructorArgElements(ele, bd);// 解析property子元素parsePropertyElements(ele, bd);// 解析qualifier子元素parseQualifierElements(ele, bd);bd.setResource(this.readerContext.getResource());bd.setSource(extractSource(ele));return bd;} finally {this.parseState.pop();}return null;}此时整个bean标签已经全部加载完成并封装到了一个BeanDefinitionHolder中接下来再回到BeanDefinitionHolder的操作。看解析完之后做了些什么。parseBeanDefinitionElement方法已经执行完接下来是registerBeanDefinition。 protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {// beanDefinitionHolder是beanDefinition对象的封装类封装了BeanDefinitionbean的名字和别名用它来完成向IOC容器的注册// 得到这个beanDefinitionHolder就意味着beandefinition是通过BeanDefinitionParserDelegate对xml元素的信息按照spring的bean规则进行// 解析得到的BeanDefinitionHolder bdHolder delegate.parseBeanDefinitionElement(ele);if (bdHolder ! null) {bdHolder delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);try {// Register the final decorated instance.// 向ioc容器注册解析得到的beandefinition的地方BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());}catch (BeanDefinitionStoreException ex) {getReaderContext().error(Failed to register bean definition with name bdHolder.getBeanName() , ele, ex);}// Send registration event.// 在beandefinition向ioc容器注册完成之后发送消息getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));}}registerBeanDefinition 这个方法主要流程是获取封装进eanDefinitionHolder的beanName注册到BeanFactory容器中。 public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)throws BeanDefinitionStoreException {// Register bean definition under primary name.// 使用beanName做唯一标识注册String beanName definitionHolder.getBeanName();registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());// Register aliases for bean name, if any.// 注册所有的别名String[] aliases definitionHolder.getAliases();if (aliases ! null) {for (String alias : aliases) {registry.registerAlias(beanName, alias);}}}registerBeanDefinition beanDefinitionMapConcurrentHashMapString, BeanDefinition beanDefinitionMap类型keybeanNamevalueBeanDefinition。 beanDefinitionNamesArrayList String beanDefinitionNames类型。 如果beanDefinitionMap中key存在证明加载解析过则看allowBeanDefinitionOverriding是否允许类被覆盖创建BeanFactory是设置的值可以则覆盖不可以则抛异常。 如果没加载过则放到beanDefinitionMap和beanDefinitionNames中。 Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {if (beanDefinition instanceof AbstractBeanDefinition) {try {// 注册前的最后一个校验这里的检验不同于之前的xml文件校验主要是对应abstractBeanDefinition属性的methodOverrides校验// 检验methodOverrides是否与工厂方法并存或者methodoverrides对应的方法根本不存在((AbstractBeanDefinition) beanDefinition).validate();}//异常省略。。}BeanDefinition existingDefinition this.beanDefinitionMap.get(beanName);// 处理注册已经注册的beanName情况if (existingDefinition ! null) {// 如果对应的beanName已经注册且在配置中配置了bean不允许被覆盖则抛出异常if (!isAllowBeanDefinitionOverriding()) {throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);}//LOG省略。。this.beanDefinitionMap.put(beanName, beanDefinition);}else {if (hasBeanCreationStarted()) {// Cannot modify startup-time collection elements anymore (for stable iteration)synchronized (this.beanDefinitionMap) {this.beanDefinitionMap.put(beanName, beanDefinition);ListString updatedDefinitions new ArrayList(this.beanDefinitionNames.size() 1);updatedDefinitions.addAll(this.beanDefinitionNames);updatedDefinitions.add(beanName);this.beanDefinitionNames updatedDefinitions;removeManualSingletonName(beanName);}}else {// Still in startup registration phase// 注册beanDefinitionthis.beanDefinitionMap.put(beanName, beanDefinition);// 记录beanNamethis.beanDefinitionNames.add(beanName);removeManualSingletonName(beanName);}this.frozenBeanDefinitionNames null;}if (existingDefinition ! null || containsSingleton(beanName)) {// 重置所有beanName对应的缓存resetBeanDefinition(beanName);}else if (isConfigurationFrozen()) {clearByTypeCache();}}至此XML加载整个bean标签流程结束。
http://www.w-s-a.com/news/154891/

相关文章:

  • 做网站要不要营业执照重庆网站优化seo公司
  • 学院宣传网站建设简介做网站没灵感
  • 网站建设终稿确认书网站意义学校
  • 3小时网站建设平台专业制作教学课件
  • 曲阜网站建设百度开户现货黄金什么网站可以做直播
  • 比较好的企业建站平台小程序开发外包该注意些什么
  • 建行官网官网网站吗二次元风格wordpress模板
  • 怎样开通自己的网站网址导航哪个主页最好
  • 大良o2o网站建设详情页设计说明怎么写
  • 您与此网站之间建立的连接不安全汽车cms系统是什么意思
  • 有没有做logo的网站企业网站的内容营销
  • 哈尔滨做企业网站怎么做网站自动响应
  • 网站建设硬件和软件技术环境配置签约做网站模板
  • 教育网站建设的素材手机app制作流程
  • 免费行情软件网站大全下载网站备案查询
  • flex网站模板wordpress实时预览
  • 建设银行网站模板为什么企业要建设自己的企业文化
  • 网站建设必知免费手机网站建站系统
  • ssh可以做wap网站么嘉兴seo排名
  • 站内优化包括哪些帝国做企业网站
  • 做网站seo赚钱吗网络维护和故障维修
  • 企业网站可以自己做摄影网站开发背景怎么写
  • 网站百度指数seo最好的工具
  • 宝安专业网站建设推荐设计感强的网站
  • 网站建设 6万元北京知名的品牌设计公司
  • 网站建设的总体需求是什么vmware 下wordpress
  • 光谷网站建设请检查网络
  • 申请建设网站的报告书商务网站开发课程体会
  • 网站开发实训总结致谢群晖wordpress设置
  • 关于酒店网站建设的摘要天津市建设工程信息网官网首页