2016-11-22 6 views
1

У меня есть проблема с @Autowired property в @Configuration bean.@Autowired bean свойство null в @Configuration bean

У меня есть компонент, аналогичный приведенному ниже:

@Configuration 
public class MyConfig { 
    @Autowired MongoTemplate mongoTemplate; 

    @Bean 
    MongoDbMetadataStore indexMetadataStore() { 
     return new MongoDbMetadataStore(mongoTemplate, "index"); 
    } 
} 

и ... mongoTemplate равно нулю при создании indexMetadataStore боб (проверено с отладчиком). К сожалению, я не могу предоставить всю структуру проекта, он большой (он имеет ~ 5 файлов конфигурации XML и около 20-30 @ Конфигурационные компоненты), и моя ставка заключается в том, что там может быть круговая ссылка или что-то вроде.

Однако этот бобин mongoTemplate создан ранее и вводится другим фасолью (также проверяется с помощью отладчика), поэтому на этом этапе mongoTemplate полностью создан, и я не могу понять, почему он не вводится и остается нулевым.

Любые идеи, где я должен смотреть?

+0

пакет класса MyConfig входит в состав сканирования компонентов? –

+0

Возможно, вам потребуется использовать аннотацию '@ AnnotationDrivenConfig'. Не видя полного примера, это просто догадывается. http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch04s02.html –

+0

Аннотации '@ AnnotationDrivenConfig', похоже, были удалены весной 4. –

ответ

1

Хорошо, я обнаружил проблему. Я опишу его здесь, чтобы, возможно, кто-то другой мог найти этот ответ полезным и сэкономить драгоценное время, разрешив его :).

Оказалось, что существует круговая ссылка, и Spring прилагает все усилия, чтобы инициализировать и использовать не полностью инициализированные объекты конфигурации. Были config1 и config2 бобы (оба @Configuration), которые использовали объекты друг от друга.

Это интересно знать, что в такой ситуации Spring пытается инициализировать @Resource, @Autowired и @Value в следующем порядке:

  1. @Resource инициализируется первым, в том порядке, что объекты были объявлены в @Configuration боба
  2. @Value рассматривается как @Autowired. Следовательно, @Value и @Autowired инициализируются в порядке появления ПОСЛЕ всех @Resource beans.

Важно понять порядок выше, потому что ваши бобы и циклическая ссылка могут полагаться на @Value настройки и такие настройки по-прежнему могут быть null при создании ресурса, на который ссылается из другой конфигурации компоненты.

Однако, лучшая стратегия заключается в том, чтобы избежать круговых ссылок и, наконец, это то, что я сделал, - помещать ресурсы на новый, третий, конфигурационный компонент.

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