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取决于第一个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

spring @lazy

spring @lazy_Spring @Lazy批注用例相关推荐

  1. Spring @Lazy批注用例

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

  2. Spring(07)——单例注入多例之lookup-method

    2019独角兽企业重金招聘Python工程师标准>>> Spring(07)--单例注入多例之lookup-method 博客分类: spring 7 单例注入多例之lookup-m ...

  3. spring框架中的单例Beans是线程安全的么?

    看到这样一个问题:spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...

  4. Spring框架中的单例Beans是线程安全的么

    看到这样一个问题:Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...

  5. Spring中bean的单例与多例

    Spring中bean的单例与多例 前言 Spring中单例与多例 如何配置单例/多例 单例/多例Bean的使用事项 总结 前言 之前其实已经学习过对于单例模式的使用单例模式讲解,也用过一段时间的Sp ...

  6. 结合Spring源码学习单例设计模式

    之前我学习了 Spring Ioc,明白了 Spring IoC 容器是一个管理Bean的容器,在Spring的定义中,它要求所有的IoC容器都需要实现接口 BeanFactory ,它是一个顶级容器 ...

  7. spring order_Spring @Order批注

    spring order 介绍: Spring @Order注释是在Spring 2.0中首次引入的. 然后,它仅用于定义AspectJ建议中的顺序. 在Spring 4.0的后面,对该注释的实现进行 ...

  8. Spring 通过 @Lazy 注解解决构造方法循环依赖问题

    什么是循环依赖? 先定义两个类 Apple.Orange,如下所示: @Component public class Apple{@Autowiredprivate Orange orange; }@ ...

  9. Spring的Controller是单例还是多例?怎么保证并发的安全

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:riemann_ blog.csdn.net/riemann ...

最新文章

  1. 样式集(11)注册页面样式,全部代码附效果图
  2. oracle触发器初始化,oracle – 触发器无法初始化变量
  3. 4、Angular JS 学习笔记 – 创建自定义指令 [翻译中]
  4. Linux下Crontab定时执行命令
  5. C# 站点IP访问频率限制 针对单个站点
  6. Java学习----方法的重载
  7. AOP和IOC个人理解
  8. 深入分析Kubelet Bootstrap Checkpoint
  9. selenium webdirver之ruby-开发ide乱码解决方案
  10. MapReduce on Yarn 的流程和架构图
  11. Java动态so库修改,Adnroid so文件动态调试技巧
  12. 923模拟电子技术基础和数字电子技术基础考试大纲
  13. Android修行手册-TextView常用属性篇
  14. 第019讲:函数:我的地盘听我的 | 课后测试题及答案(小甲鱼)
  15. RedPitaya火龙果板基础操作
  16. 甲骨文公司总裁Larry Ellison在耶鲁大学的演讲
  17. PTA7-31藏尾诗
  18. ffmpeg hls切片工具
  19. ASIC芯片设计生产流程
  20. $.ajax的dataType属性

热门文章

  1. 线性代数二之矩阵加速DP——数学作业,Arc of Dream
  2. 牛客练习赛69C-旅行【结论,最大生成树】
  3. 学习手记(2020/8/19~2021/3/19)
  4. P3957-跳房子【单调队列,dp,二分】
  5. [清华集训2017]无限之环(网络流)
  6. 牛客网暑期ACM多校训练营(第十场)F.Rikka with Line Graph
  7. 2017西安交大ACM小学期 有趣异或[Trie树]
  8. JavaFX UI控件教程(十六)之Separator
  9. JavaFX官方教程(十一)之动画基础
  10. 什么是CAS机制?(进阶篇)