爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      论Spring中循环依赖的正确性与Bean注入的顺序关系

      首页 知识中心 软件开发 文章详情页

      论Spring中循环依赖的正确性与Bean注入的顺序关系

      2023-02-24 10:11:49 阅读次数:190

      xml

      一、前言

      最近在做项目时候遇到一个奇葩问题,就是bean依赖注入的正确性与bean直接注入的顺序有关系,但是正常情况下明明是和顺序没关系的啊,究竟啥情况那,不急,让我一一道来。

      二、普通Bean循环依赖-与注入顺序无关

      2.1 循环依赖例子与原理

      public class BeanA {
      
          private BeanB beanB;
      
          public BeanB getBeanB() {
              return beanB;
          }
      
          public void setBeanB(BeanB beanB) {
              this.beanB = beanB;
          }
      }
      
      public class BeanB {
      
          private BeanA beanA;
      
          public BeanA getBeanA() {
              return beanA;
          }
      
          public void setBeanA(BeanA beanA) {
              this.beanA = beanA;
          }
      }
      
      
      <bean id="beanA" class="com.alibaba.test.circle.BeanA">
          <property name="beanB">
              <ref bean="beanB" />
          </property>
      </bean>
      <bean id="beanB" class="com.alibaba.test.circle.BeanB">
          <property name="beanA">
              <ref bean="beanA" />
          </property>
      </bean>
      

      上述循环依赖注入能够正常工作,这是因为Spring提供了EarlyBeanReference功能,首先Spring里面有个名字为singletonObjects的并发map用来存放所有实例化并且初始化好的bean,singletonFactories则用来存放需要解决循环依赖的bean信息(beanName,和一个回调工厂)。当实例化beanA时候会触发getBean(“beanA”);首先看singletonObjects中是否有beanA有则返回:

      (1)
      Object sharedInstance = getSingleton(beanName);//getSingleton(beanName,true);
      if (sharedInstance != null && args == null) {
          if (logger.isDebugEnabled()) {
              if (isSingletonCurrentlyInCreation(beanName)) {
                  logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
                          "' that is not fully initialized yet - a consequence of a circular reference");
              }
              else {
                  logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
              }
          }
              // 如果是普通bean直接返回,工厂bean则返回sharedInstance.getObject();
          bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
      }
      
          protected Object getSingleton(String beanName, boolean allowEarlyReference) {
              Object singletonObject = this.singletonObjects.get(beanName);
              if (singletonObject == null) {
                  synchronized (this.singletonObjects) {
                      singletonObject = this.earlySingletonObjects.get(beanName);
                      if (singletonObject == null && allowEarlyReference) {
                          ObjectFactory singletonFactory = (ObjectFactory) this.singletonFactories.get(beanName);
                          if (singletonFactory != null) {
                              singletonObject = singletonFactory.getObject();
                              this.earlySingletonObjects.put(beanName, singletonObject);
                              this.singletonFactories.remove(beanName);
                          }
                      }
                  }
              }
              return (singletonObject != NULL_OBJECT ? singletonObject : null);
          }
      

      一开始肯定没有所以会实例化beanA,如果设置了allowCircularReferences=true(默认为true)并且当前bean为单件并且该bean目前在创建中,则初始化属性前把该bean信息放入singletonFactories单件map里面:

      (2)
      boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
              isSingletonCurrentlyInCreation(beanName));
      if (earlySingletonExposure) {
          if (logger.isDebugEnabled()) {
              logger.debug("Eagerly caching bean '" + beanName +
                      "' to allow for resolving potential circular references");
          }
          addSingletonFactory(beanName, new ObjectFactory() {
              public Object getObject() throws BeansException {
                  return getEarlyBeanReference(beanName, mbd, bean);
              }
          });
      }
      
      protected void addSingletonFactory(String beanName, ObjectFactory singletonFactory) {
          Assert.notNull(singletonFactory, "Singleton factory must not be null");
          synchronized (this.singletonObjects) {
              if (!this.singletonObjects.containsKey(beanName)) {
                  this.singletonFactories.put(beanName, singletonFactory);
                  this.earlySingletonObjects.remove(beanName);
                  this.registeredSingletons.add(beanName);
              }
          }
      }
      
      

      然后对该实例进行属性注入beanB,属性注入时候会getBean(“beanB”),发现beanB 不在singletonObjects中,就会实例化beanB,然后放入singletonFactories,然后进行属性注入beanA,然后触发getBean(“beanA”);这时候会到(1)getSingleton返回实例化的beanA。到此beanB初始化完毕添加beanB 到singletonObjects然后返回,然后beanA 初始化完毕,添加beanA到singletonObjects然后返回

      2.2 允许循环依赖的开关

      public class TestCircle2 {
      
          private final static ClassPathXmlApplicationContext moduleContext;
          private static Test test;
          static {
              moduleContext = new ClassPathXmlApplicationContext(new String[]{"beans-circile.xml"});
              moduleContext.setAllowCircularReferences(false);
              test = (Test) moduleContext.getBean("test");
          }
      
        
          public static void main(String[] args)  {
      
              System.out.println(test.name);
          }
      }
      

      ClassPathXmlApplicationContext类中有个属性allowCircularReferences用来控制是否允许循环依赖默认为true,这里设置为false后发现循环依赖还是可以正常运行,翻看源码:

      public ClassPathXmlApplicationContext(String[] configLocations) throws BeansException {
              this(configLocations, true, null);
      }
      
      public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
              throws BeansException {
      
          super(parent);
          setConfigLocations(configLocations);
          if (refresh) {
              refresh();
          }
      }
      public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
              throws BeansException {
      
          super(parent);
          setConfigLocations(configLocations);
          if (refresh) {
              refresh();
          }
      }
      

      知道默认构造ClassPathXmlApplicationContext时候会刷新容器。

      refresh方法会调用refreshBeanFactory:

      
      protected final void refreshBeanFactory() throws BeansException {
          if (hasBeanFactory()) {
              destroyBeans();
              closeBeanFactory();
          }
          try {
              // 创建bean工厂
              DefaultListableBeanFactory beanFactory = createBeanFactory();
              //定制bean工厂属性
              customizeBeanFactory(beanFactory);
              loadBeanDefinitions(beanFactory);
              synchronized (this.beanFactoryMonitor) {
                  this.beanFactory = beanFactory;
              }
          }
          catch (IOException ex) {
              throw new ApplicationContextException(
                      "I/O error parsing XML document for application context [" + getDisplayName() + "]", ex);
          }
      }
      
      protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
          if (this.allowBeanDefinitionOverriding != null) {
              beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding.booleanValue());
          }
          if (this.allowCircularReferences != null) {
              beanFactory.setAllowCircularReferences(this.allowCircularReferences.booleanValue());
          }
      }
      

      到这里就知道了,我们在调用 moduleContext.setAllowCircularReferences(false)前,spring留出的设置bean工厂的回调customizeBeanFactory已经执行过了,最终原因是,调用设置前,bean工厂已经refresh了,所以测试代码改为:

      public class TestCircle {
      
          private final static ClassPathXmlApplicationContext moduleContext;
          private static Test test;
          static {
              //初始化容器上下文,但是不刷新容器
              moduleContext = new ClassPathXmlApplicationContext(new String[]{"beans-circile.xml"},false);
              moduleContext.setAllowCircularReferences(false);
      
              //刷新容器
              moduleContext.refresh();
              test = (Test) moduleContext.getBean("test");
          }
      
        
          public static void main(String[] args)  {
      
              System.out.println(test.name);
          }
      
      }
      

      现在测试就会抛出异常:

      Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanA' defined in class path resource [beans-circile.xml]: Cannot resolve reference to bean 'beanB' while setting bean property 'beanB'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanB' defined in class path resource [beans-circile.xml]: Cannot resolve reference to bean 'beanA' while setting bean property 'beanA'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'beanA': Requested bean is currently in creation: Is there an unresolvable circular reference?
      

      三、工厂Bean与普通Bean循环依赖-与注入顺序有关

      3.1 测试代码

      工厂bean
      public class MyFactoryBean implements FactoryBean,InitializingBean{
      
          private String name;
        
          private Test test;
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
        
      
          public DependentBean getDepentBean() {
              return depentBean;
          }
      
          public void setDepentBean(DependentBean depentBean) {
              this.depentBean = depentBean;
          }
      
          private DependentBean depentBean;
        
      
      
          public Object getObject() throws Exception {
      
              return test;
          }
      
          public Class getObjectType() {
              // TODO Auto-generated method stub
              return Test.class;
          }
      
          public boolean isSingleton() {
              // TODO Auto-generated method stub
              return true;
          }
      
          public void afterPropertiesSet() throws Exception {
                  System.out.println("name:" + this.name);
                  test = new Test();
                  test.name =  depentBean.doSomething() + this.name;
      
          }
       }
      
      
      为了简化,只写一个public的变量
      public class Test {
          public String name;
      
      }
      
      public class DependentBean {
      
          public String doSomething(){
              return "hello:";
          }
        
          @Autowired
          private Test test;
      }
      
      
      xml配置
      <bean id="test" class="com.alibaba.test.circle.MyFactoryBean">
      
          <property name="depentBean">
              <bean  class="com.alibaba.test.circle.DependentBean"></bean> 
          </property>
      
          <property name="name" value="zlx"></property>
      </bean>
      

      其中工厂Bean MyFactoryBean作用是对Test类的包装,首先对MyFactoryBean设置属性,然后在MyFactoryBean的afterPropertiesSet方法中创建一个Test实例,并且设置属性,实例化MyFactoryBean最终会调用getObject方法返回创建的Test对象。这里MyFactoryBean依赖了DepentBean,而depentBean本身有依赖了Test,所以这是个循环依赖

      测试:

      public class TestCircle2 {
      
          private final static ClassPathXmlApplicationContext moduleContext;
          private static Test test;
          static {
              moduleContext = new ClassPathXmlApplicationContext(new String[]{"beans-circile.xml"});
              test = (Test) moduleContext.getBean("test");
          }
      
        
          public static void main(String[] args)  {
      
              System.out.println(test.name);
          }
      }
      
      

      结果:

      Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.alibaba.test.circle.DependentBean#1c701a27': Autowiring of fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.alibaba.test.circle.Test com.alibaba.test.circle.DependentBean.test; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'test': FactoryBean which is currently in creation returned null from getObject
      

      3.2 分析原因

      • 当实例化test时候会触发getBean(“test”),会看当前bean是否存在
      • 不存在则创建Test 的实例,创建完毕后会把当前bean信息放入singletonFactories单件map里面
      • 然后对该实例进行属性注入depentBean,属性注入时候会getBean(“depentBean”),
      • 发现depentBean 不存在,就会实例化depentBean,然后放入singletonFactories,
      • 然后进行autowired注入test,然后触发getBean(“test”);这时候会到(1)getSingleton返回实例化的test。由于test是工厂bean所以返回test.getObject();
      • 而MyFactoryBean的afterPropertiesSet还没被调用,所以test.getObject()返回null.

      下面列下Spring bean创建的流程:

      getBean()->创建实例->autowired->set属性->afterPropertiesSet

      也就是调用getObject方法早于afterPropertiesSet方法被调用了。

      那么我们修改下MyFactoryBean为如下:

      public Object getObject() throws Exception {
          // TODO Auto-generated method stub
          if(null == test){
              afterPropertiesSet();
          }
          return test;
      }
      
      public void afterPropertiesSet() throws Exception {
          if(null == test){
              System.out.println("name:" + this.name);
              test = new Test();
              test.name =  depentBean.doSomething() + this.name;
      
          }
      }
      

      也就是getObject内部先判断不如test==null那调用下afterPropertiesSet,然后afterPropertiesSet内部如果test==null在创建Test实例,看起来貌似不错,好想可以解决我们的问题。但是实际上还是不行的,因为afterPropertiesSet内部使用了depentBean,而此时depentBean=null。

      3.3 思考如何解决

      3.2分析原因是先创建了MyFactoryBean,并在在创建MyFactoryBean的过程中有创建了DepentBean,而创建DepentBean时候需要autowired MyFactoryBean的实例,然后要调用afterPropertiesSet前调用getObject方法所以返回null。

      那如果先创建DepentBean,然后在创建MyFactoryBean那?下面分析下过程:

      • 首先会实例化DepentBean,并且加入到singletonFactories
      • DepentBean实例会autowired Test,所以会先创建Test实例
      • 创建Test实例,然后加入singletonFactories
      • Test实例会属性注入DepentBean实例,所以会getBean(“depentBean”);
      • getBean(“depentBean”) 发现singletonFactories中已经有depentBean了,则返回depentBean对象
      • 因为depentBean不是工厂bean所以直接返回depentBean
      • Test实例会属性注入DepentBean实例成功,Test实例初始化OK
      • DepentBean实例会autowired Test实例OK

      按照这分析先创建DepentBean,然后在实例化MyFactoryBean是可行的,修改xml为如下:

      
      <bean id="dependentBean" class="com.alibaba.test.circle.DependentBean"></bean> 
      
      <bean id="test" class="com.alibaba.test.circle.MyFactoryBean">
      
          <property name="depentBean">
           <ref bean="dependentBean" /> 
          </property>
        
          <property name="name" value="zlx"></property>
      
      </bean>
      

      测试运行结果:

      name:zlx

      hello:zlx

      果真可以了,那按照这分析,上面XML配置如果调整了声明顺序,肯定也是会出错的,因为test创建比dependentBean早,测试下果然如此。另外可想而知工厂bean循环依赖工厂bean时候无论声明顺序如何必然也会失败。

      3.3 一个思考

      上面先注入了MyFactoryBean中需要使用的dependentBean,然后注入MyFactoryBean,问题就解决了。那么如果需要在另外一个Bean中使用创建的id=”test”的对象时候,这个Bean该如何注入那?

      类似下面的方式,会成功?留给大家思考^^

      public class UseTest {
      
          @Autowired
          private Test test;
        
      }
      
      
      <bean id="useTest" class="com.alibaba.test.circle.UseTest"></bean> 
      
      <bean id="dependentBean" class="com.alibaba.test.circle.DependentBean"></bean> 
      
      <bean id="test" class="com.alibaba.test.circle.MyFactoryBean">
      
          <property name="depentBean">
           <ref bean="dependentBean" /> 
          </property>
        
          <property name="name" value="zlx"></property>
      
      </bean>
      

      四、 总结

      普通Bean之间相互依赖时候Bean注入顺序是没有关系的,但是工厂Bean与普通Bean相互依赖时候则必须先实例化普通bean,这是因为工厂Bean的特殊性,也就是其有个getObject方法的缘故。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:http://ifeve.com/%e8%ae%baspring%e4%b8%ad%e5%be%aa%e7%8e%af%e4%be%9d%e8%b5%96%e7%9a%84%e6%ad%a3%e7%a1%ae%e6%80%a7%e4%b8%8ebean%e6%b3%a8%e5%85%a5%e7%9a%84%e9%a1%ba%e5%ba%8f%e5%85%b3%e7%b3%bb/,作者:并发编程网,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Java Date Time 教程

      下一篇:《Nginx官方文档》翻译邀请

      相关文章

      2025-05-09 08:20:32

      基于IDEA的Maven简单工程创建及结构分析

      通过一个 mvn 命令直接让我们创建一个 Maven 的脚手架。

      2025-05-09 08:20:32
      java , Maven , xml , 创建 , 文件 , 文件夹 , 项目
      2025-05-06 09:19:30

      第十八节 JDBC流ASCII和二进制数据

      PreparedStatement对象可以使用输入和输出流来提供参数数据。能够将整个文件放入可以容纳大值的数据库列,例如CLOB和BLOB数据类型。

      2025-05-06 09:19:30
      data , xml , XML , 数据库 , 示例
      2025-04-23 08:18:21

      【大数据生态】Oozie 入门学习

      Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由 Cloudera 公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应 用。

      2025-04-23 08:18:21
      job , xml , 定时 , 调度
      2025-04-09 09:16:42

      [快学Python3]XML解析处理 - Element Tree

      [快学Python3]XML解析处理 - Element Tree

      2025-04-09 09:16:42
      xml , 实例 , 演示 , 解析
      2025-03-12 09:34:29

      【问题已解决】Caused by: java.lang.IllegalStateException

      【问题已解决】Caused by: java.lang.IllegalStateException

      2025-03-12 09:34:29
      application , config , mybatis , xml
      2025-03-12 09:31:44

      【基础-配置文件】:hadoop配置文件作用概述ing

      【基础-配置文件】:hadoop配置文件作用概述ing

      2025-03-12 09:31:44
      hadoop , xml , yarn , 配置文件
      2025-03-12 09:31:27

      【运维与安装】hadoop 3.3.1 高可用 + simple认证 +队列设置

      【运维与安装】hadoop 3.3.1 高可用 + simple认证 +队列设置

      2025-03-12 09:31:27
      HDFS , xml , 配置 , 队列
      2025-02-25 08:57:34

      【Java技术指南】「TestNG专题」单元测试框架之TestNG使用教程指南(上)

      【Java技术指南】「TestNG专题」单元测试框架之TestNG使用教程指南(上)

      2025-02-25 08:57:34
      java , Java , xml , 创建 , 参数 , 测试
      2025-01-15 08:08:29

      java 使用dom4j读取xml文件 示范代码(复制即可用)

      java 使用dom4j读取xml文件 示范代码(复制即可用)

      2025-01-15 08:08:29
      download , java , xml , 依赖 , 读取
      2025-01-07 09:17:42

      【Spring】—— 如何使用AOP(面向切面编程)?

      AOP(面向切面编程):一种编程范式,指导开发者如何组织程序结构。

      2025-01-07 09:17:42
      AOP , Spring , xml , 定义
      查看更多
      推荐标签

      作者介绍

      筱筱听云
      天翼云用户

      文章

      19

      阅读量

      6248

      查看更多

      最新文章

      [快学Python3]XML解析处理 - Element Tree

      2025-04-09 09:16:42

      java 使用dom4j读取xml文件 示范代码(复制即可用)

      2025-01-15 08:08:29

      【Spring】—— 如何使用AOP(面向切面编程)?

      2025-01-07 09:17:42

      Spring中基于Java的配置@Configuration和@Bean用法

      2024-11-05 08:30:53

      Ajax:拥抱JSON,让XML走开

      2024-08-02 09:08:33

      Python爬虫:使用lxml解析网页内容

      2024-06-25 08:06:03

      查看更多

      热门文章

      基于XML的DI-为Spring配置多个子配置文件——平等关系

      2022-12-29 09:29:46

      Spring-AOP的通知类型

      2023-07-06 09:42:12

      Eclipse调整XML源代码文件字体大小

      2023-04-18 14:13:23

      AJAX基于XML的数据交换格式

      2023-06-07 07:31:52

      HTTP模块-响应静态资源

      2023-07-17 08:10:27

      解决 Cause: org.xml.sax.SAXParseException; lineNumber: 50; columnNumber: 21; 元素内容必须由格式正确的字符数据或标记组成的错误

      2023-07-11 08:45:03

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Spring-AOP的通知类型

      Spring-DI

      XSLT中用normalize-space函数来清除元素的前后空格

      javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext-Service.xml

      HTTP模块-响应静态资源

      微信小程序-WXML列表渲染Key

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号