【Spring】IOC/DI中常用的注解@Lazy、@Scope与@Conditional

目录

1、@Lazy 懒加载bean

1.1、与@component配合使用

1.2、与@Bean注解配合使用

2、@Scope bean的作用域

2.1、不指定@Scope

2.2、指定@Scope为 prototype

3、@Conditional 条件注解

1、@Lazy 懒加载bean

        @Lazy用于指定单例bean实例化的时机,在没有指定此注解时,单例bean会在容器初始化时就被创建。而当使用此注解后,单例对象的创建时机会在该bean在被第一次使用时创建,并且只创建一次。第二次及以后获取使用就不再创建。

        在实际开发场景中,并不是所有bean都要一开始就被创建的,有些可以等到使用时才创建。此时就可以使用该注解实现。此注解只对单例bean有用,原型bean时此注解不起作用。

        原型bean是在每次请求时都会创建一个新的实例,而不像单例bean那样只有一个实例。因此,使用@Lazy注解对原型bean没有实际意义,因为即使不使用该注解,每次请求都会创建一个新的实例。所以,@Lazy注解只对那些在容器初始化时就被创建的单例bean有用。

@Lazy注解可以作用在类上、方法上、构造器上、方法参数上、成员变量中。

@Lazy注解作用于类上时,通常与@Component及其衍生注解配合使用。
@Lazy注解作用于方法上时,通常与@Bean注解配合使用。
 

示例:

没有使用@Lazy注解时

@Component  //把E配置成bean
public class E {public E(){//当调用这个无参构造函数创造bean时,就会执行这条打印语句System.out.println("E");}
}//测试类
@SpringBootTest(classes = TestLazy.class)
@ComponentScan("com.lt.lazyDemo")//我的E类是在"com.lt.lazyDemo"这个包下,所以我这里填这个路径,你们改成自己的E类的路径
public class TestLazy {@Testpublic void test(){}
}

1.1、与@component配合使用

@Component
@Lazy
public class E {public E(){//当调用这个无参构造函数创造bean时,就会执行这条打印语句System.out.println("E");}
}//测试类的代码不变

1.2、与@Bean注解配合使用

//把E类上面的注解都注释掉//测试类
@SpringBootTest(classes = TestLazy.class)
//使用@Bean的方式配置bean时,@ComponentScan注解就可用可不用了
//@ComponentScan("com.lt.lazyDemo")
public class TestLazy {@Bean@Lazypublic E e1(){return new E();}@Testpublic void test(){}}

使用@Lazy注解的好处:在spring中,默认的bean会在启动的时候就会创建,如果说某些Bean非常大,如果在启动的时候就创建就会影响启动速度,就可以把那些大的Bean设置成懒加载,这样可以优化启动速度

2、@Scope bean的作用域

        @Scope注解是 Spring IOC 容器中的一个作用域,在 Spring IOC 容器中,他用来配置Bean实例的作用域对象。@Scope 具有以下几种作用域:

singleton 单实例的(单例)(默认)

----全局有且仅有一个实例

prototype 多实例的(多例)

---- 每次获取Bean的时候会有一个新的实例

reqeust   同一次请求

----request:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效

session   同一个会话级别

---- session:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效

这里只需要掌握singleton和prototype这两种就行了,其他两种感兴趣的可以自己去了解了解

@Scope注解作用于类上时,通常与@Component及其衍生注解配合使用。

@Component
@Scope(value = "prototype")
public class F {public F(){System.out.println("F");}
}

@Scope注解作用于方法上时,通常与@Bean注解配合使用。

@Bean
@Scope(value = "prototype")
public F f(){return new F();
}

@Scope注解使用示例:

2.1、不指定@Scope

        在不指定@Scope的情况下,所有的bean都是单实例的bean,而且是饿汉模式加载(容器启动实例就创建好了)

public class F {public F(){System.out.println("F");}
}//测试类TestScope
@SpringBootTest(classes = TestScope.class)
public class TestScope {@Beanpublic F f(){return new F();}@Testpublic void test(@Autowired F f, @Autowired F ff, @Autowired F fff){System.out.println(f);System.out.println(ff);System.out.println(fff);}
}

2.2、指定@Scope为 prototype

        指定@Scope为 prototype 表示为多实例的,是懒汉模式加载(IOC容器启动的时候,并不会创建对象,而是 在第一次使用的时候才会创建)

//F类的代码没有变//测试类TestScope
@SpringBootTest(classes = TestScope.class)
public class TestScope {@Bean// 默认单例@Scope("singleton")// @Scope("prototype")多例@Scope(value = "prototype")public F f(){return new F();}@Testpublic void test(@Autowired F f, @Autowired F ff, @Autowired F fff){System.out.println(f);System.out.println(ff);System.out.println(fff);}
}

        多例模式会比单例模式对内存造成更大的一个使用,内存开销会比较大。但是有时候不得不使用多例模式,因为单例模式在有些情况下可能会造成线程不安全

3、@Conditional 条件注解

        @Conditional注解:可以用在任何类型或者方法上面,通过@Conditional注解可以配置一些条件判断,当所有条件都满足的时候,被@Conditional标注的目标才会被spring容器处理。

        比如可以通过@Conditional来控制bean是否需要注册,控制被@Configuration标注的配置类是需要需要被解析等

        @Conditional 注解上有一个 value 属性,其值只能为 Condition 类型的数组,使用 @Conditional 时必须进行指定。Condition 是指具体的条件,条件是否匹配由 Condition 进行控制,其是一个接口,需要我们自己实现。

@Conditional使用的3步骤

(1)自定义一个类,实现Condition或ConfigurationCondition接口,实现matches方法

(2)在目标对象上使用@Conditional注解,并指定value的值为自定义的Condition类型

(3)启动spring容器加载资源,此时@Conditional就会起作用了

示例:

//自定义类ConditionalService
public class ConditionalService {public ConditionalService(){System.out.println("ConditionalService");}
}//Condition接口的实现类MyCondition
public class MyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return true;  //返回true为bean生效,false为bean不生效}
}@SpringBootTest(classes = TestConditional.class)
public class TestConditional {@Bean//必须指定一个实现了Condition接口的类,由matches方法的返回值决定当前Bean是否生效@Conditional(MyCondition.class)public ConditionalService conditionalService(){return new ConditionalService();}@Testpublic void test(@Autowired(required = false) ConditionalService conditionalService){System.out.println(conditionalService);}
}

推荐:

【Spring】IOC/DI中常用的注解@Order与@DependsOn-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/138167160?spm=1001.2014.3001.5501【Spring】依赖注入(DI)时常用的注解@Autowired和@Value_配置类 使用@autowired 类型注入-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137784706?spm=1001.2014.3001.5501【Java网络编程】TCP通信(Socket 与 ServerSocket)和UDP通信的三种数据传输方式_socket tcpserver-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137926277?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue校园竞赛管理系统的设计与实现

项目介绍: 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,竞赛信息因为其管理内容繁杂,管理数量繁多导致手工进行…

安卓常用组件(启停活动页面、活动之间传递信息、收发应用广播、操作后台服务)

启停活动页面 Activity的启动和结束 页面跳转可以使用startActivity接口,具体格式为startActivity(new Intent(this, 目标页面.class));。 关闭一个页面可以直接调用finish();方法即可退出页面。 Activity的生命周期 页面在安卓有个新的名字叫活动,因…

微软ML Copilot框架释放机器学习能力

摘要:大模型席卷而来,通过大量算法模型训练推理,能根据人类输入指令产生图文,其背后是大量深度神经网络模型在做运算,这一过程称之为机器学习,本文从微软语言大模型出发,详解利用大型语言模型&a…

取得Claude模型的Key

目录 1.登录Claude \ Anthropic。需要美丽国IP。 2.取得Key 3.可用模型 4.帮助文档地址 5.使用这个key 6.取得Credit 1.登录Claude \ Anthropic。需要美丽国IP。 2.取得Key 3.可用模型 4.帮助文档地址 https://docs.anthropic.com/claude/docs/intro-to-claude --------…

前后端分离,使用sa-token作为安全框架快速搭建一个微服务项目

之前写过一个单体项目,现在想把它升级为微服务项目。在拆分升级的过程中发现了很多问题,本次就来记录一下遇到的问题和解决方法。(这篇文章只是记录一下拆分项目的基础架构,并使用sa-token做微服务项目的安全框架,快速…

upload-labs后续(14-)

图片马 在图片中加入木马,然后上传让浏览器解析,达到上传木马的目的 制作图片马:可以在notepad或者winhex中打开文件,在文件头中加入图片的文件头,再在文件末尾加入木马即可。 图片文件头如下: 1.Png图片…

学生党学习亚马逊云科技AWS、求职上岸就申AWS Cloud Club队长!

毕业了怎么找工作?该怎么学AWS?这是同学们最关心的问题。最近AWS推出的Cloud Club校园社区计划就可以完美解决这些问题! 🏫AWS校园社区计划是在学校构建校园社团(全球学校),带着大家学最热的开发、AI/ML技术&#xff0…

IDEA主题美化【保姆级】

前言 一款好的 IDEA 主题虽然不能提高我们的开发效率,但一个舒适简单的主题可以使开发人员更舒适的开发,时常换一换主题可以带来不一样的体验,程序员的快乐就这么简单。话不多说,先上我自己认为好看的主题设置。 最终效果图: 原…

《机器学习by周志华》学习笔记-线性模型-03

1、多分类学习 1.1、背景 我们在上一节介绍了「线性判别分析(LDA)」,LDA的从二分类任务可以推广到多分类任务中。 而现实中常遇到的多分类学习任务。有些二分类的学习方法可以直接推广到多分类,但是更多情况下是基于一些策略,利用二分类学习器来解决多分类的问题。 1.…

OpenVINO安装教程 Docker版

从 Docker 映像安装IntelDistribution OpenVINO™ 工具套件 本指南介绍了如何使用预构建的 Docker 镜像/手动创建镜像来安装 OpenVINO™ Runtime。 Docker Base 映像支持的主机操作系统: Linux操作系统 Windows (WSL2) macOS(仅限 CPU exectuion) 您可以使用预…

机器学习作业3____决策树(CART算法)

目录 一、简介 二、具体步骤 样例: 三、代码 四、结果 五、问题与解决 一、简介 CART(Classification and Regression Trees)是一种常用的决策树算法,可用于分类和回归任务。这个算法由Breiman等人于1984年提出,它…

如何让Ubuntu上的MySQL开发更便捷

前言 作为一款开源的数据库开发与数据库管理协同工具,(OceanBase Developer Center,简称ODC),针对MySQL数据源,已提供了涵盖SQL开发、变更风险管控、数据安全合规等多个方面的功能,从而为MySQL…

新媒体运营-----短视频运营-----PR视频剪辑----视频调色

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1. Lumetri调色,明暗对比度2. Lumetri调色,创意与矢量示波器2.1 创意2.2 矢量示波器 3. L…

视频美颜SDK与主播美颜工具的技术原理与应用场景分析

在直播视频领域中,视频美颜SDK和主播美颜工具发挥着至关重要的作用。本文将探讨这些工具的技术原理及其在不同应用场景中的应用。 一、视频美颜SDK的技术原理 1.1 图像处理技术 视频美颜SDK的核心技术之一是图像处理技术。根据用户设定的美颜参数进行相应的调整。…

Meta Llama 3 性能提升与推理服务部署

利用 NVIDIA TensorRT-LLM 和 NVIDIA Triton 推理服务器提升 Meta Llama 3 性能 我们很高兴地宣布 NVIDIA TensorRT-LLM 支持 Meta Llama 3 系列模型,从而加速和优化您的 LLM 推理性能。 您可以通过浏览器用户界面立即试用 Llama 3 8B 和 Llama 3 70B(该…

SpringBoot 快速开始 Dubbo RPC

文章目录 SpringBoot 快速开始 Dubbo RPC下载 Nacos项目启动项目的创建创建主项目接口定义服务的创建Dubbo 服务提供者的创建服务的消费者创建 添加依赖给 Provider、Consumer 添加依赖 开始写代码定义接口在 Provider 中实现在 Consumer 里面使用创建启动类 注册中心配置启动 …

YOKOGAWA横河手操器维修hart通讯器YHC5150X-01

横河手操器设置注意事项:内藏指示计显示选择与单位设置 有如下 5 种显示模式及单位设置百分比显示、用户设置显示、用户设置和百分比交替显示、输入压力显示、输入压力和百分比交替显示。即应用在当没有输入时操作要求输出为20mA引压方向设置右/左侧高压&#xff0c…

Docker容器:数据管理与镜像的创建(主要基于Dockerfile)

目录 一、Docker 数据管理 1、数据卷(Data Volumes) 2、数据卷容器(DataVolumes Containers) 二、容器互联(使用centos镜像) 三、Docker 镜像的创建 1、基于现有镜像创建 2、基于本地模板创建 3、基…

QT Windows 实现调用Windows API获取ARP 表

简介 使用ping方式获取网络可访问或者存在的设备发现部分会无法ping通但实际网络上存在此设备, 但使用arp -a却可以显示出来, 所以现在使用windows API的方式获取arp 表。 实现 参考Windows提供的示例转化成Qt Qt .pro LIBS -liphlpapiLIBS -lws2_32…

R-Tree: 原理及实现代码

文章目录 R-Tree: 原理及实现代码1. R-Tree 原理1.1 R-Tree 概述1.2 R-Tree 结构1.3 R-Tree 插入与查询 2. R-Tree 实现代码示例(Python)结语 R-Tree: 原理及实现代码 R-Tree 是一种用于管理多维空间数据的数据结构,常用于数据库系统和地理信…