Проблема заключается в том, что конструктор MyComponent
вызывается до автосинхронизации Spring ApplicationContext
. Вот два способа:
• Ввести зависимость в конструктор ( лучший способ ):
@Component
public class MyComponent{
private final ApplicationContext ctx;
@Autowired
public MyComponent(ApplicationContext ctx) {
this.ctx = ctx;
ctx.getBean(...);
}
}
• Или внедрить ее с помощью инъекции поля (худший способ) и использовать@PostConstruct
аннотация жизненного цикла:
@Component
public class MyComponent {
@Autowired
private ApplicationContext ctx; // not final
@PostConstruct
private void init() {
ctx.getBean(...);
}
}
Возможно, она менее безопасна, но, по-моему, она обеспечивает более читаемый код.
О, и я лично использую этот способ,с ломбок . Это делает практически нет стандартного кода, пока вам действительно не нужно будет выполнять какие-то действия во время создания или иметь некоторые неавтоматизируемые поля. : D
@Component
@AllArgsConstructor(onConstructor_ = @Autowired)
public class MyComponent {
private final ApplicationContext ctx;
@PostConstruct
private void init() {
ctx.getBean(...);
}
}