Разница между <context: annotation-config> и <context: component-scan> - PullRequest
656 голосов
/ 14 сентября 2011

Я изучаю Spring 3, и я, кажется, не понимаю функциональности <context:annotation-config> и <context:component-scan>.

Из того, что я прочитал, они, похоже, обрабатывают разные аннотации (@Required, @Autowired и т. Д. По сравнению с @Component, @Repository, @Service и т. Д.), А также из того, что я прочитал, они регистрируют одни и те же классы постпроцессора бина.

Чтобы запутать меня еще больше, в <context:component-scan>.

есть атрибут annotation-config.

Может кто-нибудь пролить свет на эти метки? Что похоже, что отличается, одно вытесняется другим, они дополняют друг друга, нужен ли мне один из них, оба?

Ответы [ 15 ]

0 голосов
/ 15 марта 2019

В качестве дополнения, вы можете использовать @ComponentScan, чтобы использовать <context:component-scan> в качестве аннотации.

Это также описано в spring.io

Конфигурирует директивы сканирования компонентов для использования с классами @Configuration.Обеспечивает поддержку параллельно с элементом Spring XML.

Одна вещь, на которую следует обратить внимание, если вы используете Spring Boot, @Configuration и @ComponentScan могут подразумеваться с помощью аннотации @SpringBootApplication.

0 голосов
/ 01 февраля 2019

Более подробную информацию вы можете найти в файле схемы контекста Spring.следующее в spring-context-4.3.xsd

<conxtext:annotation-config />
Activates various annotations to be detected in bean classes: Spring's @Required and
@Autowired, as well as JSR 250's @PostConstruct, @PreDestroy and @Resource (if available),
JAX-WS's @WebServiceRef (if available), EJB 3's @EJB (if available), and JPA's
@PersistenceContext and @PersistenceUnit (if available). Alternatively, you may
choose to activate the individual BeanPostProcessors for those annotations.

Note: This tag does not activate processing of Spring's @Transactional or EJB 3's
@TransactionAttribute annotation. Consider the use of the <tx:annotation-driven>
tag for that purpose.
<context:component-scan>
Scans the classpath for annotated components that will be auto-registered as
Spring beans. By default, the Spring-provided @Component, @Repository, @Service, @Controller, @RestController, @ControllerAdvice, and @Configuration stereotypes    will be detected.

Note: This tag implies the effects of the 'annotation-config' tag, activating @Required,
@Autowired, @PostConstruct, @PreDestroy, @Resource, @PersistenceContext and @PersistenceUnit
annotations in the component classes, which is usually desired for autodetected components
(without external configuration). Turn off the 'annotation-config' attribute to deactivate
this default behavior, for example in order to use custom BeanPostProcessor definitions
for handling those annotations.

Note: You may use placeholders in package paths, but only resolved against system
properties (analogous to resource paths). A component scan results in new bean definitions
being registered; Spring's PropertySourcesPlaceholderConfigurer will apply to those bean
definitions just like to regular bean definitions, but it won't apply to the component
scan settings themselves.
0 голосов
/ 30 декабря 2015

<context:annotation-config>:

Это говорит Spring, что я собираюсь использовать аннотированные bean-компоненты в качестве spring bean, и они будут подключены через аннотацию @Autowired вместо объявления в Spring config xml file.

<context:component-scan base-package="com.test...">:

Это сообщает контейнеру Spring, с чего начать поиск аннотированных bean-компонентов. Здесь весна будет искать все подпакеты базового пакета.

0 голосов
/ 29 января 2015

<context:component-scan base-package="package name" />:

Это используется, чтобы сообщить контейнеру, что в моем пакете есть классы бинов, которые сканируют эти классы бинов. Чтобы сканировать классы bean-компонентов по контейнеру поверх bean-компонента, нам нужно написать одну из аннотаций стереофонического типа, как показано ниже.

@Component, @Service, @Repository, @Controller

<context:annotation-config />:

Если мы не хотим явно писать тег bean в XML, то как контейнер узнает, есть ли в bean автоматическое подключение. Это возможно с помощью аннотации @Autowired. мы должны сообщить контейнеру, что в моем бобе есть автоматическая проводка по context:annotation-config.

0 голосов
/ 15 июня 2013

A <context:component-scan/> настраиваемый тег регистрирует тот же набор определений bean-компонентов, что и выполняется, помимо его основной ответственности за сканирование java-пакетов и регистрацию определений bean-компонентов из classpath.

Если по какой-то причине следует избегать этой регистрации определений bean-компонентов по умолчанию, то для этого необходимо указать дополнительный атрибут «annotation-config» в компонентном сканировании, например:

<context:component-scan basePackages="" annotation-config="false"/>

Ссылка: http://www.java -allandsundry.com / 2012/12 / contextcomponent-скан-contextannotation.html

...