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

Поделиться
HTML-код
  • Опубликовано: 3 фев 2025

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

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

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

  • @strash1692
    @strash1692 3 года назад +76

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

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

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

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

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

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

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

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

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

  • @fur_mur
    @fur_mur Год назад +4

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

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

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

  • @maraeluf-brown9296
    @maraeluf-brown9296 3 месяца назад +2

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

  • @ГосподинН-э7ф
    @ГосподинН-э7ф Год назад +4

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

  • @epic3386
    @epic3386 4 года назад +13

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

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

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

  • @ЯСуперСтар
    @ЯСуперСтар Год назад +2

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

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

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

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

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

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

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

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

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

  • @VasillaRobocraft
    @VasillaRobocraft 9 месяцев назад

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

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

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

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

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

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

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

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

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

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

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

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

    Реально крутое объяснение темы

  • @ДимаГоликов-с6ш
    @ДимаГоликов-с6ш 3 года назад +1

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

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

    The best!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @ВладимирТарасов-ф2ы
    @ВладимирТарасов-ф2ы 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

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

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

    Thanks so much for this tutorial.

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

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

  • @ЕвгенийК-о8у
    @ЕвгенийК-о8у 3 года назад +3

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

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

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

  • @asgzxbaasg9766
    @asgzxbaasg9766 8 месяцев назад

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

  • @МихаилЕфремов-г5с
    @МихаилЕфремов-г5с 4 года назад +1

    Просто топ)

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

    Охрененно

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

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

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

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

  • @zuzu-wz9be
    @zuzu-wz9be 2 года назад

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

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

    спасибо

  • @ВладимирТарасов-ф2ы
    @ВладимирТарасов-ф2ы 5 месяцев назад

    Мне не очень понравилась авторегистрация в реестре, когда генератор сам себя регит. Получается, циклическая зависимость - реестр зависит от генераторов, а генератор от реестра

    • @ВладимирТарасов-ф2ы
      @ВладимирТарасов-ф2ы 5 месяцев назад

      Тут нужен третий объект - регистратор, который будет это делать. А то single of resp нарушается

  • @2Reishi
    @2Reishi Месяц назад

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

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

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

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

    Елис)))

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

    Классика 😏

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @ПавелШироких-с8ь

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    16:30 my timestamp

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

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

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

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

  • @asgzxbaasg9766
    @asgzxbaasg9766 8 месяцев назад

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

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

    Проблема с изменением НДС стала релевантна спустя 4 года)))

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

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

  • @infosmartsound
    @infosmartsound 10 месяцев назад

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

  • @Vladimir-vd2im
    @Vladimir-vd2im 2 года назад

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • @kotojava
      @kotojava 9 месяцев назад

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

  • @ИзольдаВ
    @ИзольдаВ 4 года назад

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

    • @FlawlessVictory-j8j
      @FlawlessVictory-j8j 4 года назад

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

    • @ИзольдаВ
      @ИзольдаВ 4 года назад

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

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

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

    • @FlawlessVictory-j8j
      @FlawlessVictory-j8j 4 года назад

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