Какие паттерны проектирования активно применяются в Spring Framework?

«Какие паттерны проектирования активно применяются в Spring Framework?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring Framework построен на основе и активно использует множество паттернов проектирования. Вот ключевые из них:

  1. Dependency Injection (Внедрение зависимостей)фундаментальный паттерн Spring. Контейнер IoC управляет созданием бинов и автоматически внедряет их зависимости через конструктор, сеттеры или поля.

    @Service
    public class OrderService {
        private final PaymentService paymentService; // Зависимость
        // Внедрение через конструктор (рекомендуемый способ)
        public OrderService(PaymentService paymentService) {
            this.paymentService = paymentService;
        }
    }
  2. Singleton (Одиночка) – по умолчанию все бины в Spring контексте являются синглтонами (scope="singleton"). Контейнер гарантирует существование только одного экземпляра на контекст.

  3. Factory Method (Фабричный метод) – аннотация @Bean в классах, помеченных @Configuration, определяет фабричные методы для создания объектов, управляемых контейнером.

    @Configuration
    public class AppConfig {
        @Bean
        public DataSource dataSource() {
            return new HikariDataSource(); // Фабричный метод
        }
    }
  4. Proxy (Прокси) – основа Spring AOP. Для добавления сквозной функциональности (транзакции, кэширование, безопасность) Spring создает динамические прокси (JDK или CGLIB) вокруг целевых объектов.

    @Transactional // За кулисами создается прокси, управляющий транзакцией
    public void processOrder(Order order) {
        // бизнес-логика
    }
  5. Template Method (Шаблонный метод)JdbcTemplate, RestTemplate, JmsTemplate инкапсулируют шаблонный код (управление ресурсами, обработку исключений), оставляя разработчику реализацию только изменяемых частей (например, RowMapper).

  6. Observer / Event Listener (Наблюдатель) – механизм событий ApplicationEvent и слушателей @EventListener.

    @EventListener
    public void handleOrderCreatedEvent(OrderCreatedEvent event) {
        // Реакция на событие
    }
  7. Adapter (Адаптер)HandlerAdapter в Spring MVC адаптирует различные типы контроллеров к единому интерфейсу для обработки запросов.

  8. Decorator (Декоратор) – часто реализуется через AOP или Bean Post Processors для добавления поведения к бинам.

  9. Chain of Responsibility (Цепочка обязанностей) – фильтры в Spring Security (SecurityFilterChain) или в Servlet API (Filter).