← Назад ко всем вопросам

Какие паттерны реализует Spring под капотом

1️⃣ Как кратко ответить

Spring реализует множество паттернов проектирования, включая Dependency Injection (DI), Aspect-Oriented Programming (AOP), Template Method, Proxy, Singleton, Factory Method и Observer. Эти паттерны помогают управлять зависимостями, разделять кросс-секционные задачи, создавать объекты и управлять их жизненным циклом.

2️⃣ Подробное объяснение темы

Spring Framework — это мощный инструмент для разработки Java-приложений, который под капотом использует множество паттернов проектирования. Рассмотрим основные из них:

Dependency Injection (DI)

Зачем это нужно: DI позволяет отделить создание объектов от их использования, что упрощает тестирование и управление зависимостями.

Как это работает: В Spring DI реализуется через контейнер, который управляет жизненным циклом объектов и их зависимостями. Вместо того чтобы создавать объекты вручную, вы описываете зависимости в конфигурации, а Spring автоматически их внедряет.

Пример:

public class Service {
    private Repository repository;
​
    // Конструктор с внедрением зависимости
    public Service(Repository repository) {
        this.repository = repository;
    }
}

В этом примере Service зависит от Repository. Spring автоматически создаст экземпляр Repository и передаст его в конструктор Service.

Aspect-Oriented Programming (AOP)

Зачем это нужно: AOP позволяет отделить кросс-секционные задачи, такие как логирование, транзакции и безопасность, от основной бизнес-логики.

Как это работает: AOP в Spring реализуется через аспекты, которые определяют, где и когда выполнять определенные действия.

Пример:

@Aspect
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Вызов метода: " + joinPoint.getSignature().getName());
    }
}

Этот аспект логирует вызов каждого метода в пакете com.example.service.

Template Method

Зачем это нужно: Этот паттерн позволяет определить основу алгоритма в методе, оставляя реализацию некоторых шагов подклассам.

Как это работает: В Spring этот паттерн часто используется в JDBC и других шаблонах, где общая логика работы с ресурсами инкапсулирована, а специфические детали оставлены для реализации.

Пример:

public abstract class AbstractTemplate {
    public final void execute() {
        stepOne();
        stepTwo();
        stepThree();
    }
​
    protected abstract void stepOne();
    protected abstract void stepTwo();
    protected abstract void stepThree();
}

Proxy

Зачем это нужно: Паттерн Proxy используется для создания прокси-объектов, которые управляют доступом к другим объектам.

Как это работает: В Spring Proxy используется для реализации AOP, где прокси-объекты добавляют дополнительное поведение к методам.

Пример:

public interface Service {
    void perform();
}
​
public class ServiceImpl implements Service {
    public void perform() {
        System.out.println("Выполнение сервиса");
    }
}
​
public class ServiceProxy implements Service {
    private ServiceImpl service;
​
    public ServiceProxy(ServiceImpl service) {
        this.service = service;
    }
​
    public void perform() {
        System.out.println("Прокси: перед выполнением");
        service.perform();
        System.out.println("Прокси: после выполнения");
    }
}

Singleton

Зачем это нужно: Singleton гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к нему.

Как это работает: В Spring по умолчанию все бины являются синглтонами, что означает, что для каждого бина создается только один экземпляр в контейнере.

Factory Method

Зачем это нужно: Этот паттерн используется для создания объектов без указания точного класса создаваемого объекта.

Как это работает: В Spring Factory Method используется для создания бинов через фабричные методы, которые определяют, как создавать экземпляры.

Observer

Зачем это нужно: Observer позволяет объектам подписываться и получать уведомления об изменениях состояния другого объекта.

Как это работает: В Spring этот паттерн используется в контексте событий приложения, где компоненты могут подписываться на события и реагировать на них.

Пример:

public class EventPublisher {
    private List<EventListener> listeners = new ArrayList<>();
​
    public void addListener(EventListener listener) {
        listeners.add(listener);
    }
​
    public void publishEvent(Event event) {
        for (EventListener listener : listeners) {
            listener.onEvent(event);
        }
    }
}

Эти паттерны проектирования делают Spring мощным и гибким инструментом для разработки сложных приложений, упрощая управление зависимостями, кросс-секционными задачами и жизненным циклом объектов.

Тема: Паттерны/SOLID
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки