У меня возникли трудности с пониманием того, почему что-то весной Java Config с использованием @Autowired
не работает.Spring Java Config using Autowired вызванный NPE
Во-первых, я пытаюсь переместить все мои аннотации @Autowired
в классы Java Config. Это приводит к тому, что мои «POJO» возвращаются в реальные POJO. Затем я могу не только легко их тестировать вне контекста Spring, но и легко и легко использовать макетные объекты.
Так я впервые попробовал это:
@Configuration
public class Module3ConfigClass {
@Autowired
private Module1Bean1 module1Bean1;
@Autowired
private Module2Bean1 module2Bean1;
@Bean
public Module3Bean1 module3Bean1() {
return new Module3Bean1(module1Bean1, module2Bean1);
}
}
Однако, когда Module3Bean1
конструктор вызывается, как принятый в Beans являются недействительными. Если вы не выполнили вышеприведенное соглашение об именах, оба этих компонента будут созданы отдельным конфигурационным файлом конфигурации Java. Также обратите внимание, что все правильно подключено - я знаю это, потому что все работает отлично, когда теги @Autowired
находятся на соответствующих частных полях членов внутри Module3Bean1
.
FWIW, я попытался добавить аннотацию @DependsOn
к методу module3Bean1()
, но имел те же результаты. Думаю, мне просто хотелось бы понять это поведение, правильно ли (я подозреваю, что это так, но почему)?
Наконец, я нашел приемлемый обходной путь, показанный здесь:
@Configuration
public class Module3ConfigClass {
@Bean
@Autowired
public Module3Bean1 module3Bean1(Module1Bean1 module1Bean1, Module2Bean1 module2Bean1) {
return new Module3Bean1(module1Bean1, module2Bean1);
}
}
Это, кажется, хорошо для меня, но если кто-то захочет это прокомментировать, что будет приветствоваться, а также.
Бобы должны быть созданы до того, как они будут автоуведомлены. Покажите нам, где эти бобы, другая конфигурация. Вам, вероятно, понадобится '@ Import', что' @ Configuration'. –
Хорошо, что они правильно установлены в двух случаях, описанных выше. Во-первых, когда аутсорсинг находится за пределами заводского (конфигурирования) процесса, а второй - когда они автообновлены в показанном коде. Поэтому просто предположите, что это тривиальные бобы каждый в своем собственном (at) Configuration аннотированном классе и импортированы правильно. Мне просто интересно, почему некоторые (at) Autowired beans отображаются в классе конфигурации (at), а некоторые (как показано выше) этого не делают. – JoeG
Тогда я могу только предположить, что все бобы создаются до того, как они станут пригодными для инъекций/автоувеличивания. Что касается вашего обходного пути, я думаю, что метод может быть вызван дважды, один раз для создания '@ Bean' и один раз для' @ Autowired'. Проверьте свои журналы. –