从@Configuration类中的一个方法创建多个bean

时间:2014-11-04 15:06:12

标签: java spring

我是DI的春天,而使用XML。

基于配置(例如,xml / properties文件),我希望在我的上下文中创建一个特定类型的bean(确切数量由配置确定),以便它们可以自动装入类。

我会通过以下方式自动装配:@Autowired public MyClass(List<MyType> types)

我正在寻找使用@Configuration注释的类。

所以我可以这样做:

@Configuration
public MyConfigurationClass {

    @Autowired
    public void configure(ApplicationContext context) {
        // register stuff here
    }
}

......但它没有&#34;感觉&#34;右...

什么是&#34;春天&#34;实现这个目标的方法?

编辑:

想象一下这段代码,其中ToTy只是空类定义。

@Configuration
public class Config {

    @Bean
    public Collection<Ty> tyList() {
        return new ArrayList<Ty>() {{
            this.add(new Ty()); // could be any number of Ty instances.
        }};
    }

    @Bean
    public To to(Collection<Ty> tylist) {
        return new To();
    }
}

2 个答案:

答案 0 :(得分:1)

如果您不需要拥有单独的限定符并且可以自动装配为List,则可以在Spring 4中执行此操作:

@Configuration
public MyConfigurationClass {

    @Bean
    public List<MyType> configure() {
        //create your dynamical list here
    }
}

但是对于Spring 3(泛型被忽略),你会更安全地使用:

@Configuration
public MyConfigurationClass {

    @Bean
    @Qualifier("mylist")
    public List<MyType> configure() {
        //create your dynamical list here
    }
}

和autowire:

@Autowired public MyClass(@Qualifier("mylist") List<MyType> types)

使用此功能,您无需直接触摸ApplicationContext实例。它不被认为是非常好的做法。

编辑:

你试过这个吗?:

@Configuration
public class Config {

    @Bean
    @Qualifier("tylist")
    public Collection<Ty> tyList() {
        return new ArrayList<Ty>() {{
            this.add(new Ty()); // could be any number of Ty instances.
        }};
    }

    @Bean
    public To to(@Qualifier("tylist") Collection<Ty> tylist) {
        return new To();
    }
}

答案 1 :(得分:0)

我不确定我是否理解正确但我相信这就是你想要的。

public interface MyStuff {
  void doSomething();
}

@Scope("prototype") // 1
@Service("stuffA") // 2
public class MyStuffImpl_A implements MyStuff {
  public void doSomething()
  {
     // do your stuff
  }
}

@Scope("prototype")
@Service("stuffB")
public class MyStuffImpl_B implements MyStuff {
  public void doSomething()
  {
     // do your stuff the B way ;)
  }
}

现在你可以这样做:

public class UseTheStuff {

  @Autowired
  private Provider<MyStuff> stuffA; // 3

  @Autowired
  private Provider<MyStuff> stuffB;  // 4

  public void doStuffWithTheProvider(){
    MyStuff stuffA.get(); // 5
    MyStuff stuffB.get(); // 6
  }
}
  1. 告诉spring将此实现用作原型
  2. 将此实施命名为MyStuff:&#34; stuffA&#34;
  3. 获取提供者(名称&#34; stuffA&#34;告诉spring注入MyStuffImpl_A提供者)
  4. 获取提供者(名称&#34; stuffB&#34;告诉spring注入MyStuffImpl_B提供者)
  5. 使用提供程序创建MyStuffImpl_A
  6. 的实例
  7. 使用提供程序创建MyStuffImpl_B
  8. 的实例