2015-02-10 56 views
3

在下面的Spring Java配置依賴一個bean:引用使用的Spring Java配置

@Configuration 
@EnableAutoConfiguration 
@ComponentScan("my.package") 
public class Config { 
    @Bean 
    public BasicBean basicBean1() { 
     return new BasicBean("1"); 
    } 

    @Bean 
    public BasicBean basicBean2() { 
     return new BasicBean("2"); 
    } 

    @Bean 
    public ComplexBean complexBeanByParameters(List<BasicBean> basicBeans) { 
     return new ComplexBean(basicBeans); 
    } 

    @Bean 
    public ComplexBean complexBeanByReferences() { 
     return new ComplexBean(Arrays.asList(basicBean1(), basicBean2())); 
    } 
} 

我可以使用任一參數注入,這是優雅的,但也有缺點創建兩個ComplexBean■如果有一些其他的豆BasicBean類型,只需要幾個(參數當然可以是BasicBean類型,並按名稱枚舉我感興趣的bean,但它可能會變成一個很長的列表,至少出於參數的原因)。如果我想直接引用bean,我可以使用complexBeanByReferences樣式,這在訂購或其他考慮的情況下可能很有用。

但是說,我想用complexBeanByReference風格引用豆complexBeanByParameters,即沿着線的東西:

@Bean 
public ComplexBeanRegistry complexBeanRegistry() { 
    return new ComplexBeanRegistry(
     Arrays.asList(
      complexBeanByParameters(), // but this will not work! 
      complexBeanByReferences() 
     ) 
    ); 
} 

我將如何引用complexBeanByParameters,而不必指定依賴關係的列表complexBeanRegistry ?哪一個,後者誠實應該完全沒有意識。

有隻使用

public ComplexBeanRegistry complexBeanRegistry(List<ComplexBeans> complexBeans) {...} 
當然

的選擇,但是從spring-context使用CacheConfigurer時,這可能不是在某些情況下一個選項,具體。在這種情況下,Java的配置是爲了

  1. 通過實施CacheConfigurer創建豆
  2. ,覆蓋CacheManagerKeyGenerator豆的默認實例。

執行CacheConfigurer的要求意味着我不能更改簽名以使用參數注入。

所以問題是,有沒有辦法引用complexBeanByParameters使用「直接」引用樣式?

+0

我目前的解決方案是拆分我在不同的文件配置,並通過自動裝配豆一個配置,將其注入到'CacheConfigurer' bean聲明中 - 模擬應該是將'complexBeanRegistry'聲明在一個單獨的配置中並自動裝入'complexBeanByParameters' bean。 – zrvan 2015-02-10 15:49:19

回答

1

也許你可以通過預選賽分離引用它:

@Bean 
    @Qualifier("complexBeanParam") 
    public ComplexBean complexBeanByParameters(List<BasicBean> basicBeans) { 
     return new ComplexBean(basicBeans); 
    } 

    @Bean 
    @Qualifier("complexBeanRef") 
    public ComplexBean complexBeanByReferences() { 
     return new ComplexBean(Arrays.asList(basicBean1(), basicBean2())); 
    } 

和例如自動裝配:

@Autowired 
    @Qualifier("complexBeanParam") 
    private ComplexBean beanParam; 
+0

這似乎確實與我想要做的事情最接近。 – zrvan 2015-03-03 12:51:34

相關問題