spring提前加载,懒加载,bean的作用域和注入注解讲解

news2024/12/23 3:40:16

前言

sping知识随笔笔记;spring提前加载,懒加载,bean的作用域和注入注解讲解

这里写目录标题

  • 前言
  • 1 depends-on
  • 2 bean的作用域
  • 3 lazy-init 懒加载
  • 4 Autowrite和Resource的区别和使用

1 depends-on

depends-on 是提前加载,比如在实体类a中 depends-on=“d,c,b” 就会按照顺序优先执行 d c b a;

使用场景

A在实例化之前必须要实例化B ,但是A 并没有使用B实例化的对象的情况下,使用Depends-on

如果 A使用了B的实例,那么使用构造器注入或者其它注入方式更好,可以直接获取到实例化后的对象。

比如说,你的DAO Bean实例化之前你必须要先实例化Database Bean,DAO Bean并不需要持有一个Database Bean的实例。因为DAO的使用是依赖Database启动的,如果Database Bean不启动,那么DAO即使实例化也是不可用的。这种情况DAO对Database的依赖是不直接的。

除了在DAO上使用构造函数注入Database Bean以外,Spring没有任何依赖注入的关系能够满足上面的情况。但是DAO也许根本不需要Database的实例被注入,因为DAO是通过JDBC访问数据库的,它不需要调用Database 上的任何方法和属性。

通过定义depends-on=”database”可以控制Sping实例化dao的顺序。在任何时候Spring总会保证实例化DAO之前先实例Database。
通常depends-on常常应用在上面的场景中。如果DAO depend-on Database的同时需要得到Database的实例,那么使用构造函数注入是一个比较好的解决办法。因为构造函数注入的方式是要先实例化目标对象依赖的对象然后在实例化目标对象。

演示代码

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 4    "http://www.springframework.org/dtd/spring-beans.dtd">
 5 <beans>
 6     <bean name="dao" class="research.spring.beanfactory.ch3.Dao" depends-on="database">
 7     </bean>
 8     <bean id="database" class="research.spring.beanfactory.ch3.Database">
 9     </bean>   
10 </beans>

注意事项

sping中不允许循环引用 A depends-on B ,B depends-on A。
但是允许 连续的提前初始化 A depends-on B ,B depends-on C

2 bean的作用域

bean的作用域分为四块,经常使用的是singleton和prototype作用域
当声明一个bean的时候就需要指定bean的作用域,不同的作用域存在巨大的差异,默认是singleton

singleton : 在spring ioc容器之中只会有一个bean实例,bean以单例为主存在。

prototype :每次使用的时候都会返回一个新的bean实例,相当于每次调用getBean() 时,都调用了new Bean() 方法。

request : 顾名思义和请求有关,每次请求都会创建一个新的bean。

session : 顾名思义和session有关,相同的一个session下返回相同的bean,不同的session下返回不同的bean实例

global-session : global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。

请添加图片描述

3 lazy-init 懒加载

ApplicationContext 默认会将所有属性为singleton bean在启动时全部加载到容器中,这样做的好处是我们在使用的时候会快速响应,但是启动的时候需要加载过多的东西,可能会导致启动时间较长
同时还有一个好处,就是在启动的时候我们就可以发现那些属性在装配的时候会出现问题

对于一些体积较大,使用较少的bean我们可以通过lazy-init让它在被调用的时候再去加载,
spring实现lazy-init的方法有很多,比如再sping中有一个注册表,类似与map集合,有key和value
value就是bean。sping通过先创建响应的key,当key真正被调用的时候,调用new bean() 来创建响应的对象。

因为lazy-init懒加载 是在该类第一次被调用的时候加载,如果其它的singleton bean内引用了懒加载的bean。那么在applicationContext的时候两个bean都会被加载。这也lazy-init第一次被调用的时候加载。

4 Autowrite和Resource的区别和使用

@Autowrite()和@Resource都是用来注入对象的,最大的区别就是Autowrite默认按照类型来匹配而Resource默认按照name来匹配。

Resource有两个重要属性,一个是type,一个是name。spring把name属性对象了bean的name(id)。把type对应了bean的type(一般就是我们的类名)。
当@Resource中同时指定了name和type,spring会同时匹配查找对应的bean,找不到则抛出异常。
当@Resource指定了type,则按照type去查找指定的bean,找不到或者找到多个都会抛出异常。
当@Resource指定了name,则按照name查找,找不到则抛出异常。
当@Resource都没有指定,则先按照name进行匹配,如果使用在变量上,一般将变量名作为name查找。如果作用在set()方法上,则会使用属性名作为name。 如果没有匹配上,则退回使用type再进行匹配

@Autowrite则默认按照类型进行匹配,也可以作用再变量和set方法上。默认情况下要求bean必须存在,如果要允许null值,可以设置require=false。# 5 Anno

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

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

相关文章

关于node.js版本切换nvm的命令和安装

首先是安装,第一步,搜索下方链接地址下载Releases coreybutler/nvm-windows GitHub 安装应用下载好后直接安装就可以了,或者下载一个压缩包,在下载安装之前建议先将之前下载的node版本给删除,否则会报错。 上面的操作都结束后,那么,下面就需要通过管理员的权限去查…

外汇天眼:利空美元!2023年美国经济将如履薄冰?各大银行预测整体不乐观!

高盛表示&#xff0c;美国经济可能避免衰退。摩根士丹利预计&#xff0c;美国经济在2023年只是避开了衰退&#xff0c;但着陆并不那么软。瑞士信贷认为&#xff0c;美国明年可以避免经济下滑。摩根大通警告称&#xff0c;明年很有可能出现经济衰退。美国银行预测2023年第一季度…

大学宿舍四位舍友皆为软测,3年后的现状~

笔者最近收到测试员好友小H的分享&#xff0c;临年关&#xff0c;他参加了一场大学舍友毕业3年后的聚会&#xff0c;感慨良多。 从2019年至今&#xff0c;这已经是毕业的第3个年头了。小H的寝室大多来自五湖四海&#xff0c;毕业后&#xff0c;能够相聚的时间也少之又少&#…

Android -- 每日一问:如何设计一个照片上传 app ?

经典回答 把自己放在一个面试官的角度&#xff0c;自己先实现一次这个 App &#xff0c;然后自己总结一下你在这次实现中需要哪些能力、需要注意哪些事项。最后&#xff0c;再回过头来看&#xff0c;如果你是面试官&#xff0c;你希望面试者怎么回答才算是符合你的标准的&…

el-table 列的动态显示与隐藏

目录 业务场景 官方链接 实现效果图 使用框架 代码展示 template代码 ①、为什么要给el-table绑定【:key"reload"】&#xff1f; ②、为什么给每个绑定【key"Math.random()"】呢&#xff1f; ③、为什么列改变之后要添加【reload Math.random();…

【HarmonyOS】调测助手安装失败10内部错误

关于鸿蒙开发通过应用调测助手向watch gt 3 手表安装hap时报错。 问题背景&#xff1a; 鸿蒙开发&#xff0c;使用新建工程的helloworld 没有其他修改&#xff0c;生成hap包。然后通过应用调测助手向watch gt 3 手表安装hap时提示 安装失败:10.内部错误。 Sdk&#xff1a; a…

Shiro之授权

授权 1、角色认证 在controller层创建接口 使用shiro中的注解RequiresRoles指定能访问的角色名称 /*** 登录认证角色*/ RequiresRoles("admin") GetMapping("/userLoginRoles") ResponseBody public String userLoginRoles(){System.out.println("…

54 线程最外层异常的处理

前言 之前在 kafka 消费者客户端的一个 case 中曾经看到了这样的了一个情况 我没有配置 "group.id", 然后 kafka 客户端抛出了 InvalidGroupIdException 然后 输出的日志信息 除了类型, 其他 什么都没有, 主要是 么有堆栈信息 这里 来大致看一下 这个问题, 以及…

WooCommerce Product Feed指南 – Google Shopping和Facebook[2022]

在过去十年中&#xff0c;在线购物一直在增加。全球超过 85% 的人更喜欢网上购物而不是光顾实体店。 许多 WooCommerce 商店都做得非常好&#xff0c;销售额是大约几年前的三倍。 您是否知道您也可以立即轻松地将商店销售额翻三倍&#xff1f; 秘诀是什么&#xff1f; 好吧&…

【网络安全】浅识 SQL 注入

前言 SQL 注入&#xff08;SQL Injection&#xff09;是发生在 Web 程序中数据库层的安全漏洞&#xff0c;是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理&#xff0c;导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外…

AcrGIS Pro一键出图

简介 日常工作中我们经常遇到批量出图的场景,比如对某个县下的各个乡镇分别按照其行政区范围出图、对某个流域/河流按照一定方向纵横的网格排布顺序出图等等要求,ArcGIS Pro对于上述需求提供了一个良好的解决方案——地图系列! 那么应该如何创建一个地图系列呢?ArcGIS Pro…

我不是浮躁,只是迷茫,北大毕业转行学编程

北大毕业的我选择去学习编程了&#xff01;&#xff01;&#xff01; 没有希望的地方&#xff0c;就没有奋斗。于千万人之中遇见它&#xff0c;于千万年之中&#xff0c;时间的无涯的荒野里&#xff0c;没有早一步&#xff0c;也没有晚一步&#xff0c;刚巧赶上了&#xff0c;那…

9_SpringMVC_作用域传参

PageContext对象 作用域范围:当前jsp页面内有效 request对象 作用域范围:一次请求内。 作用: 解决了一次请求内的资源的数据共享问题 session对象 作用域范围:一次会话内有效。 说明:浏览器不关闭,并且后台的session不失效&#xff0c;在任意请求中都可以获取到同一个se…

RV1126笔记十:RTMP单路推流

若该文为原创文章,转载请注明原文出处 一、介绍 使用ffmpeg把RV1126采集到的视频和音频以RTMP方式推流到服务器,并播放。 视频为h264格式,音频为AAC格式,利用的是RV1126硬件编码,缩短时间,在局域网内测试,实现200毫秒内实时播放预览。 二、流程图 说明: RTMP推流…

Spring MVC【返回数据与请求转发和重定向】

Spring MVC【返回数据与请求转发和重定向】&#x1f34e;一. 返回数据&#x1f352;1.1 返回静态页面&#x1f352;1.2 返回一个非静态页面&#x1f352;1.3 返回text/html类型页面&#x1f352;1.4 返回JSON对象&#x1f352;1.5 实现计算器功能&#x1f352;1.6 使用ajax方式…

RV1126笔记十一:RTMP多路推流

若该文为原创文章,转载请注明原文出处。 一、介绍 在前面,已经了解了单路推流的方式了,也成功的推流和接收到RTMP流,我们把单路扩展成多路,实际方法是和单路相同的,只是多增加了参数和线程数,把ffmpeg参数多复制几路,推流线程多开几个,那就实际了多路推的方式了,具…

视图便捷类(QListWidget,QTableWidget,QTreeWidget)

常见的视图便捷类&#xff1a; QListWidget 列表QTableWidget 表格QTreeWidget 树列表便捷类&#xff1a;QListWidget &#xff08;继承自QListView&#xff09; 构造函数&#xff1a; 常用函数: addItem()添加项目addItems()添加多个项目count()项目的数量currentItem()…

微内核、宏内核、内核模块、printk

文章目录一、微内核和宏内核二、内核模块三、内核模块code四、Makefile注意注&#xff1a;&#xff0c;?, : 区别五、prink查看prink打印优先级修改printk的打印优先级六、内核模块参数module_param与module_param_array宏定义的使用七、内核符号表--全局共享函数接口与变量1.…

2022年最新中国科学院期刊分区表变化 | 生物类、医学类

fenqu❝早上刷到了新发布的《2022年中国科学院文献情报中心期刊分区表》&#xff08;https://mp.weixin.qq.com/s/QVfwnGPCjvOaLtBvGM184g&#xff09;&#xff0c;今天利用有限的非卧床时间浅爬了一下生物和医学大类2022和2021年的数据&#xff0c;做个简单的对比。&#xff0…