【问题标题】:Using @Lookup-method in java based configuration在基于 java 的配置中使用 @Lookup-method
【发布时间】:2017-07-18 06:20:03
【问题描述】:

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

下面是我的组件类:

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

配置类

@配置

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

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

我查看了几个主要使用基于 xml 的配置的示例。解决方案之一是调用 ApplicationContext 但我想用查找方法解决这个问题。

【问题讨论】:

    标签: java spring configuration annotations


    【解决方案1】:

    要通过 java config 将原型注入单例,我使用以下技术:

    单例类:

    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
    

    附言 我完全同意你的看法,我们不应该将 bean 与 applicationContext 绑定。它会产生额外的耦合,我认为这不是一个好的做法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多