Spring学习03-[Spring容器核心技术IOC学习进阶]

IOC学习进阶

  • @Order
    • 使用@Order改变注入顺序
    • 实现Ordered接口,重写getOrder方法来改变自动注入顺序
  • @DependsOn
    • 使用
  • @Lazy
    • 全局设置-设置所有bean启动时候懒加载
  • @Scope
  • bean是单例的,会不会有线程安全问题

@Order

可以改变自动注入的顺序

比如有个animal的接口,里面两个实现类 Cat和Dog。这两个都注册为bean。此时注入的时候,就可以用list来进行接收,表示两个都进行注入。
如果还用animal来进行接收,那就会报错,因为@Autowired根据类型找到两个,然后根据名称找,此时找不到就报错

  • 类型接口
  • animal
public interface Animal {
    void eat();
}
  • 实现类
  • Cat
@Component
public class Cat implements Animal{
    @Override
    public void eat() {
        System.out.println("猫吃老鼠");
    }
}
  • Dog
@Component
public class Dog implements Animal{
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}
  • 使用
  @Autowired
    private List<Animal> animal;

    @Test
    public void testOrder(){
        System.out.println(animal);
    }

在这里插入图片描述
可以看到先输出Cat,再输出Dog(先注入了Cat,再注入了Dog)

使用@Order改变注入顺序

此时我们可以用@Order注解自定义注入顺序

用法:@Order(数值)—数值小的先注入
让Dog先注入,Cat后注入

@Component
@Order(1)
public class Dog implements Animal{
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}
@Component
@Order(2)
public class Cat implements Animal{
    @Override
    public void eat() {
        System.out.println("猫吃老鼠");
    }
}
  • 测试
    可以和上面未加@Order进行对比,加了@Order后Dog先进行了注入
    在这里插入图片描述

实现Ordered接口,重写getOrder方法来改变自动注入顺序

这种方式了解即可

@Component
@Order(1)
public class Dog implements Animal, Ordered {
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

    @Override
    public int getOrder() {
        return 1;
    }
}

@DependsOn

改变bean的创建顺序

比如下面的 B负责数据库连接,A负责数据库查询,肯定是B先创建bean,此时就可以用@DependsOn进行调整两个bean的创建顺序
在这里插入图片描述

使用

  • 不加 @DependsOn注解
  • A:数据库查询
@Component
public class A {
    public A() {
        System.out.println("数据库查询");
    }
}
  • B:数据库连接
@Component
public class B {
    public B() {
        System.out.println("数据库连接");
    }
}

在这里插入图片描述
此时可以看到在不加@DependsOn注解的时候,数据库查询bean先创建,明显不对

  • 加 @DependsOn注解
    因为数据库查询依赖数据库连接所以在数据库查询上加@DependsOn注解
    表示:A依赖B,在创建A的时候先创建B
@Component
@DependsOn("b")
public class A {
    public A() {
        System.out.println("数据库查询");
    }
}
  • 测试
    可以看到,数据库连接先创建,数据库查询后创建
    在这里插入图片描述

@Lazy

懒加载bean,默认是true:表示懒加载,可以设置成false,表示非懒加载
在这里插入图片描述

全局设置-设置所有bean启动时候懒加载

通过配置文件进行设置
在这里插入图片描述

@Scope

默认是单例的
在这里插入图片描述
在这里插入图片描述

bean是单例的,会不会有线程安全问题

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫-豆瓣电影排行榜

获取数据 requests库 获取数据环节需要用到requests库。安装方式也简单 pip install requests 爬取页面豆瓣读书 Top 250 用requests库来访问 import requests res requests.get(https://book.douban.com/top250/) 解析&#xff1a; 导入requests库调用了requests库中的…

网络IO模型之多路复用器.md

多路复用是什么&#xff1f;怎么理解&#xff1f; 本文主要涉及为 程序中处理网络IO时的模型&#xff0c;对于系统内核而言网络IO模型。这里只做普及使用 前置知识&#xff0c;什么是IO&#xff1f;怎么理解IO IO其实就是In和Out。中文翻译是输入和输出&#xff0c;只要涉及到输…

SQL二次注入原理分析

二次注入在测试的时候比较少见&#xff0c;或者说很难被测出来&#xff0c;因为测的时候首先要去找注入的位置&#xff0c;其次是去判断第一次执行的SQL语句&#xff0c;然后还要去判断第二次进行调用的 SQL 语句。而关键问题就出在第二次的调用上面。 下面以一个常用过滤方法…

mmaction2版本适配(Linux)

从cuda到mmcv保姆式教程 &#xff08;数十年踩坑经验&#xff0c;跟着我做&#xff0c;版本不会错~&#xff09; 如果有补充&#xff0c;请评论区评论&#xff0c;后续填坑&#xff01; cuda11.3 下载安装包 wget https://developer.download.nvidia.com/compute/cuda/11.3…

【Linux】多线程(互斥 同步)

我们在上一节多线程提到没有任何保护措施的抢票是会造成数据不一致的问题的。 那我们怎么办&#xff1f; 答案就是进行加锁。 目录 加锁&#xff1a;认识锁和接口&#xff1a;初始化&#xff1a;加锁 && 解锁&#xff1a;全局的方式&#xff1a;局部的方式&#xff1a…

go 学习 之 HTTP微服务示例

1. 背景 学习ing 2. 创建文件&#xff1a;server.go go package mainimport ("github.com/gogf/gf/contrib/registry/file/v2""github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/net/ghttp""github.com/gogf/gf/v2/net/gsvc"&…

Mac 运行 Windows 软件,Parallels Desktop 19和 CrossOver 24全面对比

Parallels Desktop 和 CrossOver 都是能满足你「在 Mac 上运行 Windows 软件」需求的工具。可能很多人都已经知道 Parallels Desktop 是「虚拟机」&#xff0c;但 CrossOver 其实并不是「虚拟机」。这两款软件有相同的作用&#xff0c;但由于实现原理的不同&#xff0c;两者也有…

在线签约如何选择?2024年10款顶级app大比拼

支持电子合同签约的10大app&#xff1a;e签宝、上上签、DocuSign、契约锁、Adobe Sign、法大大、SignNow、安心签、HelloSign、PandaDoc。 无论是企业之间的交易还是个人服务合同&#xff0c;线上电子合同签约提供了一种便捷、高效且安全的方式来处理法律文档。本文将介绍几款优…

django学习入门系列之第四点《案例 博客案例》

文章目录 container面板案例 博客案例往期回顾 container 堆叠到两边 <div class"container-fluid clearfix"><div class"col-sm-9">1</div><div class"col-sm-3">2</div> </div>放在中间 <div clas…

-bash: /snap/bin/docker: 没有那个文件或目录

-bash: /snap/bin/docker: 没有那个文件或目录 解决办法 export PATH$PATH:/usr/bin/docker然后&#xff0c;重新加载配置文件 source ~/.bashrc

【BUUCTF-PWN】7-[第五空间2019 决赛]PWN5

参考&#xff1a;BUU pwn [第五空间2019 决赛]PWN5 //格式化字符串漏洞 - Nemuzuki - 博客园 (cnblogs.com) 格式化字符串漏洞原理详解_printf 任意内存读取-CSDN博客 32位小端排序&#xff0c;有栈溢出保护 运行效果&#xff1a; 查看main函数 存在格式化字符串漏洞 输…

深度学习1

1.支持向量机Support Vector Machine&#xff08;SVM&#xff09;是一种对数据二分类的线性分类器&#xff0c;目的是寻找一个超平面对样本进行分割&#xff0c;广泛应用人像识别&#xff0c;手写数字识别&#xff0c;生物信息识别。 二维空间分割界是一条直线&#xff0c;在三…

校园失物招领系统带万字文档java项目失物招领管理系统java课程设计java毕业设计springboot vue

文章目录 校园失物招领系统一、项目演示二、项目介绍三、万字字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 校园失物招领系统 一、项目演示 校园失物招领系统 二、项目介绍 语言: Java 数据库&…

利用数据集,用机器学习模型对股市预测,聊聊看!

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

[C++][CMake][CMake基础]详细讲解

目录 1.CMake简介2.大小写&#xff1f;3.注释1.注释行2.注释块 4.日志 1.CMake简介 CMake是一个项目构建工具&#xff0c;并且是跨平台的 问题 – 解决 如果自己动手写Makefile&#xff0c;会发现&#xff0c;Makefile通常依赖于当前的编译平台&#xff0c;而且编写Makefile的…

【Pyhton】读取寄存器数据到MySQL数据库

目录 步骤 modsim32软件配置 Navicat for MySQL 代码实现 步骤 安装必要的库&#xff1a;确保安装了pymodbus和pymysql。 配置Modbus连接&#xff1a;设置Modbus从站的IP地址、端口&#xff08;对于TCP&#xff09;或串行通信参数&#xff08;对于RTU&#xff09;。 连接M…

人工智能对网络安全有何影响?

人工智能网络安全在短期、中期和长期如何变化 当今数字时代网络安全的重要性 在谈论人工智能在网络安全中的作用时&#xff0c;必须首先考虑短期影响&#xff0c;因为它们是最明显的&#xff0c;而且它是一个未知的领域&#xff0c;需要超越直接炒作的能力。 因此&#xff0…

叠加的正弦波逼近一个矩形波

叠加的正弦波逼近一个矩形波 flyfish 依次绘制1个、2个、4个和10个正弦波的叠加效果。每个正弦波的频率是基频的奇数倍&#xff0c;且幅度逐渐减小。最终&#xff0c;这些叠加的正弦波将逼近一个矩形波。 import numpy as np import matplotlib.pyplot as plt plt.rcParams[f…

免费办公软件 -- LibreOffice v24.2.4

软件简介 LibreOffice是一款免费且开源的办公软件套件&#xff0c;它为个人和商业用户提供了一套完整的工具&#xff0c;用于处理文本文档、电子表格、演示文稿和其他类型的文件。这款软件兼容 Microsoft Office 的文件格式&#xff0c;如 .docx、.xlsx 和 .pptx&#xff0c;使…

数据结构(3.8)——栈的应用

栈在括号匹配中的应用 流程图 代码 #include <stdio.h> #include <stdlib.h> #define MaxSize 10typedef struct {char data[MaxSize];int top; } SqStack;// 初始化栈 void InitStack(SqStack* S) {S->top -1; // 初始化栈顶指针 }// 判空 bool StackEmpty(…