Многокомпонентное сканирование компонентов не работает в режиме загрузки spring
У меня есть два модуля сети и бизнеса. Я включил бизнес в Интернете. Но когда я пытаюсь включить сервисный интерфейс из бизнеса в сеть, используя @autowired
, он дает org.springframework.beans.factory.NoSuchBeanDefinitionException
.
Таким образом, в принципе @SpringBootApplication
не может сканировать @Service
из бизнес-модуля.
Это что-то простое, мне не хватает?
Если я добавлю @Bean
для этой службы в классе @SpringBootApplication
, она будет работать нормально.
Код:
package com.manish;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
public class SpringBootConfiguration {
public static void main(String[] args) {
SpringApplication.run(SpringBootConfiguration.class, args);
}
}
Класс из модуля 1, из которого вызывается класс из модуля 2:
package com.manish.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import uk.co.smithnews.pmp.service.contract.UserRegistrationService;
@RestController
@RequestMapping("/testManish")
public class SampleController {
@Autowired
private SampleService sampleService;
....
}
Модуль 2:
package com.manish.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SampleServiceImpl implements SampleService {
}
Спасибо,
Ответы
Ответ 1
@SpringBootApplication
только сканирует пакеты класса с самой аннотацией и всеми пакетами ниже.
Пример. Если класс с аннотацией SpringBootApplication находится в пакете com.project.web
, то эти пакеты и все ниже, которые сканируются.
Однако, если у вас есть ваши услуги в пакете com.project.business
, beans не будет отсканирован.
В этом случае вам нужно добавить аннотацию @ComponentScan()
к вашему классу приложения и добавить все пакеты, которые вы хотите отсканировать в качестве значения в этой аннотации, например. @ComponentScan({"com.project.web", "com.project.business"})
.