Аннотация @ComponentScan работает для классов, не являющихся @Configuration - PullRequest
0 голосов
/ 28 ноября 2018

Справочная документация 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?

1 Ответ

0 голосов
/ 29 ноября 2018

Да.Я думаю, что работа @ComponentScan состоит в том, чтобы сканировать заданные пакеты и регистрировать bean-компоненты, аннотированные аннотациями Stereotype (@Component, @Configuration, @Service, @Repository), если таковые найдены, в то время как работа @Configuration заключается в регистрации методов (аннотированных @Bean)вернуть значение в виде bean-компонента в контейнере.

Поправьте меня, если я ошибаюсь.

...