2016-09-24 13 views
1

Я использую приложение Spring Boot MVC. У меня есть класс @Configuration, который инициализирует компонент в ApplicationContext с использованием @Bean. У меня есть класс @Controller, в который я пытаюсь автоподписать компонент, используя аннотацию @Autowired.Метод Spring @Bean, выполняющийся после @Autowired

Результат: @Autowired Поле null.

DEBUG: Я попытался отладить, чтобы увидеть порядок выполнения. Я ожидал увидеть, что класс, аннотированный @Configuration, будет запускаться первым, чтобы инициализировать bean-компонент в контексте приложения. Однако сначала был создан экземпляр класса контроллера. Затем был вызван метод класса конфигурации @Bean. Из-за этого компонента создается экземпляр после контроллера, и именно поэтому контроллер не получает bean-автоувеличивание.

Вопрос: Как выполнить метод @Configuration@Bean до создания класса контроллера?


код класса конфигурации:

@Configuration 
public class RootConfiguration2 { 

    @Autowired 
    private IService<ActBinding> bindingService; 

    @Bean 
    public Map<String, String> getBingindNameToRoutingKeyMap() throws Exception { 
     ListOperation<ActBinding> operation = ListOperation.from("key", "name", "exchangeId"); 
     operation.sort("key", SortOrder.Ascending); 
     Iterable<ActBinding> result = bindingService.list(operation).getResult(); 
     Map<String, String> bindingNameToRoutingKey = new HashMap<>(); 
     result.forEach(x -> bindingNameToRoutingKey.put(x.getName(), x.getKey())); 
     return Collections.unmodifiableMap(bindingNameToRoutingKey); 
    } 
} 
+0

Вы можете поделиться кодом класса конфигурации? –

+0

Включите ведение журнала и проверьте наличие предупреждающих сообщений. – OrangeDog

+0

Вам нужно будет показать код для IService и где вы вводите getBingindNameToRoutingKeyMap. Это может быть круговая зависимость, хотя вы не упомянули такую ​​ошибку. Это может быть опечатка, когда инъекция getBingindNameToRoutingKeyMap в паре с @Autowring (обязательно = false) ... нужно больше кода. – alexbt

ответ

2

Я нашел два обходные пути. Оба решения работали: 1. Используйте @Resource вместо @Autowired для вставки компонента в контроллер. 2. Используйте @PostConstruct для метода, аннотированного с @Bean в классе конфигурации.

Примечание: вам не нужно делать оба изменения. Любой из них должен работать.