Spring @Lazy批注用例

Spring框架几乎可以毫不费力地为您解决许多常见的编程问题,但是它的某些功能比其他功能鲜为人知。 在本文中,我们将仔细研究属于该组的@Lazy批注。 阅读了几个示例之后,您应该能够将注释应用于日常开发任务。

1. @懒豆初始化

Spring的默认行为是在应用程序启动时创建所有定义的bean。 如果我们考虑到这样的初始化可能会非常耗时的事实,那么在用户开始负担服务器负担之前执行繁重的操作似乎是合理的。

但是,我们是否真的总是需要将所有应用程序组件加载到内存中? 您可能听说过帕累托原理及其适用于软件开发的事实 。 在识别出较少使用的功能之后, 值得考虑对连接的bean进行延迟初始化,尤其是当它们消耗宝贵的资源时

如何使豆子变得懒惰? 根据声明此类bean的方式,有两种选择。 如果声明中使用@Bean注释的@Configuration类,你就必须与@Lazy标注来标记它:

@Configuration
class SomeConfig {@Lazy@BeanLazyResource lazyResource() {return new LazyResource();}}

如果Bean使用组件注释之一,并且由组件扫描过程发现,则@Lazy注释可以直接在Bean类中使用:

@Lazy
@Component
class LazyResource {//...
}

@Lazy也可以直接在@Configuration类上使用。 在这种情况下, 该类中定义的所有@Bean对象都会被延迟初始化。

值得记住的是, @Lazy 标记bean 并不意味着其依赖项也被延迟了初始化。 如果您对懒豆图初始化感兴趣,可以通过以下方法实现:

2. @惰性注入–延迟首次创建bean的时间

在bean定义旁边, @Lazy批注还可用于注入点,例如构造函数,构造函数的参数,字段和setter 。 下面是一个对整个构造函数进行延迟注入的示例( 由于从Spring 4.3开始不再使用@Autowired注释,因此省略了它),这意味着所有定义的依赖项都将受到注释的影响。

@Component
class RootResource {private final ResourceDependency dependency;@LazyRootResource(ResourceDependency dependency) {this.dependency = dependency;}}

无论使用哪种注入方法,在所有情况下都将提供代理对象,而不是引用实际依赖项。

重要的是要理解, 如果一个关系用@Lazy标记,这并不意味着要推迟依赖bean的创建。 如果从属bean没有被@Lazy本身标记,它将由Spring容器急切地创建。 这种行为得出的结论是, 延迟注入应该主要与延迟初始化一起使用

让我们考虑一个示例,其中有两个相关的bean。 第一个bean标记有@Lazy

@Lazy
@Component
class LazyResource {//...
}

急于初始化的另一个bean取决于第一个,但是注入点标记为@Lazy:

@Component
class RootResource {private final LazyResource dependency;@LazyRootResource(LazyResource dependency) {this.dependency = dependency;}void useLazyDependency() {dependency.use();}}

在所描述的方案中,当创建RootResource类的新实例时,其依赖关系未初始化。 LazyResource的新实例是在实际需要时构建的 。 在此示例中,这是第一次调用useLazyDependency()方法的时刻。 通过从RootResource的构造函数中删除@Lazy ,必须在注入之前执行LazyResource Bean的初始化。

3.使用@Lazy注入解决循环依赖

应用程序中的循环依赖关系被认为是一种不良的设计模式,但是,如果您没有看到所面临问题的任何替代解决方案,那么惰性注入可能会派上用场。

一旦您尝试在两个bean之间创建一个循环,Spring将通过类似于以下所示的消息通知您有关此问题的信息:

The dependencies of some of the beans in the application context form a cycle:
┌─────┐
|  peerResource defined in file [...\dolszewski\blog\PeerResource.class]
↑     ↓
|  someResource defined in file [...\dolszewski\blog\SomeResource.class]
└─────┘

为了解决这个问题,bean不必被延迟初始化。 @Lazy批注仅在注入点之一上是必需的。 首先将创建一个将其依赖项标记为懒惰的依赖项。

4.渴望的豆与@Lazy(false)

尽管与@Lazy批注的第一个关联是按需创建bean的可能性,但它也可以实现相反的效果-渴望初始化。 当您遇到@Lazy批注并了解其存在时,您很可能没有注意到它实际上可以接受其他布尔值属性,该属性指示是否应进行惰性初始化。

您的第二个想法可能是使用@Lazy(false)实际上是无用的,因为您只需删除注释即可实现相同的效果,对吗? 如果考虑使用Spring的简单默认行为,那是绝对正确的,但是生活并不总是那么简单。

当应用程序的启动确实很慢时,您可以考虑对所有托管bean进行延迟初始化,以改善开发体验。 但是, 有时有bean应该始终进行初始化,即使已使用 @ComponentScan(lazyInit = true) 全局禁用了急切的初始化 。 那就是@Lazy(false)进来的时候。

@Lazy(false)
@Component
class AlwaysEagerResource {//...
}

结论

熟悉@Lazy批注的要求不是很高,因为它仅接受一个属性,并且只能在少数地方使用。 但是,考虑到它的多种用途,值得意识到它的存在。 如果您发现该文章有用,请与您的同事和同事分享。 您知道@Lazy扮演主要角色之一的其他有用技巧吗? 如果您愿意,请立即在评论中添加评论。

翻译自: https://www.javacodegeeks.com/2018/03/spring-lazy-annotation-use-cases.html

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

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

相关文章

MATLAB入门(三)

求平均值 两种方法生成列向量 读取文件 将数据保存到小数点后两位 result round(M,2);将矩阵中的每个元素都三次方 x3 x.^3将矩阵中的数据按照升序排序 sort(data)创建一个行变量计算每一个列变量的平均值 avg mean(data)diff函数 Y diff(X) 计算沿大小不等于 1…

Java学习 第三章 数组(一)一维数组

第三章 数组 3-1 数组的概述 数组:多个相同类型数据按一定的顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。 数组相关概念: 数组名、下标(索引、角标)、元素、数组的长度 数…

几个有用的word小技巧,保准提升效率~

这几天改报告改到头秃。年底了,实验室各种项目在结项,作为一名研一新生,理所应当地承担起了体力活的工作。主要负责项目报告的研究背景调研、报告汇总、格式调整等。 格式调整,看起来非常简单的一项工作,却是最费时费…

Java学习 第三章 数组(二)多维数组

多维数组的使用 由数组构成的数组 二维数组: ① 二维数组的声明和初始化 ② 如何调用数组的指定位置的元素 ③ 如何获取数组的长度 ④ 如何遍历数组 ⑤ 数组元素的默认初始化值 :见ArrayTest1.java 数组元素是整形:0 数组元素是浮点型&…

Spring Boot 2中的功能切换

无论您是否喜欢,软件开发都是一项协作活动。 整合工作一直被妖魔化,并被视为必不可少的邪恶。 有几种方法可以解决有效集成的挑战。 功能切换开关属于该组。 在本文中,您将在实践中看到如何在Spring Boot应用程序中使用功能切换(也…

Java学习 第三章 数组(三)排序算法

** Java学习 第三章 数组(三)排序算法 ** 主要内容:排序算法、排序算法横向比较、Arrays工具类的使用、数组常见异常 1.数组中涉及到的常见算法:排序算法 1.1 排序算法分类:内部排序和外部排序 1.2 十大内部排序算…

xmx java_为什么我的Java进程比Xmx消耗更多的内存?

xmx java你们有些人去过那里。 您已经在启动脚本中添加了-Xmx选项,并放松了下来,因为您知道Java进程将不会消耗比经过微调的选项所允许的更多的内存。 然后,您感到非常讨厌。 要么自己检查开发/测试框中的过程表,要么事情真的变坏…

卫星通信系统概述

卫星通信系统指通过在轨人造卫星作为中继站对无线电信号进行转发,实现地面及空间等用户之间信息传输的系统。卫星通信系统组成包括空间段及地面段,系统组成如图所示。其中空间段主要指在轨卫星、对在轨卫星进行操控的地面站,这些地面站主要实…

Opnet入门

一、opnet快速入门 1.系统界面&文件菜单说明 2.常用文件名后缀及描述 3.Opnet建模层次 用户只有一种节点域模型 三、 OPNET Modeler网络仿真机制 1.事件的属性 每次点击next会出现以下界面: 2.事件的执行 调度型:按照正常程序调度事件 强制性&…

【强化学习】Policy Gradient原理

1.Policy Gradient和DQN系列强化算法最大的区别在于: DQN系列基于Value,也就是说执行完所有的动作并保存所得到的价值,根据这些价值计算出最优价值函数,并以此选择动作,最终获得一个特定的策略。 Policy Gradient基于策…

ajax的url怎么将后缀补上_蜂蜜杏仁怎么做?杏仁和蜂蜜腌制方法

蜂蜜杏仁怎么做?杏仁和蜂蜜腌制方法蜂蜜杏仁是一种非常好吃的小零食,很多小可爱都喜欢吃蜂蜜杏仁。不过有些时候忘记补货,就会断粮,于是大家都想要在家里自制蜂蜜杏仁。不过你知道蜂蜜杏仁应该怎么做吗?蜂蜜杏仁的做法其实并不难&#xff0…

【强化学习】Actor Critic原理

PG算法是一种只基于policy的一种方法,存在的问题就是该算法需要完整的状态序列,且单独对策略函数进行迭代更新,不太容易收敛。 Actor-critic方法呢是一种将 策略(Policy Based)和价值(Value Based)相结合的方法。下面继续来理一下AC方法的思路…

【强化学习】A3C原理

先解释一下什么叫异步、什么叫并发: **异步:**和同步相对,同步是顺序执行,而异步是彼此独立,在等待某个事件的过程中继续做自己的事,不要等待这一事件完成后再工作。线程是实现异步的一个方式,异…

jboss eap 7.0_创建委托登录模块(用于JBoss EAP 6.1)

jboss eap 7.0[如果只想查看代码,请向下滚动] 动机 在RHQ中,我们需要一个安全域,该域可用于通过容器管理的安全性来保护REST-api及其Web应用程序。 过去,我只是使用经典的DatabaseServerLoginModule对DatabaseServerLoginModule进…

【强化学习】可视化学习tensorboard

tensorflow定义了一个图结构: 代码: a tf.constant(3.0, name"a")b tf.constant(4.0, name"b")c tf.add(a, b, name"add")var tf.Variable(tf.random_normal([2, 3], mean0.0, stddev1.0), name"variable"…

面向初学者的JSF 2.0教程

1.什么是JSF? JSF是Java Server Faces的首字母缩写。 它是一种服务器端处理技术,它允许将服务器端代码嵌入到网页中。 由于可以将服务器端处理和呈现代码嵌入网页本身,因此使项目的整体编码更加简单。 减少总体数量以及文件大小。 JSF包含2个…

华为nova7保密柜_华为发布nova8系列新品 轻松拍出Vlog黄金脸占比

2020年12月23日,华为nova8系列手机正式发布。作为深受年轻人喜爱的手机品牌之一,华为nova8系列此次延续其强大的前置视觉实力、强悍的设计性能以及独特的设计美学,带来业内首款专为Vlog拍摄设计的5G手机。随着短视频和Vlog的崛起,…

26.0.0-alpha1_WildFly 8.0.0.Alpha1的发布和一些历史

26.0.0-alpha1自从我们发布WildFly 8.0.0.Alpha1版本以来, 已经过去了大约2周。 该下载位于WildFly下载页面上 。 我敢肯定,你们中的许多人可能会想知道WildFly是什么,而其中一些知道它是什么的人可能不会知道已经发布了。 我将尝试回答其中的…

单机最大负载_分布式高可靠之负载均衡,今天看了你肯定会

到目前为止,我已经为你介绍了分布式起源、分布式协调与同步、分布式资源管理与负载调度、分布式计算技术、分布式通信技术和分布式数据存储。可以说,掌握了这些内容,基本上就掌握了分布式的关键技术。然而,只有可靠的分布式系统才…

【强化学习】一文带你理清强化学习

整理不易,希望留个赞再走哦!! 学习路线 这个图描述的比较清晰,蓝框里是整个强化学习的一些概念基础了,橙色是一些学习方法,可以针对性的选择一些,废话不多说,接下来就按照这个路线图…