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

做玩网站怎么上传网络营销与传统营销有哪些区别

做玩网站怎么上传,网络营销与传统营销有哪些区别,中国交通建设集团官网,哈尔滨市人社appSpring 框架通过 三级缓存 机制来解决循环依赖问题。循环依赖是指两个或多个 Bean 相互依赖,形成一个闭环,例如 Bean A 依赖 Bean B,而 Bean B 又依赖 Bean A。Spring 通过提前暴露未完全初始化的 Bean 来解决这个问题。 以下是 Spring 解决…

Spring 框架通过 三级缓存 机制来解决循环依赖问题。循环依赖是指两个或多个 Bean 相互依赖,形成一个闭环,例如 Bean A 依赖 Bean B,而 Bean B 又依赖 Bean A。Spring 通过提前暴露未完全初始化的 Bean 来解决这个问题。

以下是 Spring 解决循环依赖的详细机制和流程:


1. Spring Bean 的生命周期

在理解循环依赖之前,需要了解 Spring Bean 的生命周期。Spring Bean 的创建过程主要包括以下步骤:

  1. 实例化:通过构造函数或工厂方法创建 Bean 的实例。
  2. 属性填充:将依赖的 Bean 注入到当前 Bean 中(通过 @Autowired@Resource 等注解或 XML 配置)。
  3. 初始化:调用初始化方法(如 @PostConstructInitializingBeanafterPropertiesSet 方法)。
  4. 销毁:在容器关闭时调用销毁方法。

循环依赖通常发生在 属性填充 阶段。


2. 三级缓存机制

Spring 通过三级缓存来解决循环依赖问题。三级缓存分别是:

  1. 一级缓存(Singleton Objects):存储完全初始化好的单例 Bean。
  2. 二级缓存(Early Singleton Objects):存储提前暴露的未完全初始化的 Bean(仅实例化,未填充属性)。
  3. 三级缓存(Singleton Factories):存储 Bean 的工厂对象(ObjectFactory),用于生成提前暴露的 Bean。

3. 解决循环依赖的流程

以下是一个典型的循环依赖场景:

  • Bean A 依赖 Bean B。
  • Bean B 依赖 Bean A。

Spring 解决循环依赖的流程如下:

步骤 1:创建 Bean A
  1. Spring 开始创建 Bean A,调用构造函数实例化 Bean A。
  2. 将 Bean A 的工厂对象(ObjectFactory)放入三级缓存。
  3. 开始填充 Bean A 的属性,发现 Bean A 依赖 Bean B。
步骤 2:创建 Bean B
  1. Spring 开始创建 Bean B,调用构造函数实例化 Bean B。
  2. 将 Bean B 的工厂对象(ObjectFactory)放入三级缓存。
  3. 开始填充 Bean B 的属性,发现 Bean B 依赖 Bean A。
步骤 3:解决 Bean B 的依赖
  1. Spring 从三级缓存中获取 Bean A 的工厂对象,生成 Bean A 的早期引用(未完全初始化的 Bean A)。
  2. 将 Bean A 的早期引用放入二级缓存,并从三级缓存中移除 Bean A 的工厂对象。
  3. 将 Bean A 的早期引用注入到 Bean B 中。
  4. Bean B 完成属性填充和初始化,成为一个完全初始化的 Bean。
  5. 将 Bean B 放入一级缓存。
步骤 4:完成 Bean A 的创建
  1. Spring 将 Bean B 注入到 Bean A 中。
  2. Bean A 完成属性填充和初始化,成为一个完全初始化的 Bean。
  3. 将 Bean A 放入一级缓存,并从二级缓存中移除 Bean A 的早期引用。

4. 代码示例

以下是一个简单的循环依赖示例:

@Component
public class BeanA {@Autowiredprivate BeanB beanB;
}@Component
public class BeanB {@Autowiredprivate BeanA beanA;
}

Spring 会通过三级缓存机制解决 BeanABeanB 之间的循环依赖。


5. 解决循环依赖的限制

Spring 的循环依赖解决方案有以下限制:

  1. 仅支持单例 Bean:Spring 只能解决单例作用域(Singleton)的 Bean 的循环依赖。原型作用域(Prototype)的 Bean 无法解决循环依赖。

  2. 构造函数注入无法解决循环依赖:如果循环依赖是通过构造函数注入的,Spring 无法解决。因为构造函数注入需要在实例化时完成依赖注入,而三级缓存机制无法提前暴露未完全初始化的 Bean。

    @Component
    public class BeanA {private final BeanB beanB;@Autowiredpublic BeanA(BeanB beanB) {this.beanB = beanB;}
    }@Component
    public class BeanB {private final BeanA beanA;@Autowiredpublic BeanB(BeanA beanA) {this.beanA = beanA;}
    }
    

    上述代码会抛出 BeanCurrentlyInCreationException 异常。

  3. 避免复杂的循环依赖:虽然 Spring 可以解决简单的循环依赖,但复杂的循环依赖可能会导致代码难以维护和理解,应尽量避免。


6. 如何避免循环依赖

  1. 使用 Setter 注入或字段注入:避免使用构造函数注入。
  2. 重新设计代码:通过重新设计类之间的关系,消除循环依赖。
  3. 使用 @Lazy 注解:延迟加载依赖的 Bean。
    @Component
    public class BeanA {private final BeanB beanB;@Autowiredpublic BeanA(@Lazy BeanB beanB) {this.beanB = beanB;}
    }
    

7. 缓存状态的变化

以下是缓存状态的变化过程:

步骤一级缓存 (singletonObjects)二级缓存 (earlySingletonObjects)三级缓存 (singletonFactories)
创建 BeanA 实例后BeanA 的工厂对象
创建 BeanB 实例后BeanABeanB 的工厂对象
解决 BeanB 依赖后BeanA 的早期引用BeanB 的工厂对象
BeanB 创建完成后BeanBBeanA 的早期引用
BeanA 创建完成后BeanABeanB

总结

Spring 通过三级缓存机制解决了单例 Bean 的循环依赖问题,但构造函数注入和原型 Bean 的循环依赖无法解决。在实际开发中,应尽量避免循环依赖,保持代码的清晰和可维护性。如果无法避免,可以使用 Setter 注入或 @Lazy 注解来解决。

http://www.yayakq.cn/news/865544/

相关文章:

  • html5手机网站源码下载教育网站制作费用
  • wordpress建手机网站吗认可服务好的装修公司
  • 做旅游网站北京编程培训机构哪个好
  • 公司做了网站怎么做推广响应设网站多少钱可以做
  • 在线做生存曲线的网站有哪些网站续费价格
  • 惠州+企业网站建设大连的网站设计公司
  • 保定建设局网站有没有免费制作视频的软件
  • 徐州建设网站价格外包的利与弊
  • 金科做的网站莱芜建设局网站
  • 郑州汉狮做网站网络公司杭州知名的网站制作策略
  • 专注昆明网站推广自己的网站怎么做团购
  • 网络架构分几层做优化的网站电话
  • 旅游网站的建设内容牛皮纸东莞网站建设技术支持
  • 怎么在百度建个网站重庆网站建设莉
  • 做汽车保养的网站上制作短视频的软件有哪些
  • 做木业网站怎样起名wordpress显示股价
  • 做vi 设计国外网站企业宣传片观后感
  • 网站列表页框架布局原则近期国际军事新闻
  • 站长之家域名信息查询wordpress主题租房
  • 网站开发的中期工作郑州新闻头条最新消息
  • wordpress iphoto主题黄浦区seo网站建设
  • 网站域名属于哪里管网络开发理论
  • 网站管理助手打开是系统参数配置制作网站具体需要什么材料
  • 手机怎么查看网站代码实现的南京网站建设推广
  • 甘肃网站建设方案服务至上网站seo基本流程
  • 重庆石桥铺网站建设wordpress茶叶模板
  • 成都建站模板网站开发南昌建设医院网站
  • 新建的网站怎么做seo优化30天网站建设实录视频
  • 网站建设和网站搭建哪个好湖南网络推广排名
  • 怎么快速提升网站权重大兴模版网站建设哪家好