@Lookup与@Bean@Scope获取原型实例,谁更胜一筹

news/2024/11/28 10:45:29/

那必然是 @Lookup 呀 🛼

    • 他是谁 | 运行时查找 bean
      • 示例 | 谁更好呢
      • 作用 | 妙用多多

他是谁 | 运行时查找 bean

@Lookup是Spring框架的一部分,它允许在运行时动态查找bean。使用@Lookup注解的方法必须返回一个bean,它将在每次调用该方法时创建一个新的实例。这对于需要在运行时动态创建依赖关系的场景非常有用,例如在运行时根据用户输入创建不同的bean。

示例 | 谁更好呢

当将bean的作用域设置为原型(prototype)时,每次请求该bean时,Spring都会创建一个新的实例。这意味着,如果您在两个或多个对象中注入了同一个原型作用域的bean,并且对该bean进行了修改,则每个对象都将获取一个新的bean实例,并且它们之间的状态不会相互影响。

例如,假设您有一个名为MyPrototypeBean的原型作用域的bean,它具有一个实例变量value。如果您在两个或多个对象中注入MyPrototypeBean,并且在一个对象中修改了value值,则该值不会影响其他对象。每个对象都将获得一个新的MyPrototypeBean实例,并且它们之间的状态不会相互影响。

现在,如果您想在原型作用域中获取新的bean实例,而不是在构造函数中注入它们,您可以使用@Lookup注解来声明一个方法来获取新的bean实例。例如:


@Component
public class MyComponent {@Lookuppublic MyPrototypeBean getMyPrototypeBean() {return null;}public void doSomething() {MyPrototypeBean bean1 = getMyPrototypeBean();MyPrototypeBean bean2 = getMyPrototypeBean();// 修改bean1和bean2的value值不会相互影响bean1.setValue("value1");bean2.setValue("value2");}
}

在这个示例中,我们使用@Lookup注解声明了一个名为getMyPrototypeBean()的方法,它将在每次调用时返回一个新的MyPrototypeBean实例。在doSomething()方法中,我们通过调用getMyPrototypeBean()方法来获取两个新的MyPrototypeBean实例,并且它们之间的状态不会相互影响。

不用 @LookUp, 当然你也可以改成这样

@Component
public class MyComponent {@Bean@Scope("prototype")public MyPrototypeBean getMyPrototypeBean() {return new MyPrototypeBean();}public void doSomething() {MyPrototypeBean bean1 = getMyPrototypeBean();MyPrototypeBean bean2 = getMyPrototypeBean();// 修改bean1和bean2的value值不会相互影响bean1.setValue("value1");bean2.setValue("value2");}
}

使用@Bean注解来声明原型bean需要开发人员手动创建和管理该bean实例,这种方式可能不如使用@Lookup注解那么优雅

作用 | 妙用多多

@Lookup注解可以在运行时动态查找bean,并且可以返回一个新的实例。这使得它在某些场景下非常有用,例如:

  1. 需要在每次调用时创建新的依赖关系:如果您需要在每次调用时创建新的依赖关系,例如根据不同的参数创建不同的bean实例,那么@Lookup注解可以帮助您实现这一点。

  2. 需要在原型作用域中创建新的bean实例:如果您需要在原型作用域下创建新的bean实例,以避免多个对象共享同一个实例,那么@Lookup注解也非常有用。

  3. 需要解决循环依赖问题:如果您的应用程序中存在循环依赖问题,例如A依赖于B,B又依赖于A,那么@Lookup注解可以帮助您解决这个问题。通过在需要的地方使用@Lookup注解来获取依赖关系,而不是在构造函数中注入依赖关系,可以避免循环依赖问题。

总之,@Lookup注解是Spring框架中一种灵活的方式,可以在运行时动态查找bean并返回新的实例。它可以帮助您解决一些常见的依赖注入问题,并使您的代码更加灵活和可重用。


http://www.ppmy.cn/news/39265.html

相关文章

redis实战---乐观锁与悲观锁

乐观锁和悲观锁故事背景概念乐观锁悲观锁乐观锁示例悲观锁示例总结提升故事背景 概念 Redis是一个内存中的键值存储系统,支持多种数据结构,如字符串、哈希、列表等。Redis提供了两种锁机制,即乐观锁和悲观锁。 乐观锁 乐观锁是一种乐观的…

Properties

Properties概述: 是一个Map体系的集合类 Properties可以保存到流中或从流中加载 练习:Properties作为Map集合的使用 package com.aynu13;//练习:Properties作为Map集合的使用import java.util.Properties; import java.util.Set;public cla…

3年外包离奇被裁,痛定思痛24K上岸字节跳动....

三年前,我刚刚从大学毕业,来到了一家外包公司工作。这份工作对于我来说是个好的起点,因为它让我接触到了真正的企业项目和实际的开发流程。但是,随着时间的流逝,我发现这份工作并没有给我带来足够的成长和挑战。 三年…

YOLO系列(YOLOv5/YOLOv7/YOLOv8)算法训练数据集保姆级教程

本博文教大家如何快速便捷有效的跑通YOLO系列算法。如果有需要更正的请留言,我会进一步更新修正。 一、实验环境 关于实验环境,YOLO系列算法官网源码用的是PyTorch框架写的,所以需要大家在自己电脑安装PyTorch环境,不同YOLO算法或…

c++异常处理

异常处理输出异常捕获异常处理和恢复标准的异常异常重载捕获不同错误输出异常 C异常处理是一种用于在程序执行期间捕获和处理错误的机制。当发生异常时,程序将跳转到与该异常匹配的catch块,并执行指定的代码来处理该异常。C中的异常处理分为三个步骤&am…

python turtle库

turtle库是 Python提供的一组函数,可以用来将一个或多个文本文件转换成指定的文件格式,比如 jpg、 png、 bmp等。 比如将 jpg文件转换成 png或者 bmp文件。我们可以通过对文本进行操作,比如修改字体大小、调整字体颜色、添加文字阴影等&#…

ubuntu 20.04安装后遇到的问题及解决办法记录(时间不一致、黑屏、点软件图标卡死)

ubuntu 20.04安装后遇到的问题及解决办法记录 目录ubuntu 20.04安装后遇到的问题及解决办法记录前言1. 解决windows与ubuntu时间不一致的问题2. 解决ubuntu系统进去没操作几下就黑屏,只有鼠标可以动及点软件就卡死安全重启命令前言 实验室新购了一批电脑&#xff0…

MATLAB | 如何自然好看的从图片中提取颜色并制作色卡

在这里研究了一下各种排序算法,写一篇如何由图片一键生成颜色条的方法。 1 关于大量颜色排序 假设有大量颜色怎么对其进行排序呢,首先想到的最简单方法就是将其按照RGB值的大小进行排序,为了方便展示颜色条,这里编写了一个颜色条…