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

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{@Overridepublic void eat() {System.out.println("猫吃老鼠");}
}
  • Dog
@Component
public class Dog implements Animal{@Overridepublic void eat() {System.out.println("狗吃肉");}
}
  • 使用
  @Autowiredprivate List<Animal> animal;@Testpublic void testOrder(){System.out.println(animal);}

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

使用@Order改变注入顺序

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

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

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

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

这种方式了解即可

@Component
@Order(1)
public class Dog implements Animal, Ordered {@Overridepublic void eat() {System.out.println("狗吃肉");}@Overridepublic 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是单例的,会不会有线程安全问题

在这里插入图片描述

相关文章:

  • 大数据开发中的数据生命周期管理
  • WebRtc实现1V1音视频通话
  • docker私有仓库harbor部署
  • 从零开始学习网络安全渗透测试之Linux基础篇——(四)Linux基本命令
  • 华为云交付模式和技术支持
  • Selenium 监视数据收发
  • k8s-第八节-Helm
  • SpringCloud Feign 报错 Request method ‘POST‘ not supported 的解决办法
  • 【CT】LeetCode手撕—148. 排序链表
  • 2024亚太杯中文赛数学建模B题【洪水灾害的数据分析与预测】思路详解
  • 利用Python破解隔壁家的WiFi密码
  • LabVIEW自动探头外观检测
  • Redis 7.x 系列【17】四种持久化策略
  • 面试知识储备-SpringCloud
  • 《安全大模型技术与市场研究报告》发布,海云安榜上有名
  • angular学习第一篇-----环境搭建
  • canvas 五子棋游戏
  • Fundebug计费标准解释:事件数是如何定义的?
  • Java方法详解
  • java中具有继承关系的类及其对象初始化顺序
  • overflow: hidden IE7无效
  • React Native移动开发实战-3-实现页面间的数据传递
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 山寨一个 Promise
  • 深度学习中的信息论知识详解
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 一个项目push到多个远程Git仓库
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • Linux权限管理(week1_day5)--技术流ken
  • mysql面试题分组并合并列
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • $refs 、$nextTic、动态组件、name的使用
  • (14)Hive调优——合并小文件
  • (2)空速传感器
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C++)八皇后问题
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • .Net - 类的介绍
  • .net core 6 集成和使用 mongodb
  • .net framework profiles /.net framework 配置
  • .NET IoC 容器(三)Autofac
  • .NET技术成长路线架构图
  • @vue-office/excel 解决移动端预览excel文件触发软键盘
  • [ C++ ] STL---stack与queue