#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.