Spring boot DI с использованием inject. Класс не распознан

#java #spring-boot #dependency-injection

#java #spring-boot #зависимость-внедрение

Вопрос:

Я пытаюсь запустить приложение Spring boot. Я хочу использовать DI наверняка, и я изучаю javax.inject пакет аннотаций. Однако документации по нему очень мало. Это то, что у меня пока очень простая настройка

 @RestController
public class HelloController {

    @Inject
    private IGreetingService greetingService;

    @RequestMapping("/")
    public String index() {

        return greetingService.greet();
    }
}

public class GreetingService implements IGreetingService {

    @Override
    public String greet(){
        DummyObject dummyObject = new DummyObject("valueOne", 10);
        ObjectMapper mapper = new ObjectMapper();

        String dummyObjectJson = "";
        try{
            dummyObjectJson = mapper.writeValueAsString(dummyObject);
        }catch(IOException e){}

        return dummyObjectJson;
    }
}
  

Я получаю следующую ошибку:

 Field greetingService in com.accenture.greetings.HelloController required a bean of type 'com.accenture.interfaces.IGreetingService' that could not be found.
  
  • Должен ли я действительно определять свой GreetingsService как компонент в XML? Я бы предпочел этого не делать.
  • Какие дополнительные аннотации / классы / contextmanagers мне нужны, чтобы убедиться, что greetingsService распознан и введен правильно?

Комментарии:

1. Поместите @Component аннотацию над своим классом GreetingService .

2. Не работает. Та же ошибка. Должен упомянуть, что класс обслуживания также входит в другой пакет

3. Класс service должен находиться в том же пакете или в пакете, который находится в пакете, содержащем ваш класс приложения Spring Boot. Вы можете найти много хороших руководств здесь: spring.io/guides

Ответ №1:

@Service Включите GreetingService , и если это не сработает, проверьте структуру проекта.

Если другие ваши иерархии пакетов находятся ниже вашего основного приложения с @SpringBootApplication аннотацией, вы охвачены неявным сканированием компонентов.

Если в других пакетах есть компоненты, которые не являются подпакетами основного пакета, вы должны вручную добавить их как @ComponentScan

Комментарии:

1. @Service , @Component и @ComponentScan предоставляются ли аннотации Spring boot, верно? Какова роль Spring boot, если вы используете javax.inject.Inject ?

2. Да, правильно, теперь ответ на второй вопрос заключается в том, что Spring — не единственная платформа, которая обеспечивает внедрение зависимостей, в будущем, если вы измените свой контейнер и перейдете на другую платформу DI, такую как Google Guice, вам необходимо перенастроить ваше приложение. Вы можете потенциально избежать этих усилий по разработке, используя стандартные аннотации, указанные в JSR-330 Компонент, объявленный как автоматически подключаемый с помощью @Inject, будет работать как в Google Guice, так и в Spring Framework, и, возможно, в любом другом контейнере DI, который поддерживает аннотации JSR-330.