Как зарегистрировать бины из всех подпакетов в загрузочном приложении Spring? - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю новое приложение spring boot + jpa + thymeleaf, я использую много модулей, которые размещены в подпакетах.У меня есть структура, подобная ge.my.project, где мой основной класс размещен с @SpringBootApplication, и под этим package у меня есть подпакеты ge.my.project.dao, ge.my.project.service, ge.my.project.controller и так далее, где размещены мои бины. @SpringBootApplicationсканирует только бины в базовом (ge.my.project) пакете, но я хочу сканировать beans из всех вложенных пакетов.

Я пробовал много вариантов для сканирования sub packages:

@ComponentScan(basePackages = {"ge.my.project.controller","ge.my.project.service","ge.my.project.configuration"})

и

@ComponentScan({"ge.my.project.controller","ge.my.project.service","ge.my.proj ect.configuration"})

и

@ComponentScan("ge.my.project.*")

но ничего не получается, когда я пытаюсь внедрить бины с помощью @Autowired Я получаю ошибкувот так Consider defining a bean of type 'ge.my.project.service.ServiceTypeService' in your configuration.

Вот мой основной класс

package ge.my.project;

import ge.ufc.inhouseProjects.controller.ServiceTypeController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;


 @SpringBootApplication
//@ComponentScan(basePackages = {"ge.my.project.controller","ge.my.project.service","ge.my.project.configuration"})
@ComponentScan({"ge.my.project.*"})
@EntityScan({"ge.my.project.entity"})
@EnableJpaRepositories("ge.my.project.dao")
public class InhouseProjectsApplication {

public static void main(String[] args) {
    /*ApplicationContext applicationContext = */SpringApplication.run(InhouseProjectsApplication.class, args);
}

}

Вот мой полный проект https://github.com/JavaGeoGroup/inhouseProjects.git

Какой самый простой способ сканировать все компоненты проекта вприложение весенней загрузки?

1 Ответ

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

Вы должны аннотировать реализацию, а не интерфейс.Таким образом, в вашем случае аннотацию @Service необходимо установить для ServiceTypeDaoImpl-class вместо ServiceTypeDao-interface.


Вам необходимо аннотировать ваши компоненты (вашу реализацию интерфейсов, а не интерфейсы репозитория данных Spring) аннотацией @ Component или одной из ее поданнотаций, таких как @Репозиторий, @Service, @Controller, @ Configuration .

Из javadoc @Component:

 * Indicates that an annotated class is a "component".
 * Such classes are considered as candidates for auto-detection
 * when using annotation-based configuration and classpath scanning.
 *
 * <p>Other class-level annotations may be considered as identifying
 * a component as well, typically a special kind of component:
 * e.g. the {@link Repository @Repository} annotation or AspectJ's
 * {@link org.aspectj.lang.annotation.Aspect @Aspect} annotation.

Специфические расширения вашего кода: Spring bean начинаются с небольшого регистра, поэтому ваш интерфейс«ServiceTypeDao» будет зарегистрирован как «serviceTypeDao», если вы не указали конкретное имя в аннотации «@Service».

...