2015-02-10 57 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

相关问题