Java EE, Spring core/web. Как правильно настроить application context с помощью аннотаций?

Допустим, имеем следующую структуру классов:
  • User (entity)
  • UserDAO (data layer)
  • UserService (service)
  • UserAdapter (adapter for user entity (DTO) (передается через слоя приложения, не совсем понимаю для чего это))
  • MainController (Servlet)

Как все это взаимодействует между собой я +- понимаю, но совершенно не могу понять как это дело сконфигурировать с помощью аннотаций (Java Bean):
<context:component-scan base-package="com.example" />

Собственно возник ряд вопросов:
  1. Какие аннотации к какому из представленных классов использовать и почему?
  2. Как все это дело прикрутить к web.xml?
  3. Нужно ли создавать отдельный класс-context и описывать зависимости там?
  4. Вызывается ли конструктор класса (например - UserService) при инициализации его как Bean?

Очень буду рад каким либо конкретным примерам инициализации всего этого чуда, ежели примеры еще и с пояснениями будут - рад буду в двойне.
  • Вопрос задан
  • 508 просмотров
Пригласить эксперта
Ответы на вопрос 1
zolt85
@zolt85
Программист
Если хочется все настроить через аннотации, то все возможно


Как все это дело прикрутить к 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-е издание, по-моему, сейчас актуально). Дядька очень доступно объясняет все заданные Вами вопросы, и работу многих компонентов фреймворка в целом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы