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

如何创建网站推广产品网站都有什么语言

如何创建网站推广产品,网站都有什么语言,广州网站开发多少钱,wordpress 报名 插件无代理对象的循环依赖 什么是循环依赖解决方案实现方式测试验证 引入代理对象的影响创建代理对象问题分析 源码见:mini-spring 什么是循环依赖 循环依赖是指在对象创建过程中,两个或多个对象相互依赖,导致创建过程陷入死循环。以下通过一个简…

无代理对象的循环依赖

    • 什么是循环依赖
    • 解决方案
      • 实现方式
      • 测试验证
    • 引入代理对象的影响
      • 创建代理对象
      • 问题分析

源码见:mini-spring

在这里插入图片描述

什么是循环依赖

循环依赖是指在对象创建过程中,两个或多个对象相互依赖,导致创建过程陷入死循环。以下通过一个简单的例子来说明:

public class A {  @Autowired  private B b;  public void func() {}  public B getB() {  return b;  }  public void setB(B b) {  this.b = b;  }  
}
public class B {  @Autowired  private A a;  public A getA() {  return a;  }  public void setA(A a) {  this.a = a;  }  
}

在上述代码中,类 A 依赖于 B(通过属性 b),而类 B 又依赖于 A(通过属性 a)。如果不加以处理,在创建 A 时会尝试注入 B,创建 B 时又需要注入 A,从而形成死循环,导致程序无法正常运行。


解决方案

对于没有代理对象的循环依赖问题,Spring 提供了一种简单有效的解决方案:提前暴露 Bean。核心思想是在 Bean 实例化完成后(但尚未完成属性注入),将其加入缓存,从而避免在属性注入阶段因循环依赖而导致的死循环。

实现方式

在 Spring 的 DefaultSingletonBeanRegistry 类中,引入二级缓存 earlySingletonObjects,用于存储提前暴露的 Bean 实例。虽然从实现角度看,将其放入一级缓存也可以解决问题,但 Spring 使用二级缓存是为了与已完全初始化的 Bean(存储在一级缓存中)进行区分。

// 二级缓存,保存实例化后的 Bean  
protected Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>();

接下来,修改单例 Bean 的获取逻辑。在 getSingletonBean 方法中,首先从一级缓存 singletonObjects 中查找 Bean,若未找到,则尝试从二级缓存 earlySingletonObjects 中获取:

@Override  
public Object getSingletonBean(String beanName) {  Object singletonObject = singletonObjects.get(beanName);  if (singletonObject == null) {  singletonObject = earlySingletonObjects.get(beanName);  }  return singletonObject;  
}

通过上述修改,一个基本的循环依赖解决方案即告完成。

测试验证

以下是测试代码,用于验证循环依赖是否被成功解决:

@Test  
public void testCircularReference() {  ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:circular-reference-without-proxy-bean.xml");  A a = applicationContext.getBean("a", A.class);  B b = applicationContext.getBean("b", B.class);  Assert.assertEquals(a.getB(), b);  
}

在创建 A 对象时,Spring 会在实例化完成后将其加入二级缓存 earlySingletonObjects。随后在注入属性时,需要创建 B 对象,而 B 依赖于 A。此时,Spring 直接从二级缓存中获取 A 实例,完成 B 的创建,并将 B 注入到 A 中,从而成功打破循环依赖。


引入代理对象的影响

如果 Bean 被代理(例如通过 AOP 实现),上述解决方案可能会失效。下面通过一个示例分析问题所在。

创建代理对象

假设对 A 对象应用代理,添加一个前置通知(Before Advice):

@Component  
public class ABefpreAdvice implements MethodBeforeAdvice {  @Override  public void before(Method method, Object[] args, Object target) throws Throwable {  System.out.println("before");  }  
}

Spring 的 XML 配置如下,其中 A 被配置为通过 AOP 代理:

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:context="http://www.springframework.org/schema/context"  xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.0.xsd">  <bean id="b" class="org.qlspringframework.test.bean.B">  <property name="a" ref="a"/>  </bean>  <!-- A 被代理 -->  <bean id="a" class="org.qlspringframework.test.bean.A">  <property name="b" ref="b"/>  </bean>  <bean class="org.qlspringframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>  <bean id="pointcutAdvisor" class="org.qlspringframework.aop.aspectj.AspectJExpressionPointcutAdvisor">  <property name="expression" value="execution(* org.qlspringframework.test.bean.A.func(..))"/>  <property name="advice" ref="methodInterceptor"/>  </bean>  <bean id="methodInterceptor" class="org.qlspringframework.aop.framework.adapter.MethodBeforeAdviceInterceptor">  <property name="advice" ref="beforeAdvice"/>  </bean>  <bean id="beforeAdvice" class="org.qlspringframework.test.common.ABefpreAdvice"/>  
</beans>

问题分析

在引入代理对象后,测试结果会发生变化。B 中注入的 A 实例是原始对象(实例化后但未完成初始化的对象),而从 Spring 容器中最终获取的 A 是代理对象,二者不再是同一个对象。这是因为 Spring 的二级缓存机制保存的是未代理的 A 实例,而代理对象是在后续阶段生成的。

因此,Assert.assertEquals(a.getB(), b) 可能失败,因为 a 是代理对象,而 b 中持有的 a 是原始对象。


文章转载自:

http://SDamfqm1.skksz.cn
http://UPjkWjwU.skksz.cn
http://ceSXYIzr.skksz.cn
http://R9NKN1gs.skksz.cn
http://G7LqG5kM.skksz.cn
http://2Xn8wgGl.skksz.cn
http://ehLZpaSV.skksz.cn
http://HLnfD5zj.skksz.cn
http://Eue2Timb.skksz.cn
http://QTKdpSgi.skksz.cn
http://cmPxDadj.skksz.cn
http://gSQfHEbw.skksz.cn
http://vdTJfPVz.skksz.cn
http://ydjYfA8X.skksz.cn
http://bH92unjR.skksz.cn
http://tg3g7Uyu.skksz.cn
http://B1CtvU3K.skksz.cn
http://iGXt2CFG.skksz.cn
http://1jfS5LrZ.skksz.cn
http://stek0zM9.skksz.cn
http://rtMw64SW.skksz.cn
http://0SG6CA2C.skksz.cn
http://OP7JhmHx.skksz.cn
http://r0po8iVq.skksz.cn
http://fi5KdECO.skksz.cn
http://5KR4gxjq.skksz.cn
http://g9WKGZ2n.skksz.cn
http://1CeOBqpr.skksz.cn
http://3XXznIPf.skksz.cn
http://YbeKMKG0.skksz.cn
http://www.dtcms.com/wzjs/761312.html

相关文章:

  • 枞阳做网站河南智慧团建官网
  • 建筑公司网站设计免费网站排名大全
  • 淄博企业网站建设制作网页需要的技术
  • 广州网站推广软件网站外包公司该如何运营
  • 成都定制网站建建设工程计价
  • 怎么做能收费的视频网站长沙有哪些知名网站
  • 网站登陆系统怎么做做网站 怎么赚钱吗
  • 建设一个网站的工作方案苏州百度推广公司
  • 电影分享网站源码做电子商务网站
  • 海纳网站建设wordpress如何采集
  • 网站建设评比细则上海大型网站设计公司
  • 哪些网站可以找到做海报的素材室内设计公司排名前十强及作品
  • 做网站麻烦吗申请网站需要什么资料
  • 网站建设进度报告免费手机网站商城
  • 专业的网站设计制作怎么推广网站平台
  • 外贸网站推上海商用厨房设计
  • 网站建设综合实训总结火车头采集wordpress
  • 漳州做网站公司素材免费网站
  • 59一起做网站网站搭建类型
  • 上海市建设安装协会网站十大暴利行业加盟
  • 建设银行网站转账手机电脑网站排名
  • wap网站适配网站建设费用多少
  • 电子商务网站建设方案书的总结skech做网站交互流程
  • 淮北矿业工程建设公司网站提供设计的的网站
  • 网站设计都用什么字体wordpress调用图片路径
  • 网站通过微信支付宝收钱怎么做手机百度官网
  • 电子商务网站推广策略论文网络销售是做网站推广
  • 网站简繁体转换.rar如何制作一个网站包含多个网页
  • 装修公司做宣传在哪个网站网站开发项目经理招聘
  • 网站开发怎么收客户费自建网站去除html