首页 > 其他分享 >Spring依赖注入、循环依赖——三级缓存

Spring依赖注入、循环依赖——三级缓存

时间:2024-07-11 19:30:37浏览次数:20  
标签:依赖 Java Spring 330 缓存 JSR 注解 注入

依赖注入

背景:

实例化对象后,需要设置字段,即依赖注入,两种:set方法注入和构造方法注入。

 

流程:

先寻找整个类的注入点,就是打了@autowired的字段或方法,然后根据类型、名称去找

 

常用依赖注入注解辨析:

  • @Inject:来自JSR 330规范。按类型注入。
  • @Resource:是Java EE的一部分。先按名字注入,再按类型注入。
  • @Autowired来自spring。按类型注入,再按名字注入。
  • @Qualifier来自spring。与@autowored一起用,指定如果类型相同,需要注入的类名。
  •  

循环依赖——三级缓存

背景:

a类有b,b类有a。

a实例化,注入b,发现beanMap中没有b,开始生成b,b实例化,注入a,发现beanMap中没有a,所以生成a,生成a需要b,生成b又需要a,所以就无限循环了。

 

解决措施:

a实例化后,就放入map中,这样b就能获取到a了,b就能生成了,就能注入a,a就能接着生成了。但这有个问题,a如果有aop,则a是代理对象,但b中的a是被代理对象。所以就要三级缓存。

 

流程:

1、a实例化后,放入三级缓存map(singletonFactories),注入b,发现没有b

2、需要生成b,实例化b,注入a,从singletonFactories中获取,会执行a中lambda的方法得到a或a的代理对象(如果a有aop,则该方法会返回a代理对象,否则就返回它自己,并把代理对象或者a放入二级缓存map(earlySingletonObjects)中,如果有aop还会放入earlyProxyReferences中记录下),b注入a或a的代理对象,b初始化,b创建好

3、a注入b,a继续生命周期,a初始化,a进行或不进行aop(如果earlyProxyReferences中有a,则说明已经进行了aop就无需进行,否则需要进行aop),把a放入一级缓存(singletonObjects)

 

三级缓存:

一级singletonObjects:放完整生命周期的bean

二级earlySingletonObjects:放未经过完整生命周期的bean。

三级singletonFactories:放lambda表达式。

 

加了3级缓存流程是这样:

a需要注入b,从一级缓存中找b,有就直接获取,没有发现则从二级缓存中找b,找到就返回给a,没有发现,则从三级缓存中调用lambda获取,找到就返回给a,没找到就创建b。

 

JSR

JCP(Java Community Process,Java社区进程)是Java社区的一个重要组织,负责Java技术的标准化工作。JSR(Java Specification Request)是jcp的一个提案。

JSR 330(Java Specification Request 330)是Java社区提出的一个规范,全称为“Dependency Injection for Java”,即Java的依赖注入规范。这个规范主要是为了提供一种标准化的方式来进行依赖注入,以提高代码的可重用性、可测试性和可维护性。

JSR 330,定义了一系列用于依赖注入的注解,如@Inject@Scope@Named等。

  • @Inject:按类型注入。用于标记需要依赖注入的字段、构造方法或方法。
  • @Scope:用于指定bean的作用域,如单例(Singleton)、原型(Prototype)等。不过,需要注意的是,JSR 330的@Scope注解主要用于定义自定义作用域,而具体的作用域实现则依赖于DI框架。
  • @Named:用于为bean提供一个名称,以便在按名称进行注入时使用。类似于Spring的@Qualifier

与Spring的集成

  • 从Spring 3.0开始,Spring框架就支持JSR 330规范中的注解。这意味着开发者可以在Spring应用中使用@Inject等JSR 330注解来进行依赖注入。不过,需要注意的是,虽然Spring支持JSR 330注解,但它也提供了自己的一套注解(如@Autowired@Component@Scope等),这些注解在功能上可能与JSR 330注解有所重叠,但在某些方面可能提供了更多的灵活性和功能。

 

 

标签:依赖,Java,Spring,330,缓存,JSR,注解,注入
From: https://blog.csdn.net/Y_Tinty/article/details/140344706

相关文章

  • 深入解析Spring Boot的application.yml配置文件
    目录引言SpringBoot配置文件简介application.yml的优点基本结构与语法YAML语法基础SpringBoot中application.yml的基本结构常见配置项详解服务器配置数据源配置日志配置其他常见配置环境配置与Profile多环境配置激活Profile高级配置与技巧属性的占位符替换自定......
  • java—Spring框架
    Spring简介        Spring框架由RodJohnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。Spring是什么?      ......
  • Spring Boot项目Jar包加密详解
    目录引言Jar包加密的基础知识为什么需要加密Jar包Jar包加密的基本原理常用的Jar包加密工具ProGuardJavaguardJavaAgentSpringBoot项目Jar包加密实战使用ProGuard对SpringBoot项目进行加密集成Javaguard到SpringBoot项目中通过JavaAgent实现动态加密Jar包加密的......
  • Spring MVC 全面指南:从入门到精通的详细解析
    引言:SpringMVC,作为Spring框架的一个重要模块,为构建Web应用提供了强大的功能和灵活性。无论是初学者还是有一定经验的开发者,掌握SpringMVC都将显著提升你的Web开发技能。本文旨在为初学者提供一个全面且易于理解的学习路径,通过详细的知识点分析和实际案例,帮助你快速上手Sprin......
  • 1.Introduction to Spring Web MVC framework
    WebMVCframework文档:22.WebMVCframework(spring.io)概述WebMVC框架(WebModel-View-ControllerFramework)是一种用于构建Web应用程序的软件架构模式。MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离有助于组织代码和简化开发......
  • Java毕业设计基于Vue+SpringBoot的高校学生评教系统(代码+数据库+文档LW+运行成功)
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍当今社会己进入信息社会时代。信息己经受到社会的广泛关注,被看作社会和科学技术发展的三大支柱;材料、能源、信息;。信息是管理的基础,是进行决策的的基本依据。在一个组织里,信息......
  • Java毕业设计基于Vue+SpringBoot的癌症患者交流平台(代码+数据库+文档LW+运行成功)
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。癌症患者交流平台,主要的模块包括查看首页、轮播图、抗癌故事管理......
  • 已有SpringBoot后端项目 升级为 芋道框架(yudao-cloud)指南
    已有SpringBoot后端项目升级为芋道框架(yudao-cloud)指南启动芋道框架后端:快速启动(后端项目)前端:快速启动(后端项目)注意:必须要下载Redis和Nacaos,在后端的快速启动中有教程启动nacos的命令在教程中有误,没有进行集群部署的nacos要使用以下命令启动startup.cmd-m......
  • Springboot智能购房推荐系统 毕业设计-附源码09040
    摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智能购房推荐系统主要针对房屋......
  • WPF/C#:在WPF中如何实现依赖注入
    前言本文通过WPFGallery这个项目学习依赖注入的相关概念与如何在WPF中进行依赖注入。什么是依赖注入依赖注入(DependencyInjection,简称DI)是一种设计模式,用于实现控制反转(InversionofControl,简称IoC)原则。依赖注入的主要目的是将对象的创建和对象之间的依赖关系的管......