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

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

Комментарии • 94

  • @pavelbodrov5002
    @pavelbodrov5002 4 года назад +198

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

  • @strash1692
    @strash1692 2 года назад +64

    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 - перечень аннотаций, которые будут работать в дефолтных методах интерфейсов

  • @xxx---xxx---xxx
    @xxx---xxx---xxx 7 месяцев назад +7

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

  • @alexhali6003
    @alexhali6003 4 года назад +89

    Я человек простой - вижу доклад Е. Борисова, ставлю лайк.

  • @Denis-Orlov
    @Denis-Orlov 4 года назад +89

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

    • @eugenetrifonov5101
      @eugenetrifonov5101 4 года назад +1

      В новом митапе «Spring-построитель» примено это и произошло)

    • @finalename7464
      @finalename7464 3 года назад +3

      @@eugenetrifonov5101 Там тоже не хватило.

  • @Devivl
    @Devivl 3 месяца назад +1

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

  • @user-zw4yv4um2l
    @user-zw4yv4um2l Год назад +3

    Смотрел как крутой фильм! вот это уровень! мужик ты красавчик!

  • @fur_mur
    @fur_mur 4 месяца назад +2

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

  • @user-vm1hi7bo5s
    @user-vm1hi7bo5s 9 месяцев назад +2

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

  • @delalen8012
    @delalen8012 4 года назад +6

    Круто! Спасибо за видос :)

  • @VasillaRobocraft
    @VasillaRobocraft Месяц назад

    отличный доклад, как и всегда)

  • @sergeykovalev7276
    @sergeykovalev7276 Год назад +1

    Шикарно! Спасибо огромное!

  • @antonvarganov1312
    @antonvarganov1312 3 года назад +4

    Спасибо, узнал новое для себя!

  • @epic3386
    @epic3386 3 года назад +12

    Просто огонь 🔥 спасибо за доклад Евгению, спасибо автору за видео 👍

  • @MrStim
    @MrStim 3 года назад +4

    Превосходный доклад.

  • @konstantinchvilyov9602
    @konstantinchvilyov9602 4 года назад +9

    Очень грамотно, информативно и просто. Спасибо!

  • @savar33
    @savar33 3 года назад +6

    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
      @savar33 3 года назад

      @techtrain спасибо. Доклады Жени - топ

  • @HowItWorks
    @HowItWorks 3 года назад +3

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

  • @viacheslav90
    @viacheslav90 3 года назад +2

    Круто, я хоть и php разработчик, но для себя подчеркнул много нового.

  • @xandrviking1113
    @xandrviking1113 10 месяцев назад +1

    Видос просто огонь. Большое спасибо , Женя !

  • @-is.perfect-
    @-is.perfect- 4 года назад +1

    Охрененно

  • @arthureirich7591
    @arthureirich7591 Год назад

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

  • @user-vm7re9bu9r
    @user-vm7re9bu9r 2 года назад +1

    паттерн избавления от swith вообще топчик!!!

  • @user-gl7gg8gz2g
    @user-gl7gg8gz2g 4 года назад +1

    Просто топ)

  • @alexmur07
    @alexmur07 3 года назад

    спасибо

  • @romantsyupryk3009
    @romantsyupryk3009 4 года назад +2

    Thanks so much for this tutorial.

  • @marinakaryukova6231
    @marinakaryukova6231 5 месяцев назад

    The best!

  • @user-uh8nb2vj4f
    @user-uh8nb2vj4f 4 года назад +9

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

    • @vlad-pizza-2013
      @vlad-pizza-2013 4 года назад +2

      Была бага до версии java 1.5 и при определённой фазе луны оно не правильно работало. Сейчас JMM пофиксили и все работает.

    • @arthura.kupriyanov4667
      @arthura.kupriyanov4667 4 года назад +3

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

    • @bananasba
      @bananasba 4 года назад +5

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

  • @akimovpavel3084
    @akimovpavel3084 3 года назад +4

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

    • @lisafox9026
      @lisafox9026 2 года назад

      Голос вообще не похож манера нееее

    • @vlera4198
      @vlera4198 Год назад

      А ещё говорящая голова вкс на него похож)))

  • @Software.Engineering.in.Action
    @Software.Engineering.in.Action Год назад +1

    11:40 TDD for me is a Type Driven Development :)

  • @vlera4198
    @vlera4198 4 месяца назад

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

  • @obusis
    @obusis 5 месяцев назад

    Классика 😏

  • @user-ro1lq7ve2g
    @user-ro1lq7ve2g 3 года назад +3

    Скажите это точно не Александр Якушев из Примы?

  • @konstantinchvilyov9602
    @konstantinchvilyov9602 4 года назад

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

    • @TechTrainFest
      @TechTrainFest  4 года назад

      Возможно, вам покажется интересным наш митап с участием Евгения :)
      ruclips.net/video/rd6wxPzXQvo/видео.html

    • @konstantinchvilyov9602
      @konstantinchvilyov9602 4 года назад

      @@TechTrainFest Таки да! Уже смотрю :)

    • @konstantinchvilyov9602
      @konstantinchvilyov9602 4 года назад

      @@TechTrainFest А почему митап ? Для загадочности? :)

  • @kabkasik
    @kabkasik 3 года назад +1

    Елис)))

  • @sergeistarodubov2534
    @sergeistarodubov2534 3 года назад +2

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

    • @ormoroe
      @ormoroe 3 года назад

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

    • @ormoroe
      @ormoroe 3 года назад +1

      String pool с седьмой джавы хранится в хипе

    • @sergeistarodubov2534
      @sergeistarodubov2534 3 года назад +1

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

  • @alexmur07
    @alexmur07 3 года назад

    и как этот шаблон проектирования называется ?) в конечном то итоге?))

  • @Tronal
    @Tronal 2 года назад

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

  • @jonua
    @jonua 3 года назад +1

    Я правильно понял, что паттерн registry ломает принцип single responsibility?

  • @dmitriypronichev7048
    @dmitriypronichev7048 3 года назад +1

    спасибо, очень интересно. а продолжение будет?

    • @TechTrainFest
      @TechTrainFest  3 года назад +2

      Можем посоветовать посмотреть наш митап с Евгением Борисовым - Spring-построитель ruclips.net/video/rd6wxPzXQvo/видео.html

  • @asgzxbaasg9766
    @asgzxbaasg9766 15 дней назад

    Первое доходчивое объяснение зачем разработчику писать тесты. Защитить свой код любой ценой...

  • @zuzu-wz9be
    @zuzu-wz9be Год назад

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

  • @lisafox9026
    @lisafox9026 2 года назад +1

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

    • @Qnoize
      @Qnoize 2 года назад +2

      это не поможет, помнится как-то был 8 часов доклад с ним)

  • @WebSterXGM
    @WebSterXGM 4 года назад +1

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

    • @donquih0te396
      @donquih0te396 4 года назад

      Там, где switсh заменил на компоненты

    • @WebSterXGM
      @WebSterXGM 4 года назад

      @@donquih0te396 разобрался, спасибо!

  • @infosmartsound
    @infosmartsound Месяц назад

    Тред, синглтон

  • @edwin-jq4dp
    @edwin-jq4dp 4 года назад

    16:30 my timestamp

  • @alex-petrov
    @alex-petrov 3 года назад +3

    Почему собака лэйзи, а не штрудель лэйзи?

  • @galinashapoval2695
    @galinashapoval2695 2 года назад +1

    У нас досих пор как в первой истории местами

  • @romanihnatov5629
    @romanihnatov5629 3 года назад

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

    • @funbiscuit
      @funbiscuit 2 года назад +1

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

    • @romanihnatov5629
      @romanihnatov5629 2 года назад

      @@funbiscuit спасибо за ответ!

  • @ventilyator
    @ventilyator 4 года назад

    я не понимаю как в гите при мердже могут улетать отдельные строчки (ну, если их никто не правил, конечн)

  • @nikibut3073
    @nikibut3073 2 года назад

    Сингалтон антипатерн потому что приводит к ожирению!

  • @reliniideadea
    @reliniideadea 3 года назад +1

    Подскажите, как писать тесты для микросервисов?

    • @vyacheslavs5642
      @vyacheslavs5642 7 месяцев назад

      посмотрите про testcontainers

  • @Vladimir-vd2im
    @Vladimir-vd2im Год назад

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

  • @asgzxbaasg9766
    @asgzxbaasg9766 14 дней назад

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

  • @user-ke1ix8ob9b
    @user-ke1ix8ob9b 8 месяцев назад

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

  • @tatyanayurchenko6840
    @tatyanayurchenko6840 Год назад +2

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

  • @DimaTiunov
    @DimaTiunov 3 месяца назад

    23:22 ах сука, наобарот сделал((

  • @AlexJPep
    @AlexJPep 3 года назад

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

  • @olegpicik363
    @olegpicik363 3 месяца назад

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

  • @kolob204
    @kolob204 2 года назад

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

    • @at0m616
      @at0m616 2 года назад +1

      Конечно ирония. И ты не все ошибки там нашел)

  • @falken5869
    @falken5869 3 года назад

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

  • @ipasenko
    @ipasenko 2 года назад +1

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

  • @baschlykoff
    @baschlykoff 2 года назад

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

  • @vpurazov
    @vpurazov 2 года назад

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

    • @kotojava
      @kotojava 23 дня назад

      человек в израиле живет постоянно

  • @WERT2025
    @WERT2025 2 года назад

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

  • @user-yl7jt7bw6o
    @user-yl7jt7bw6o 4 года назад

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

    • @user-zl5fj4vl1t
      @user-zl5fj4vl1t 4 года назад

      Аргументируйте.

    • @user-yl7jt7bw6o
      @user-yl7jt7bw6o 4 года назад

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

    • @serjpavlenko
      @serjpavlenko 4 года назад +29

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

    • @user-zl5fj4vl1t
      @user-zl5fj4vl1t 3 года назад

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