2016-04-06 3 views
1

Пусть у меня есть следующий Spring конфигурацию контекста:Использования @Bean аннотации

@Configuration 
public class Configuration { 

    @Bean 
    public A a() { 
     return new A(b()); 
    } 

    public B b() { 
     return new B(); 
    } 
} 

Если один аннотировать b() с @Bean, если единственным местом, где необходим B экземпляра находится в пределах a() для A строительства экземпляра?

+1

Ваша текущая настройка не делает 'b' экземпляр родника управляемый компонент. Поэтому, если вы ожидаете, что такие вещи, как '@ PostConstruct' и т. Д. На этом компоненте, будут работать просто, поскольку весна не справляется с этим. Затем вы уверены, что это единственный экземпляр «B», который вам когда-либо понадобится, или, может быть, вам это нужно в нескольких местах, и что? –

+0

Почему бы просто не создать экземпляр 'B' внутри' A'? Или вы можете сделать 'B' bean, а затем объявить поле внутри' A', которое является '@ Autowired'. –

+0

@ m-deinum Я заметил [здесь] (http://docs.spring.io/spring-kafka/docs/1.0.0.BUILD-SNAPSHOT/reference/html/_reference.html#__kafkalistener_annotation), который, например, метод 'consumerConfigs()' помечен как '@ Bean' ... Возможно, он должен использоваться и в другом месте. – Aliaxander

ответ

2

Если B - это план Java класса (без аннотаций Spring), то нет, вы можете использовать текущую конфигурацию. Поскольку это частный член класса A.

Но если у вас есть методы, которые должны управляться весной (внутри B класса), как @PostConstruct или @PreDestroy, чем вы должны сделать Bean из B класса:

@Bean 
public A a(B b) { 
    return new A(b); 
} 
@Bean 
public B b() { 
    return new B(); 
} 

Такие случаи :

  • ресурс должен быть закрыт при останове/закрыть
  • исполнители должны быть закрыты при выключении
  • JDBC соединения
  • и т.д.

 Смежные вопросы

  • Нет связанных вопросов^_^