在基于java的配置中使用@ Lookup-method

时间:2017-07-18 06:20:03

标签: java spring configuration annotations

注释字段/构造函数仅提供该类的一个实例,即使该bean被配置为原型。但我想在循环中为特定类创建新实例。

以下是我的Component类:

@Component
 class Link{

    @Autowired
    private RandomClass rcobj;

    public void getFiveInstancesOfRandomClass(){
       //here I want to create  five new instances for RandomClass but I get only one by auto-wiring
    }
}

Config.class

@Configuration

class ApplicationConfig{
  @Bean
  public Link link(){ return new Link();}

  @Bean
  @scope ("prototype")
  public RandomClass randomClass(){ return new RandomClass();}
}

我查看了一些主要使用基于xml的配置的示例。其中一个解决方案是调用ApplicationContext,但我想用lookup-method解决这个问题。

1 个答案:

答案 0 :(得分:3)

通过java配置将原型注入单例我使用以下技术:

Singleton类:

public abstract class Single
{
  abstract Proto newInstance();

  public void useBean()
  {
    System.out.println( newInstance() );
  }

}

原型类:

public class Proto
{

}

上下文:

public class Context
{
  @Bean
  public Single single()
  {
    return new Single() {
      @Override
      Proto newInstance()
      {
        return proto();
      }
    };
  }

  @Bean
  @Scope("prototype")
  public Proto proto()
  {
    return new Proto();
  }
}

测试类:

  public static void main( String[] args )
  {
    ApplicationContext context = new AnnotationConfigApplicationContext( Context.class );
    Single single = context.getBean( Single.class );
    single.useBean();
    single.useBean();
  }

从输出中我们可以看到每个调用使用不同的对象:

test.Proto@b51256
test.Proto@1906517

P.S。 我完全同意你的意见,我们不应该用applicationContext绑定bean。它创造了额外的耦合,我相信这不是一个好习惯。