Найти тему
Вопрос 4. Proxy паттерн. #java #pattern Proxy. Прокси выполняет роль агента который находится на полпути к целевому объекту и принимает запросы от клиента. Целевой объект получает и исполняет запросы уже от прокси. Поэтому целевой объект может фокусироваться только на своих задачах, а дополнительный функционал делегирует прокси. Пример из жизни Вы - Агент по недвижимости - Хозяин квартиры. Цели прокси: 1. Контроль доступа к целевым объектам 2. Наделение целевого объекта дополнительным функционалом Proxy создаются через прокси-паттерн, с использованием общего с цлевым объектом интерфейса. Чтобы создать прокси нужны три шага: 1. Имплементируем прокси от того же интерфейса что и целевой класс. 2. Через конструктор прокси-класса сохраняем целевой класс 3. В методах прокси-класса - выполняем доп логику и вызываем метод целевого класса или наоборот. Преимущества прокси: 1. Open-closed принцип - целевой класс открыт для расширения, но закрыт для изменений 2. Single responsibility - каждый класс отвечает за свои задачи Недостатки: 1. возрастает сложность кода 2. дублирование кода - требуется имплементировать интерфейс целиком. Последнее решается JDK dynamic proxy, но об этом позднее.
11 месяцев назад
Бины можно создавать в обычных компонентах, не конфигурационных классах. Такая семантика бинов (без @Configuration) называется lite-bean и в целом ведет себя также как обычный бин, за тем исключением что внутри lite-бина другие бин-методы вызываются как обычные методы, без прокси CGLIB, по аналогии с @Transactional. Обычные бины при обращении к другим бин-методам - берут значение из контекста. lite-бины, обращаясь ко внутренним бин-методам - будут дергать их напрямую. Цена за lite. После создания бина - значение уже будет возвращаться из контекста. Учитывайте разность поведения lite и обычных бинов в своем приложении.
11 месяцев назад
Почему при созданнии @Bean не в конфигурационном классе, а в компоненте - легче словить цикличную зависимость. Бины можно создавать в обычных компонентах, не конфигурационных классах. Такая семантика бинов (без @Configuration) называется lite-bean - но об этом позднее. Группирование бинов в классах @Configuration декомпозирует логику формирования bean-методов и классов-component-ов. Декомпозиция уменьшит вероятность того что вы будете вынуждены рефакторить сервисы, репозитории и прочие - из-за того что разложили бины в классы-компоненты. И да, @Configuration - тоже @Component, но это только означает что класс автоматически попадает в список кандидатов на попадание в контекст Spring. Ниже простой пример цикличной зависимости в с использованием lite-бинов. В данном коде бины из одного класса - требуются для конструктора другого. Проблема легко решается вынесением бинов в класс @Configuration
11 месяцев назад
PECS - продюсер - лучше <T extends>, консюмер - <T super>.
1 год назад
Try + catch|finnaly! Просто try использовать нельзя. Исключение - try с ресурсами. Требуется проверка.
1 год назад
В Java 7 появилась возможность подавлять исключения. Suppress
1 год назад
StackWalker с Java9 Позволяет отследить цепочку вызовов в глубину. https://www.baeldung.com/java-9-stackwalking-api
1 год назад
👉 У типов в JAVA определен частичный порядок "A>B" A - надтип B или B - подтип A ("A:>B", если допустимо A=B) 👉 "A:>B" - рефлексивно, антисимметрично, транзитивно (рефлексивно-транзитивное замыкание над предикатом "A>^1B" - прямой надтип) 👉 "A>B" - антирефлексивно, антисимметрично, транзитивно 👉 Надтип не должен предоставлять больше возможностей, чем предоставляет подтип (Барбара Лисков) 👇
1 год назад
Чекнул гипотезу из лекции как finally вызывается перед return. Все так, но не так просто. try игнорирует блок finally. Как если бы try в другом потоке выполнялся.
1 год назад
В java когда StackTrace исключения формируется не в момент выброса исключения, а в момент когда создаётся instance исключения.
1 год назад