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

他是谁 | 运行时查找 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 {

   @Lookup
   public 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并返回新的实例。它可以帮助您解决一些常见的依赖注入问题,并使您的代码更加灵活和可重用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值