Евгений Борисов - Spring Patterns

2020 ж. 17 Ақп.
125 431 Рет қаралды

Сколько дизайн паттернов вы знаете? 24? 36? 100? А сколько из них вы применяете в реальной жизни? 3? 5? 10?
В этом докладе Евгений покажет, как при помощи спринга можно легко и просто реализовывать наиболее популярные паттерны, с которыми мы сталкиваемся в повседневной жизни. Chain of responsibility, strategy, command, lazy initialization, scala traits, AOP, proxy, decorator и прочие паттерны и концепции, внедренные при помощи спринга, сделают ваш код мягким и шелковистым. А перхоть вашего бойлерплэйта в виде switch-ей, статических методов, наследования, и прочей устаревшей шелухи, посыпется с вашего проекта под радостные крики сонара. Код станет более читабельным, гибким и поддерживаемым. Такой код проще обкладывать тестами и, наконец, это просто красиво.
В этом докладе мы не будем ковырять внутренности спринга или пытаться его кастомизировать. Мы даже не напишем ни одного бин пост процессора или стартера (разве что кастомный класслоадер). Только практические задачи и самый обычный, простой, добрый, пятый спринг.

Пікірлер
  • Доклады Евгения можно смотреть бесконечно! Все по делу, легко, доходчиво и с юмором. Спасибо за труд!

    @pavelbodrov5002@pavelbodrov50024 жыл бұрын
  • "Я звоню этому человеку, а он сейчас рожает 😳" Евгений Борисов потрясающий человек! Спасибо ему!

    @xxx---xxx---xxx@xxx---xxx---xxx7 ай бұрын
  • 1:58 - Шесть фаз понимания сингалтона: Фаза 1. Студент (шутка про виски) 2:10 - Шесть фаз понимания сингалтона: Фаза 2. Стажёр (приватный конструктор и статический метод getInstance) 3:09 - Шесть фаз понимания сингалтона: Фаза 3. Junior (+synchronized на статический метод) 3:43 - Шесть фаз понимания сингалтона: Фаза 4. Senior (+дабл чек) 4:29 - Оптимизации в Java и в Hotspot 6:23 - Оптимизация Out-Of-Order Execution 9:06 - Шесть фаз понимания сингалтона: Фаза 5. Lead (+volatile) 9:56 - Eager Singleton: Jetbrains - создание синглтона сразу при загрузке класса при инициализации статической переменной 10:29 - Eager Singleton: Enum 11:01 - Singleton - антипаттерн? 11:26 - Эволюция TDD 21:22 - Юнит тестирование 24:32 - Пример использования Mockito 27:26 - фреймворк PowerMock 28:51 - Почему Singleton (через статический метод getInstance) - антипаттерн 30:12 - Правильный синглтон - Spring Singleton! 31:00 - Не ленивые синглтоны и важность Fail-fast 31:49 - Зачем нужен ленивый синглтон 32:19 - Новый способ реализации 3-фазы конструктора (EventListener) из Спринг-потрошителя ч.2. 34:25 - Lazy injection - @Lazy не только над классом, но и над местом инъекции 35:23 - паттерн Chain of responsibility - для обеспечения Open-closed principle 37:17 - паттерн Strategy / Command/ «Никогда не используй Switch!» 44:20 - "We love you, Switch" - как делать правильно. Способ 1 - по id бинов 50:21 - "We love you, Switch" - как делать правильно. Способ 2 - по идентифицирующему методу интерфейса 53:05 - "We love you, Switch" - как делать правильно. Способ 3 - паттерн registry (для бинов, которые создаются после создания контекста) 54:55 - "хак" - инъекция в дефолтный метод интерфейса - для обязательного запуска метода при создании имплементаций 56:19 - Scala traits - перечень аннотаций, которые будут работать в дефолтных методах интерфейсов

    @strash1692@strash16922 жыл бұрын
  • Я человек простой - вижу доклад Е. Борисова, ставлю лайк.

    @alexhali6003@alexhali60034 жыл бұрын
  • Женя Борисов you are the best! дайте уже ему столько времени сколько сам захочет! :)

    @Denis-Orlov@Denis-Orlov4 жыл бұрын
    • В новом митапе «Spring-построитель» примено это и произошло)

      @eugenetrifonov5101@eugenetrifonov51014 жыл бұрын
    • @@eugenetrifonov5101 Там тоже не хватило.

      @finalename7464@finalename74643 жыл бұрын
  • Евгений, огромная благодарность! Очень информативно и с юмором. У нас преподаватель по матанализу похожим образом преподавал. Тоже очень нравилось слушать его лекции. Не скучно, информативно, с живыми примерами.

    @Devivl@Devivl2 ай бұрын
  • Смотреть доклад и приятно и полезно, спасибо)) Поддержу, что можно было бы и дольше ❤

    @fur_mur@fur_mur4 ай бұрын
  • Смотрел как крутой фильм! вот это уровень! мужик ты красавчик!

    @user-zw4yv4um2l@user-zw4yv4um2l Жыл бұрын
  • Очень грамотно, информативно и просто. Спасибо!

    @konstantinchvilyov9602@konstantinchvilyov96024 жыл бұрын
  • Шикарно! Спасибо огромное!

    @sergeykovalev7276@sergeykovalev7276 Жыл бұрын
  • Круто! Спасибо за видос :)

    @delalen8012@delalen80124 жыл бұрын
  • Спасибо, узнал новое для себя!

    @antonvarganov1312@antonvarganov13123 жыл бұрын
  • Просто огонь 🔥 спасибо за доклад Евгению, спасибо автору за видео 👍

    @epic3386@epic33863 жыл бұрын
  • Превосходный доклад.

    @MrStim@MrStim3 жыл бұрын
  • отличный доклад, как и всегда)

    @VasillaRobocraft@VasillaRobocraft28 күн бұрын
  • Отдельное спасибо за рефакторинг switch в коллекцию. Порой в спринге и вправду творится магия:)

    @arthureirich7591@arthureirich7591 Жыл бұрын
  • 44:19 Мне стало грустно после этой фразы "-Это последнее, что я вам покажу".

    @HowItWorks@HowItWorks3 жыл бұрын
  • Просто топ)

    @user-gl7gg8gz2g@user-gl7gg8gz2g4 жыл бұрын
  • Круто, я хоть и php разработчик, но для себя подчеркнул много нового.

    @viacheslav90@viacheslav903 жыл бұрын
  • Thanks so much for this tutorial.

    @romantsyupryk3009@romantsyupryk30094 жыл бұрын
  • Отношения к разработке на Java у меня никакого нет, но, тем не менее, доклад посмотрел с интересом. Теперь буду знать про сингальтоны и виски)

    @user-vm1hi7bo5s@user-vm1hi7bo5s9 ай бұрын
  • Охрененно

    @-is.perfect-@-is.perfect-4 жыл бұрын
  • The best!

    @marinakaryukova6231@marinakaryukova62314 ай бұрын
  • паттерн избавления от swith вообще топчик!!!

    @user-vm7re9bu9r@user-vm7re9bu9r2 жыл бұрын
  • спасибо

    @alexmur07@alexmur073 жыл бұрын
  • в джаве же 3 три вида памяти насколько я помню : stack, heap и metaSpace. В metaSpace хранятится string pool, параметры статических методов, информация о классах и т.п. Он пришел на замену как раз PermGen про которую говорил Женя

    @sergeistarodubov2534@sergeistarodubov25343 жыл бұрын
    • С восьмой до шести, уникальные для каждого потока: program counter, jvm stack, native method stack. Общие: heap, method area(для метадаты), runtime constraut pool. Permgen и metaspace это термины сборщика мусора, он не делит память, просто помечает области. Это как я понял

      @ormoroe@ormoroe3 жыл бұрын
    • String pool с седьмой джавы хранится в хипе

      @ormoroe@ormoroe3 жыл бұрын
    • @@ormoroe так никто физически память не делит, не только GC. Все ее просто помечают)

      @sergeistarodubov2534@sergeistarodubov25343 жыл бұрын
  • Я не понял про Singleton, а именно причина, почему нужно делать volatile. Насколько я знаю, для synchronized работает happens before, поэтому singleton == null будет работать с заново загруженной переменной из heap. А проблема как раз в том (именно, почему нужно volitile добавить), что в строке singleton = new Singleton() может раньше вернуться ссылка на объект, в котором могут быть поля, которые не final, и они могут быть еще не проинициализированы.

    @user-uh8nb2vj4f@user-uh8nb2vj4f4 жыл бұрын
    • Была бага до версии java 1.5 и при определённой фазе луны оно не правильно работало. Сейчас JMM пофиксили и все работает.

      @vlad-pizza-2013@vlad-pizza-20134 жыл бұрын
    • Да, я с вами согласен. Проблема на самом деле в том, что может вернуться объект, у которого еще не вызван конструктор. Это проблема reordering в самом компиляторе при исполнении в мультипроцессорных машинах. Следовательно, поля могут иметь дефолтные значения, а не которые присвоены конструктором. По крайней мере, так писали в The "Double-Checked Locking is Broken" Declaration

      @arthura.kupriyanov4667@arthura.kupriyanov46674 жыл бұрын
    • Это проблема безопасной публикации, к сожалению подготовился он плохо и суть передана не полно. Крайне неудачный пример от биг дата инженер.

      @bananasba@bananasba4 жыл бұрын
  • 11:40 TDD for me is a Type Driven Development :)

    @Software.Engineering.in.Action@Software.Engineering.in.Action Жыл бұрын
  • Я долго думал, кого же Евгений Борисов напоминает мне по манере речи. Вспомнил! Александра Якушева из команды КВН сборная Курска)) А так, Борисов очень крутой чувак!!!

    @akimovpavel3084@akimovpavel30842 жыл бұрын
    • Голос вообще не похож манера нееее

      @lisafox9026@lisafox90262 жыл бұрын
    • А ещё говорящая голова вкс на него похож)))

      @vlera4198@vlera4198 Жыл бұрын
  • Последний пример с registerMySelf не будет работать, если например у этого бина будет скоуп на уровне запроса (или прототипа) с proxy mode = target classs. тогда спринг не начнет создавать бин пока кто-то не обратится к прокси этого бина.

    @Tronal@Tronal2 жыл бұрын
  • Ещё раз огромное спасибо! А где-то есть продолжение или более подробный рассказ конца этого доклада?

    @konstantinchvilyov9602@konstantinchvilyov96024 жыл бұрын
    • Возможно, вам покажется интересным наш митап с участием Евгения :) kzhead.info/sun/pchvp9yIsYqHqac/bejne.html

      @TechTrainFest@TechTrainFest4 жыл бұрын
    • @@TechTrainFest Таки да! Уже смотрю :)

      @konstantinchvilyov9602@konstantinchvilyov96024 жыл бұрын
    • @@TechTrainFest А почему митап ? Для загадочности? :)

      @konstantinchvilyov9602@konstantinchvilyov96024 жыл бұрын
  • Видос просто огонь. Большое спасибо , Женя !

    @xandrviking1113@xandrviking111310 ай бұрын
  • Solid 0:01:40 singleton 0:06:00 out of order execution optimization and its effect on double check without volatile 0:11:00 singleton is antipattern. why and why not in context of single responsibility. importance of UNIT tests 0:13:20 про single responsibility 0:20:00 lombok @AllArgsConstructor 0:33:00 Lazy singleton initialization 0:35:00 open close principle and use of chain of responsibility design pattern (list of handlers) 0:37:00 strategy/command design pattern (про switch) 0:53:00 registry design pattern (trick with @autowired and default method interface)

    @savar33@savar333 жыл бұрын
    • @techtrain спасибо. Доклады Жени - топ

      @savar33@savar333 жыл бұрын
  • спасибо, очень интересно. а продолжение будет?

    @dmitriypronichev7048@dmitriypronichev70483 жыл бұрын
    • Можем посоветовать посмотреть наш митап с Евгением Борисовым - Spring-построитель kzhead.info/sun/pchvp9yIsYqHqac/bejne.html

      @TechTrainFest@TechTrainFest3 жыл бұрын
  • 16:30 my timestamp

    @edwin-jq4dp@edwin-jq4dp4 жыл бұрын
  • Скажите это точно не Александр Якушев из Примы?

    @user-ro1lq7ve2g@user-ro1lq7ve2g3 жыл бұрын
  • 42:00 я слышал про другой случай - был утилитный класс в котором было куча утилитных методов. и в конце концов уперлись в ограничение джавы на размер класса (оказывается есть такое)). и тимлид выдал гениальное решение- класс тупо поделили пополам на 2 утилитных класса.

    @vlera4198@vlera41984 ай бұрын
  • На 56 минуте нельзя будет так сделать после 6 версии спринга, поскольку уберут возможность кидать @autowired на методы. Выпиливают setter injection (но это не точно)

    @zuzu-wz9be@zuzu-wz9be Жыл бұрын
  • и как этот шаблон проектирования называется ?) в конечном то итоге?))

    @alexmur07@alexmur073 жыл бұрын
  • Елис)))

    @kabkasik@kabkasik3 жыл бұрын
  • Я правильно понял, что паттерн registry ломает принцип single responsibility?

    @jonua@jonua3 жыл бұрын
  • Спасибо за доклад, не совсем понимаю как отработал registerMySelf если его не вызывали, как жто хэндлиться, в какой момент он будет вызвал и отработан, у всех классов реализаций одновременно, вот эти вопросы интересуют, возможно статейку, пока нахожу только как обычная setter injection, но эти методы явно вызывают, вот это смутило

    @romanihnatov5629@romanihnatov56293 жыл бұрын
    • Этот метод будет вызываться спрингом, когда тот будет создавать бин, который реализует данный интерфейс. После создания бина (еще до вызова post construct) спринг пройдется по всем методам, которые помечены autowired и вызовет их, передав в них нужные параметры. Именно так работает обычный setter injection, просто здесь сам сеттер вынесли в дефолтный метод интерфейса. Ну и логика не сеттера, но спрингу то без разницы, он просто его вызывает. До какой то версии спринга autowired над дефолтным методом не работал, насколько я помню. Вроде бы в спринг паззлерах Евгений про это рассказывал (где-то точно рассказывал).

      @funbiscuit@funbiscuit2 жыл бұрын
    • @@funbiscuit спасибо за ответ!

      @romanihnatov5629@romanihnatov56292 жыл бұрын
  • Евгению можно давать время сколько ему нужно!!!! Что бы он все дописывал

    @lisafox9026@lisafox90262 жыл бұрын
    • это не поможет, помнится как-то был 8 часов доклад с ним)

      @Qnoize@Qnoize Жыл бұрын
  • А где strategy и command? На слайдах это было упомянуто и в описании видео есть, но по ходу выступления так и не было упомянуто...

    @WebSterXGM@WebSterXGM4 жыл бұрын
    • Там, где switсh заменил на компоненты

      @donquih0te396@donquih0te3964 жыл бұрын
    • @@donquih0te396 разобрался, спасибо!

      @WebSterXGM@WebSterXGM4 жыл бұрын
  • Классика 😏

    @obusis@obusis4 ай бұрын
  • У нас досих пор как в первой истории местами

    @galinashapoval2695@galinashapoval26952 жыл бұрын
  • Почему собака лэйзи, а не штрудель лэйзи?

    @alex-petrov@alex-petrov3 жыл бұрын
  • Тред, синглтон

    @infosmartsound@infosmartsoundАй бұрын
  • я не понимаю как в гите при мердже могут улетать отдельные строчки (ну, если их никто не правил, конечн)

    @ventilyator@ventilyator4 жыл бұрын
  • Сингалтон антипатерн потому что приводит к ожирению!

    @nikibut3073@nikibut3073 Жыл бұрын
  • Про юнит-тесты не согласен. Основные проблемы лежат именно в интеграции между модулями. Если будут только юнит-тесты, то интеграция остается не протестирована. А если делать нормальные интеграционные тесты + юнит, то в случае проблем упадут и те и те, и человеки также испугаются. Выходит что у юнитов нет смысла. И эта проблема "всё упало и страшно" это надумано. Начинаешь разбираться и сразу понятно откуда проблема

    @user-ke1ix8ob9b@user-ke1ix8ob9b7 ай бұрын
  • Великолепный спикер! Но успокойте меня кто-нибудь. Скажите, пожалуйста, что не один я такой тупой, что почти ничего не понял 😂

    @Vladimir-vd2im@Vladimir-vd2im Жыл бұрын
  • Подскажите, как писать тесты для микросервисов?

    @reliniideadea@reliniideadea3 жыл бұрын
    • посмотрите про testcontainers

      @vyacheslavs5642@vyacheslavs56427 ай бұрын
  • 49:22 логичнее было бы называть классы переставив слова: MailGeneratorHappyBirthday. Тогда мы сразу в панели project слева видели бы все классы данной группы в алфавитном порядке

    @tatyanayurchenko6840@tatyanayurchenko6840 Жыл бұрын
  • 23:22 ах сука, наобарот сделал((

    @DimaTiunov@DimaTiunov3 ай бұрын
  • default в интерфейсах создалидля обратной совместимости, а не чтобы использовать как "патерн". Так что последний вариант это больше "плохой пример" чем рекомендация ;)

    @AlexJPep@AlexJPep3 жыл бұрын
  • мок на английском - ржать над кем-то))) Чтобы точно ни у кого вопросов не возникло!))

    @olegpicik363@olegpicik3633 ай бұрын
  • 11:28 "Профессионалы не ошибаються" - пишется без мягкого знака 😁😁😁 (возможно в этом и была ирония, но не мог пройти мимо этого в любом случае) Спасибо за видео ))

    @kolob204@kolob2042 жыл бұрын
    • Конечно ирония. И ты не все ошибки там нашел)

      @at0m616@at0m6162 жыл бұрын
  • Блин. Ну как бы всё круто, но за такие лайфхаки тебя будут проклинать будущие поколения твоих коллег. Круто когда ты умеешь писать всои бинпостпроцессоры и аннотации. Но это должно быть очевидным для применения.

    @ipasenko@ipasenko2 жыл бұрын
  • Некорректное объяснение причины появления volatile keyword в double-check singleton pattern.

    @falken5869@falken58693 жыл бұрын
  • Не нужно экспертам в software development выступать с мыслями про эпидемиологии, даже вскользь не нужно, это важно. Евгений лидер мнений и кумир молодежи. Неосторожные высказывания про заговоры и проделки мирового масонского правительства могут стоить жизни кому-то из тех, кто поверит в этот псевдонаучный бред. Слушайте Женю про спрингбут, не слушайте Женю про коронавирус.

    @baschlykoff@baschlykoff2 жыл бұрын
  • "надеюсь мои дети тоже будут программистами, других профессий не будет, все будт делать компьютеры" - ясно. Спасибо, что сразу показал свой уровень, сэкономил мне время.

    @user-yl7jt7bw6o@user-yl7jt7bw6o4 жыл бұрын
    • Аргументируйте.

      @user-zl5fj4vl1t@user-zl5fj4vl1t4 жыл бұрын
    • @@user-zl5fj4vl1t Слишком узкий взгляд, экстраполяция для сложных систем не годный метод. Вот совсем недавно некоторые деятели в одной "энергетической сверхдержаве" тоже предрекали, что цена на углеводороды будет только расти, а при цене нефти ниже 80 мировая экономика рухнет)

      @user-yl7jt7bw6o@user-yl7jt7bw6o4 жыл бұрын
    • @@user-yl7jt7bw6o Это была ирония. Спасибо, что сразу показали уровень своего чувства юмора, скепсиса головного мозга, а также самооценки (судя по никнейму).

      @serjpavlenko@serjpavlenko4 жыл бұрын
    • @@serjpavlenko это может быть реальные фамилия и имя, а еще может быть разное ударение -> Изольда вАгина

      @user-zl5fj4vl1t@user-zl5fj4vl1t3 жыл бұрын
  • Много воды, мало конкретики. Всего два простых паттерна за час? В конце вообще жуть какая-то с авторегистрацией, не делайте так.

    @WERT2025@WERT20252 жыл бұрын
  • Ну можно было перед выступлением слайды на орфографические ошибки проверить, что за....

    @vpurazov@vpurazov2 жыл бұрын
    • человек в израиле живет постоянно

      @kotojava@kotojava6 күн бұрын
KZhead