Разница между @EntityScan и @ComponentScan
Я пытаюсь понять разницу здесь. Я вижу, что класс был аннотирован с обоими из них с таким же примером пакета:
@Configuration
@EntityScan("some.known.persistence")
@ComponentScan({ "some.known.persistence"})
public class ApiConfig {
}
Я понимаю различия с документами API, но хочу разобраться в деталях. Также это означает, что все, что сканируется с помощью @ComponentScan
, имеет более широкую видимость в контексте Spring, а @EntityScan
- нет. Если при использовании некоторого атрибута с @ComponentScan
должно хватить на необходимость привязки в контексте JPA, не так ли?
Ответы
Ответ 1
Аннотация @ComponentScan
используется для автоматического создания bean-компонентов для каждого класса, помеченного @Component
, @Service
, @Controller
, @RestController
, @Repository
,... и добавления их в контейнер Spring (что позволяет им быть @Autowired
).
@EntityScan
, с другой стороны, не создает бины, насколько я знаю. Он только определяет, какие классы должны использоваться конкретным постоянным контекстом. Начиная с весенней загрузки 1.4, которая включает JPA, MongoDB, neo4j, Cassandra и CouchBase.
Почему они не объединены? Ну, я не в команде Spring, но поскольку они имеют разные значения, зачем их объединять? @EntityScan
должен в основном использоваться для сканирования ваших пакетов сущностей, тогда как @ComponentScan
должен сканировать все пакеты, содержащие бины Spring, поэтому очень вероятно следующее:
@ComponentScan("org.example.base")
@EntityScan("org.example.base.entities")
public class MyConfig {
}
Ответ 2
@EntityScan
представляет собой аннотацию debrecated, используемую для идентификации сущностей JPA, то есть постоянных классов, с точки зрения базы данных.
Вы используете @ComponentScan
для поиска компонентов с точки зрения Spring, то есть классы (также известные как Java Beans), аннотированные с помощью @Component
, @Service
, @Repository
, @Controller
... Это компоненты Spring, добавленные в контейнер IoC.