getBeansOfType внутри класса конфигурации - PullRequest
1 голос
/ 28 ноября 2011

У меня проблема с моими весенними классами. Мне нужно получить все Бины типа внутри класса Configuration, чтобы передать их другому классу.

Проблема сейчас в том, что я не могу сделать это, если я не запустил ApplicationContext, но это не работает, потому что вызываемый мной класс Config использует класс config, из которого я вызываю, поэтому я получаю бесконечный цикл ...

как пример:

@Configuration
@Import(Calling.class)
public class MyConfig{
@Bean
public ExampleClass aBean(){
...
return aObject;
}
}

@Configuration
@Import(MyConfig.class)
public class Calling{

@Bean
public Foo anotherBean(){
ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext(myConfig.class);
ctx.getBeansOfType(ExampleClass.class);
return aObject;
}
}

Есть ли какая-либо функциональность или шаблон, который я могу использовать, чтобы получить эти Бины?

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

С @Configuration вы должны быть очень осторожны, чтобы не «вытягивать» бины из контекста, поскольку вы часто получаете эти бесконечные циклы.

Попробуйте вместо этого:

@Configuration
@Import(Calling.class)
public class MyConfig {
   @Bean
   public ExampleClass aBean() {
      ...
      return aObject;
   }
}

@Configuration
public class Calling {

   private @Autowired List<ExampleClass> exampleBeans;

   @Bean
   public Foo anotherBean() {
      return aObject;
   }
}

Надеемся, что этот декларативный подход поможет обойти проблему бесконечного цикла.

Обратите внимание, что вы должны избегать циклических @Import. Делайте это только в одном направлении, как в примере выше.

0 голосов
/ 28 ноября 2011

вы можете использовать LazyInitTargetSource, если только при инициализации контекста не должны вызываться методы для обоих компонентов

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/aop/target/LazyInitTargetSource.html

(в противном случае было бы лучше удалить круговую зависимость, если это возможно)

...