Справочная документация Spring гласит следующее:
Spring может автоматически обнаруживать стереотипированные классы и регистрировать соответствующие экземпляры BeanDefinition с помощью ApplicationContext ...
Для автоматического определения этих классов и регистрации соответствующихбины, вам нужно добавить @ComponentScan в ваш класс @Configuration ...
Я создал простой пример для проверки функциональности автоопределения среды Spring:
/**
* Java-based configuration class which defines root package to start scanning from.
*/
@ComponentScan
public class ComponentScanPackageMarker {
}
/**
* Class annotated with <b>stereotype</b> annotation is a candidate for automatic detection and registering as
* {@link BeanDefinition} instance.
*/
@Component
public class Pen {
private Ink ink;
@Autowired
public Pen(Ink ink) {
this.ink = ink;
}
}
/**
* Auto-detected class which will be used as auto-wiring candidate for another auto-detected component.
*/
@Component
public class Ink {
}
@ Аннотация конфигурации намеренно опущена для класса ComponentScanPackageMarker .Я проверил функции сканирования компонентов и автоматического подключения.К моему удивлению, все прошло хорошо:
@Test
public void shouldAutoDetectAndRegisterBeans() {
try (AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(ComponentScanPackageMarker.class)) {
Pen pen = context.getBean(Pen.class);
Assert.assertNotNull(pen);
Ink ink = context.getBean(Ink.class);
Assert.assertNotNull(ink);
}
}
Является ли такое поведение компонентного сканирования преднамеренным?Почему он работает даже без аннотации @Configuration?