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

news2025/5/17 12:18:36

目录

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 {

    @Test
    public 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
    @Lazy
    public E e1(){
        return new E();
    }

    @Test
    public 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 {

    @Bean
    public F f(){
        return new F();
    }

    @Test
    public 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();
    }

    @Test
    public 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 {
    @Override
    public 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();
    }

    @Test
    public 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.coloradmin.cn/o/1632280.html

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

相关文章

异常处理Exception(一)

文章目录 1、添加异常捕捉2、链式CATCH3、一个CTACH捕捉多个异常4、捕捉所有异常总结 有些代码可以通过语法检查,但运行时会发生错误而崩溃,比如除数是0的情况。对于这类代码,需要使用 TRY, CATCH进行异常捕捉,避免代…

ubuntu24.04 正式放弃VNC

1、ubuntu22.04支持情况 去年9月在22.04中测试发现由于gnome启用Wayland桌面,然而Wayland和vnc兼容不佳,就已经黑屏等问题,当时是vnc和ms-rd(微软远程桌面)两个菜单。 Ubuntu22.04 vnc远程黑屏_ubuntu 远程桌面vnc黑屏-CSDN博客文章浏览阅读…

FreeRTOS之列表

1.FreeRTOS的列表和列表项十分重要。列表类相当于链表,列表项则相当于链表中的节点。列表项的地址是非连续的,列表项的数量可随时修改。在OS中的任务状态和数量会发生改变,因此使用列表可以很好的满足需求。 列表和列表项的相关定义与操作函…

基于51单片机的8路抢答器—计分功能

基于51单片机的8路抢答器 (仿真+程序) 功能介绍 具体功能: 1.主持人按下复位后数码管依次显示选手的编号和分数; 2.显示结束后主持人才可以按开始按键; 3.数码管倒计时10秒,选手开始抢答&a…

Jenkins邮件发送失败问题解决

如下提示为 Extended E-mail Notification开启Debug模式下显示的错误信息, (Debug模式设置方法:Dashboard-> manage Jenkins->configure System)DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 DEB…

Qt窗口

QMainWindow Qt 窗⼝ 是通过 QMainWindow类 来实现的。 QMainWindow 是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃ QWidget 类,并且提供了⼀个预定义的 布局。QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动…

HarmonyOS NEXT应用开发之适配挖孔屏案例

介绍 本示例介绍使用屏幕属性getDefaultDisplaySync、getCutoutInfo接口实现适配挖孔屏。该场景多用于沉浸式场景下。 效果图预览 使用说明 加载完成后顶部状态栏时间和电量显示位置规避了不可用区域。 实现思路 通过setWindowLayoutFullScreen、setWindowSystemBarEnable…

自制贪吃蛇小游戏

此片文章涉及到到控制台设置的相关操作,虚拟键码,宽字符输出等,有些地方大家可能会看不懂,可以阅读以下文章来进一步了解: 控制台程序设置-CSDN博客 效果展示: QQ2024428-181932 源码已放在文章结尾 目录 …

Python | Leetcode Python题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; class Solution:def canJump(self, nums: List[int]) -> bool:n, rightmost len(nums), 0for i in range(n):if i < rightmost:rightmost max(rightmost, i nums[i])if rightmost > n - 1:return Truereturn False

AHB传输---等待传输

等待传输 slave在需要更多时间支持或采样数据时使用HREADYOUT信号插入等待状态。在等待传输期间&#xff0c;master对传输类型和地址的更改受到限制。 1. 在等待状态下传输类型的变化 当slave请求等待状态时&#xff0c;master不得更改传输类型&#xff0c;除非是以下状态&a…

Spring AOP是什么?可以拿它做什么?

Spring AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是Spring框架提供的一种重要特性&#xff0c;它通过在应用程序的横切关注点&#xff08;Cross-cutting Concerns&#xff09;中&#xff0c;将重复性的代码和逻辑分离出来&#xff0c;以…

青年夜校 | 李良济中医课堂,赋能“夜生活”,传承中医药文化

下班后的苏州年轻人都在干什么&#xff1f; 约饭看电影&#xff1f; 宅家打游戏&#xff1f; 最近&#xff0c;一种全新的“夜生活”模式开启啦&#xff01; 那就是—— 去家门口的夜校&#xff0c;学习中医和中药&#xff01; 1 家门口的夜校 解锁正确的中医养生法 4月…

Matlab实现CNN-LSTM模型,对一维时序信号进行分类

1、利用Matlab2021b训练CNN-LSTM模型&#xff0c;对采集的一维时序信号进行分类二分类或多分类 2、CNN-LSTM时序信号多分类执行结果截图 训练进度&#xff1a; 网络分析&#xff1a; 指标变化趋势&#xff1a; 代码下载方式&#xff08;代码含数据集与模型构建&#xff0c;附…

LabVIEW自动剪板机控制系统

LabVIEW自动剪板机控制系统 随着工业自动化的快速发展&#xff0c;钣金加工行业面临着生产效率和加工精度的双重挑战。传统的手动或脚踏式剪板机已无法满足现代生产的高效率和高精度要求&#xff0c;因此&#xff0c;自动剪板机控制系统的研究与开发成为了行业发展的必然趋势。…

消失了一个月,失踪人口回归!

大家好&#xff0c;我是前端队长。前端程序员&#xff0c;2023年开始玩副业。玩过AI绘画&#xff0c;公众号爆文项目&#xff0c;目前在做AI代写&#xff0c;累计变现五位数。 最近比较忙&#xff0c;而且没有意识到持续分享的重要性。 周六的时候&#xff0c;参加了武汉老徐合…

prompt提示词:AI英语词典,让AI教你学英语,通过AI实现一个网易有道英语词典

目录 英语词典提问技巧效果图&#xff1a;提示词&#xff1a; 英语词典提问技巧 随着AI工具的出现&#xff0c;学英语也可以变得很简单&#xff0c;大家可以直接通过AI 来帮助自己&#xff0c;提高记忆单词的效率&#xff0c;都可以不需要网易有道词典了&#xff0c;今天我教大…

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

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

不同状态空间模型的实验对比(二)

对五个下游任务进行了实验比较&#xff0c;包括单/多标签分类、视觉对象跟踪、像素级分割、图像到文本生成和人/车辆再识别。 论文&#xff1a;https://arxiv.org/abs/2404.09516 作者单位&#xff1a;安徽大学、哈尔滨工业大学、北京大学更多相关工作将在以下GitHub上不断更新…

JavaScript 的基本术语大全

文章目录 1、概述2、基本术语2.1、有效负载 (Payload)2.2、ReadableStream2.3、模块系统2.4、DOM (Document Object Model)2.5、事件 (Events)2.6、活动委托 (Event Delegation)2.7、内容安全策略 (CSP)2.8、渐进增强和优雅降级2.9、JSON (JavaScript Object Notation)2.10、AJ…