如何使用spring @Lookup注释? [英] How to use spring @Lookup annotation?

查看:1035
本文介绍了如何使用spring @Lookup注释?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要从单身得到原型课。我发现方法注入是要去的,但是我并不知道如何使用spring @Lookup注释。



我是新来的依赖注入,我选择了注释配置,所以我想继续这个方向。



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



所以,在这里是简化的例子



配置类:

  @Configuration 
@Lazy
public class ApplicationConfiguration实现ApplicationConfigurationInterface {

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

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

这里是类示例:

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

//我想要这个方法返回MyClass2原型
public MyClass2 myClass2(){
}
}

如何使用@Lookup注释?

解决方案在 public MyClass2 myClass2()方法之前,将 @Lookup 注释应用于

@ Lookup的Javadoc


容器将通过CGLIB生成方法的包含类的运行时子类,这就是为什么这样查找方法只能在容器通过常规构造函数实例化的bean上工作(例如,查找方法不能在从工厂方法返回的bean上被替换,我们不能为它们动态提供一个子类)


所以删除th e从 ApplicationConfiguration 之后的工厂方法样式bean声明:

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

并添加 @Component 注释让Spring实例化bean(也可以在方法中添加 @Lookup 注释):

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

//我想要这个方法返回MyClass2原型
@Lookup
public MyClass2 myClass2(){
return null; //这个实现将被动态生成的子类覆盖
}
}

现在得到 myClass1 bean的上下文,并且它的 myClass2 方法应该被替换/覆盖以获得一个新的原型bean每次。






更新



使用工厂方法声明



实现 @Lookup 注释方法(查找方法 )。没有 @Lookup 并保持您的配置类不变,现在 MyClass1 看起来像(其实Spring生成一个类似的实现子类如果 @Lookup 被使用):

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

//我想要这个方法返回MyClass2原型
@Autowired
private ApplicationContext applicationContext;
public MyClass2 myClass2(){
return applicationContext.getBean(MyClass2.class);
}
}

Spring注入 ApplicationContext


I need to get prototype class from singleton. I found that method injection is the way to go, but I don't really know how to use spring @Lookup annotation.

I'm new to dependency-injection, and I chose to go with annotation configuration, so I would like to continue in that direction.

I found out that @Lookup annotation was added only recently (https://spring.io/blog/2014/09/04/spring-framework-4-1-ga-is-here), but I cannot find anywhere how to use it.

So, here is simplified example

Configuration class:

@Configuration
@Lazy
public class ApplicationConfiguration implements ApplicationConfigurationInterface {

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

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

And here is class example:

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

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

How do I do that with @Lookup annotation?

解决方案

Before applying @Lookup annotation to your public MyClass2 myClass2() method, read this in @Lookup's Javadoc:

the container will generate runtime subclasses of the method's containing class via CGLIB, which is why such lookup methods can only work on beans that the container instantiates through regular constructors (i.e. lookup methods cannot get replaced on beans returned from factory methods where we can't dynamically provide a subclass for them).

So remove the following factory method style bean declaration from ApplicationConfiguration:

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

and add @Component annotation to let Spring instantiate the bean (also add the @Lookup annotation to the method):

@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
  }
}

Now get myClass1 bean out of context, and its myClass2 method should have been replaced/overridden to get a new prototype bean each time.


Update:

Using factory method declaration

It's not hard to implement the @Lookup annotated method (the "lookup method"). Without @Lookup and keeping your configuration class unchanged, now MyClass1 looks like (in fact Spring generates a similar implementation in a subclass if @Lookup were used):

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 injects the ApplicationContext for you.

这篇关于如何使用spring @Lookup注释?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆