当前位置: 首页 > 面试题库 >

如何使用spring @Lookup批注?

伏默
2023-03-14
问题内容

我需要从单例中获取原型类。我发现方法注入是可行的方法,但是我真的不知道如何使用spring @Lookup注释。

我是依赖注入的新手,我选择了注释配置,因此我想朝着这个方向继续。

我发现@Lookup注释是最近才添加的(https://spring.io/blog/2014/09/04/spring-
framework-4-1-ga-is-here
),但是我找不到任何方法用它。

所以,这是简化的例子

配置类:

@Configuration
@Lazy
public class ApplicationConfiguration implements ApplicationConfigurationInterface {

  @Bean
  public MyClass1 myClass1() {
    return new ContentHolderTabPaneController();
  }

  @Bean
  @Scope("prototype")
  public MyClass2 myClass2() {
    return new SidebarQuickMenuController();
  }
}

这是课程示例:

public class MyClass1 {
  doSomething() {
    myClass2();
  }

  //I want this method to return MyClass2 prototype
  public MyClass2 myClass2(){
  }
}

我该如何使用@Lookup注释?


问题答案:

@Lookuppublic MyClass2 myClass2()方法应用注释之前,请在@Lookup的Javadoc中阅读以下内容:

容器将通过CGLIB生成方法的包含类的运行时子类,这就是为什么这种查找方法只能在容器通过常规构造函数实例化的bean上起作用的原因(即,
查找方法无法替换为从工厂方法返回的bean ,而我们无法这样做)动态为其提供子类)。

因此,从以下代码中删除以下工厂方法样式Bean声明ApplicationConfiguration

  @Bean
  public MyClass1 myClass1() {
    return new ContentHolderTabPaneController();
  }

添加@Component注释以让Spring实例化bean(还将@Lookup注释添加到方法中):

@Component
public class MyClass1 {
  doSomething() {
    myClass2();
  }

  //I want this method to return MyClass2 prototype
  @Lookup
  public MyClass2 myClass2(){
    return null; // This implementation will be overridden by dynamically generated subclass
  }
}

现在,让myClass1bean脱离上下文,并且它的myClass2方法应该每次都被替换/重写以获取新的原型bean。

更新

实现带@Lookup注释的方法(“查找方法”)并不难。在没有@Lookup并使配置类保持不变的情况下,现在MyClass1看起来像(实际上,如果@Lookup使用过,Spring在子类中会生成类似的实现):

public class MyClass1 {
  doSomething() {
    myClass2();
  }

  //I want this method to return MyClass2 prototype
  @Autowired
  private ApplicationContext applicationContext;
  public MyClass2 myClass2() {
      return applicationContext.getBean(MyClass2.class);
  }
}

Spring ApplicationContext为您注入。



 类似资料:
  • 问题内容: 我注意到一种奇怪的行为,我不确定这是设计使然还是我自己的误解。Spring将在以ComponentScan标记的@ Service,@ Component等注释的Bean中实现@Lookup方法,但不会在@Configuration类(Application.java)中定义的@Bean中实现这种方法。 这不是什么大问题,因为我可以从配置中删除@Bean定义,而直接对其类进行注释。但我

  • 问题内容: 使用聚合,我使用golang加入了两个mongodb集合。结果如下所示:- 输出:- 此 输出 由以下golang代码获取:- 问题是: -我只需要的 不是 了。在上面显示的输出中意味着在其中显示数据,但是我只需要像这样的值:- 但它正在显示数据。如何获得输出中数据的计数值。先感谢您。 问题答案: 因此,您的汇总实际上返回了该字段中的所有文档,该文档隐含了结果的数量,您可以使用内置函数

  • 请帮我找到一个合适的解决办法 收集被存储的用户详细信息app_users 用户预订是存储预订的集合 我正在使用的查找(左连接)查询是 我想从用户集合中选择具有相应用户详细信息的预订,但返回为空,因为mongodb正在将字符串与objectId进行比较,所以是否有方法执行此任务?

  • wend尝试此查询,返回查找为空 返回json 我尝试了这篇文章,但没有发生MongoDB将项目字符串聚合到ObjectId和这个MongoDB$lookup在PHP中使用_id作为foreignField 更新 这是文档“用户”

  • 我想在交叉表中插入大量的实体。为此,我想启用Hibernate的批处理插入选项,这样每次插入将不是添加1行,而是一次添加20或50行。 我正在尝试重现Hibernate教程的结果。我创建了一个测试函数,它将尝试插入30个客户,就像在示例中一样: Customer类没有生成的ID。 在收到Vlad Mihalcea的回答后,我意识到是的,事实上批处理语句是有效的,至少在hibernate和jdbc级

  • 我正试图弄清楚如何使用Spring Batch进行聚合。例如,我有一个带有姓名列表的CSV文件: 我想要文本文件中的姓名计数: 根据我从Spring Batch中学到的,ETL批处理过程(itemReader- Spring Batch是正确的工具吗?还是我应该用Spark?谢谢