2015-02-10 2 views
3

В следующем Spring Java Config:Реферирование боб с зависимостями с помощью Spring Java Config

@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 сек, используя либо инъекции параметр, который является элегантный, но имеет недостатки, если есть несколько других beans типа BasicBean и только некоторые из них (параметры могут, конечно, иметь тип BasicBean и перечислять по имени компоненты, которые меня интересуют, но это может оказаться очень длинным списком, по крайней мере для аргументов). В случае, если я хочу напрямую ссылаться на 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) {...} 

конечно, но это не может быть вариант, в некоторых случаях, в частности при использовании CacheConfigurer из spring-context. В этом случае Java Config предназначена для

  1. создать бобы
  2. путем реализации CacheConfigurer, переопределения экземпляров по умолчанию для CacheManager и KeyGenerator бобов.

Требование к внедрению CacheConfigurer означает, что я не могу изменить подпись для использования инъекции параметров.

Итак, вопрос в том, есть ли способ ссылки complexBeanByParameters с использованием «прямого» эталонного стиля?

+0

Мое текущее решение является разделить мою конфигурацию в виде отдельных файлов, а также автоматического связывания боб из один config, введя его в декларацию bean-компонента CacheConfigurer - аналог должен был бы иметь 'complexBeanRegistry', объявленный в отдельной конфигурации, и autowire' complexBeanByParameters' bean. – zrvan

ответ

1

Может быть, вы могли бы сослаться на него с разделением по Qualifier:

@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())); 
    } 

и, например, autowire:

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

Это действительно похоже на то, что я хочу сделать. – zrvan