Если хочется все настроить через аннотации, то все возможно
Как все это дело прикрутить к web.xml?
Нужно ли создавать отдельный класс-context и описывать зависимости там?
web.xml вообще не нужен. Можно инициализировать dispatcher-servlet так
package configuration;
import org.springframework.web.servlet.support.*;
/**
* Настройка dispatcher-servlet
*/
public class MyAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{MvcContext.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
Тут надо обратить внимание на метод getServletConfigClasses. Им мы отдаем классы конфигурации dispatcher-servlet.
MvcContext.java может выглядеть так
@Configuration
@EnableWebMvc
public class MvcContext {/** тут описываем бины или иные настройки */}
Аннотация @Configuration говорит Spring-у что класс может содержать описания бинов.
Аннотация @EnableWebMvc импортирует базовую настройку spring-mvc (контроллеры, резолверы, хэндлеры всё вот это вот)
Какие аннотации к какому из представленных классов использовать и почему?
User - @Entity - я так понимаю JPA для работы с БД используется
UserService - @Service - ни к чему эта аннотация не обязывает, просто для удобства
MainController - @Controller - Spring поймет что класс обрабатывает HTTP запросы
остальные классы можно отметить аннотацией @Component, если они используются как бины спринга
Вызывается ли конструктор класса (например - UserService) при инициализации его как Bean?
Да, конечно. Как правило вызывается конструктор по-умолчанию, если таковой отсутствует, Spring свалится при старте приложения с ошибкой, что мол не могу создать бин.
Еще советую Вам ознакомиться с книгой Крейга Уоллса "Spring в действии" (4-е издание, по-моему, сейчас актуально). Дядька очень доступно объясняет все заданные Вами вопросы, и работу многих компонентов фреймворка в целом.