На какие основные функциональные модули делится Spring Framework?

Ответ

Spring Framework организован в виде набора модулей, которые можно использовать независимо. Основные группы:

Ядро и Контейнер (Core Container)

  • spring-core: Фундаментальные утилиты, поддержка IoC/DI.
  • spring-beans: Реализация BeanFactory — фабрики бинов.
  • spring-context: Модуль ApplicationContext, поддержка международization, события, способы внедрения (например, @Autowired).
  • spring-expression (SpEL): Язык выражений Spring для запросов и манипуляций графом объектов во время выполнения.

Аспектное программирование (AOP) и Instrumentation

  • spring-aop: Поддержка аспектно-ориентированного программирования, проксирование.
  • spring-aspects: Интеграция с AspectJ.

Доступ к данным (Data Access/Integration)

  • spring-jdbc: Упрощенный доступ к JDBC, JdbcTemplate.
  • spring-orm: Интеграция с ORM-фреймворками (Hibernate, JPA).
  • spring-tx: Декларативное и программное управление транзакциями.
  • spring-oxm: Поддержка Object/XML маппинга (Marshalling/Unmarshalling).

Веб (Web)

  • spring-web: Базовая веб-интеграция, клиенты для HTTP, поддержка Servlet API. Содержит основу для Spring MVC.
  • spring-webmvc (Spring MVC): Модуль для построения веб-приложений по паттерну Model-View-Controller.
  • spring-websocket: Поддержка WebSocket.
  • spring-webflux: Реактивный стек для построения неблокирующих веб-приложений.

Прочие ключевые модули

  • spring-test: Поддержка модульного и интеграционного тестирования с помощью SpringRunner и аннотаций (@SpringBootTest, @DataJpaTest).
  • spring-messaging: Абстракции для работы с messaging-паттернами, основа для spring-websocket и spring-integration.

Пример использования модуля spring-webmvc:

@RestController // Из spring-webmvc
@RequestMapping("/api") // Из spring-webmvc
public class UserController {
    @Autowired // Из spring-context
    private UserService userService;

    @GetMapping("/users/{id}") // Из spring-webmvc
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return ResponseEntity.ok(user); // Использует spring-web
    }
}

Важно: Современные проекты часто используют Spring Boot, который автоматически настраивает и объединяет необходимые модули на основе зависимостей в pom.xml или build.gradle.

Ответ 18+ 🔞

Да ты посмотри на эту конструкцию, блядь! Spring Framework — это ж не монолит какой-то, а как конструктор, ёпта. Взял что надо — поставил. Не надо — не хуя не тащи. И всё разложено по полочкам, чтоб не рыться, как свинья в апельсинах.

Вот смотри, основные банды модулей:

Ядро и Контейнер (Core Container) — это основа основ, без этого нихуя

  • spring-core: Ну, это как фундамент, блядь. Базовые плюшки и главная фишка — IoC/DI. То есть, не ты объекты создаёшь, а тебе их, сука, подкладывают, где надо.
  • spring-beans: А это фабрика, где эти самые бины (объекты) штампуются. BeanFactory, блядь. Конвейер.
  • spring-context: Это уже продвинутая версия контекста, ApplicationContext. Тут и события всякие, и интернационализация, и волшебное внедрение через @Autowired — аннотацию, от которой у новичков волосы дыбом.
  • spring-expression (SpEL): Язык выражений, чтоб на лету, блядь, с объектами шаманить. Типа #{user.name.toUpperCase()}. Мощная штука, но если неаккуратно — себе же хуже сделаешь.

Аспектное программирование (AOP) и Instrumentation

  • spring-aop: Вот это магия, ёбта! Хочешь логирование или транзакции навесить на все методы разом, не ковыряя каждый? Это сюда. Прокси, блядь, прокси вокруг твоих бинов.
  • spring-aspects: Если родного AOP мало — подключаем тяжёлую артиллерию, AspectJ. Теперь можно вообще везде и всюду.

Доступ к данным (Data Access/Integration) — тут с базами работаем

  • spring-jdbc: Чтоб не писать этот адский try-catch-finally с Connection и PreparedStatement. JdbcTemplate — спасение, в рот меня чих-пых!
  • spring-orm: Хочешь с Hibernate или JPA работать? Этот модуль поможет им с Spring подружиться.
  • spring-tx: Управление транзакциями. Аннотацию @Transactional повесил — и всё, блядь, само откатится, если что. Красота.
  • spring-oxm: XML'и и объекты. Marshalling, Unmarshalling. Нужно нечасто, но если надо — оно тут есть.

Веб (Web) — для тех, кто в браузере сидит

  • spring-web: База для веба. Клиенты HTTP, работа с Servlet API. Основа, на которой MVC стоит.
  • spring-webmvc (Spring MVC): Царь и бог веб-слоя по старинке. Контроллеры, @RequestMapping, вся эта классика.
  • spring-websocket: Для реального времени, чтоб без этих дурацких опросов каждую секунду.
  • spring-webflux: Новый, реактивный закос. Неблокирующий, асинхронный. Для масштаба, но мозг выносит конкретно.

Прочие ключевые модули — без них тоже никуда

  • spring-test: Тестирование, блядь! Без него как без рук. @SpringBootTest, @DataJpaTest — аннотации, которые поднимают кусок контекста специально для тестов. Не надо городить огород.
  • spring-messaging: Абстракции для обмена сообщениями. Основа для других модулей.

Вот, смотри, как это в коде сходится, на примере spring-webmvc:

@RestController // Это из spring-webmvc, чувак
@RequestMapping("/api") // И это тоже
public class UserController {
    @Autowired // А это магия из spring-context, тебе бин сам подсунут
    private UserService userService;

    @GetMapping("/users/{id}") // Опять spring-webmvc
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return ResponseEntity.ok(user); // А ResponseEntity — это из spring-web
    }
}

И главное, запомни: щас все умные используют Spring Boot. Это такой волшебный пендель, который смотрит на твой pom.xml или build.gradle, видит, что ты добавил spring-boot-starter-web, и сам, блядь, подтягивает spring-webmvc, spring-web и ещё овердохуища нужных зависимостей, конфигурирует их за тебя. Сидишь и кодишь, а не борешься с XML-конфигами, как в старые добрые времена. Прогресс, ёпта!