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

  Рет қаралды 128,726

TechTrain

TechTrain

4 жыл бұрын

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

Пікірлер: 96
@pavelbodrov5002
@pavelbodrov5002 4 жыл бұрын
Доклады Евгения можно смотреть бесконечно! Все по делу, легко, доходчиво и с юмором. Спасибо за труд!
@xxx---xxx---xxx
@xxx---xxx---xxx 8 ай бұрын
"Я звоню этому человеку, а он сейчас рожает 😳" Евгений Борисов потрясающий человек! Спасибо ему!
@strash1692
@strash1692 2 жыл бұрын
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 жыл бұрын
Я человек простой - вижу доклад Е. Борисова, ставлю лайк.
@Denis-Orlov
@Denis-Orlov 4 жыл бұрын
Женя Борисов you are the best! дайте уже ему столько времени сколько сам захочет! :)
@eugenetrifonov5101
@eugenetrifonov5101 4 жыл бұрын
В новом митапе «Spring-построитель» примено это и произошло)
@finalename7464
@finalename7464 4 жыл бұрын
@@eugenetrifonov5101 Там тоже не хватило.
@user-zw4yv4um2l
@user-zw4yv4um2l Жыл бұрын
Смотрел как крутой фильм! вот это уровень! мужик ты красавчик!
@fur_mur
@fur_mur 6 ай бұрын
Смотреть доклад и приятно и полезно, спасибо)) Поддержу, что можно было бы и дольше ❤
@Devivl
@Devivl 4 ай бұрын
Евгений, огромная благодарность! Очень информативно и с юмором. У нас преподаватель по матанализу похожим образом преподавал. Тоже очень нравилось слушать его лекции. Не скучно, информативно, с живыми примерами.
@epic3386
@epic3386 3 жыл бұрын
Просто огонь 🔥 спасибо за доклад Евгению, спасибо автору за видео 👍
@konstantinchvilyov9602
@konstantinchvilyov9602 4 жыл бұрын
Очень грамотно, информативно и просто. Спасибо!
@serge7069
@serge7069 3 күн бұрын
Реально крутое объяснение темы
@antonvarganov1312
@antonvarganov1312 4 жыл бұрын
Спасибо, узнал новое для себя!
@sergeykovalev7276
@sergeykovalev7276 Жыл бұрын
Шикарно! Спасибо огромное!
@delalen8012
@delalen8012 4 жыл бұрын
Круто! Спасибо за видос :)
@MrStim
@MrStim 3 жыл бұрын
Превосходный доклад.
@user-vm1hi7bo5s
@user-vm1hi7bo5s 10 ай бұрын
Отношения к разработке на Java у меня никакого нет, но, тем не менее, доклад посмотрел с интересом. Теперь буду знать про сингальтоны и виски)
@arthureirich7591
@arthureirich7591 2 жыл бұрын
Отдельное спасибо за рефакторинг switch в коллекцию. Порой в спринге и вправду творится магия:)
@viacheslav90
@viacheslav90 3 жыл бұрын
Круто, я хоть и php разработчик, но для себя подчеркнул много нового.
@VasillaRobocraft
@VasillaRobocraft 2 ай бұрын
отличный доклад, как и всегда)
@HowItWorks
@HowItWorks 3 жыл бұрын
44:19 Мне стало грустно после этой фразы "-Это последнее, что я вам покажу".
@user-gl7gg8gz2g
@user-gl7gg8gz2g 4 жыл бұрын
Просто топ)
@-is.perfect-
@-is.perfect- 4 жыл бұрын
Охрененно
@romantsyupryk3009
@romantsyupryk3009 4 жыл бұрын
Thanks so much for this tutorial.
@user-vm7re9bu9r
@user-vm7re9bu9r 2 жыл бұрын
паттерн избавления от swith вообще топчик!!!
@marinakaryukova6231
@marinakaryukova6231 6 ай бұрын
The best!
@alexmur07
@alexmur07 3 жыл бұрын
спасибо
@akimovpavel3084
@akimovpavel3084 3 жыл бұрын
Я долго думал, кого же Евгений Борисов напоминает мне по манере речи. Вспомнил! Александра Якушева из команды КВН сборная Курска)) А так, Борисов очень крутой чувак!!!
@lisafox9026
@lisafox9026 2 жыл бұрын
Голос вообще не похож манера нееее
@vlera4198
@vlera4198 Жыл бұрын
А ещё говорящая голова вкс на него похож)))
@savar33
@savar33 3 жыл бұрын
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 спасибо. Доклады Жени - топ
@user-uh8nb2vj4f
@user-uh8nb2vj4f 4 жыл бұрын
Я не понял про Singleton, а именно причина, почему нужно делать volatile. Насколько я знаю, для synchronized работает happens before, поэтому singleton == null будет работать с заново загруженной переменной из heap. А проблема как раз в том (именно, почему нужно volitile добавить), что в строке singleton = new Singleton() может раньше вернуться ссылка на объект, в котором могут быть поля, которые не final, и они могут быть еще не проинициализированы.
@vlad-pizza-2013
@vlad-pizza-2013 4 жыл бұрын
Была бага до версии java 1.5 и при определённой фазе луны оно не правильно работало. Сейчас JMM пофиксили и все работает.
@arthura.kupriyanov4667
@arthura.kupriyanov4667 4 жыл бұрын
Да, я с вами согласен. Проблема на самом деле в том, что может вернуться объект, у которого еще не вызван конструктор. Это проблема reordering в самом компиляторе при исполнении в мультипроцессорных машинах. Следовательно, поля могут иметь дефолтные значения, а не которые присвоены конструктором. По крайней мере, так писали в The "Double-Checked Locking is Broken" Declaration
@bananasba
@bananasba 4 жыл бұрын
Это проблема безопасной публикации, к сожалению подготовился он плохо и суть передана не полно. Крайне неудачный пример от биг дата инженер.
@sergeistarodubov2534
@sergeistarodubov2534 3 жыл бұрын
в джаве же 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 жыл бұрын
String pool с седьмой джавы хранится в хипе
@sergeistarodubov2534
@sergeistarodubov2534 3 жыл бұрын
@@ormoroe так никто физически память не делит, не только GC. Все ее просто помечают)
@konstantinchvilyov9602
@konstantinchvilyov9602 4 жыл бұрын
Ещё раз огромное спасибо! А где-то есть продолжение или более подробный рассказ конца этого доклада?
@TechTrainFest
@TechTrainFest 4 жыл бұрын
Возможно, вам покажется интересным наш митап с участием Евгения :) kzfaq.info/get/bejne/qMpmqtuB3761pqM.html
@konstantinchvilyov9602
@konstantinchvilyov9602 4 жыл бұрын
@@TechTrainFest Таки да! Уже смотрю :)
@konstantinchvilyov9602
@konstantinchvilyov9602 4 жыл бұрын
@@TechTrainFest А почему митап ? Для загадочности? :)
@xandrviking1113
@xandrviking1113 11 ай бұрын
Видос просто огонь. Большое спасибо , Женя !
@Software.Engineering.in.Action
@Software.Engineering.in.Action Жыл бұрын
11:40 TDD for me is a Type Driven Development :)
@kabkasik
@kabkasik 3 жыл бұрын
Елис)))
@Tronal
@Tronal 2 жыл бұрын
Последний пример с registerMySelf не будет работать, если например у этого бина будет скоуп на уровне запроса (или прототипа) с proxy mode = target classs. тогда спринг не начнет создавать бин пока кто-то не обратится к прокси этого бина.
@vlera4198
@vlera4198 5 ай бұрын
42:00 я слышал про другой случай - был утилитный класс в котором было куча утилитных методов. и в конце концов уперлись в ограничение джавы на размер класса (оказывается есть такое)). и тимлид выдал гениальное решение- класс тупо поделили пополам на 2 утилитных класса.
@lisafox9026
@lisafox9026 2 жыл бұрын
Евгению можно давать время сколько ему нужно!!!! Что бы он все дописывал
@Qnoize
@Qnoize 2 жыл бұрын
это не поможет, помнится как-то был 8 часов доклад с ним)
@dmitriypronichev7048
@dmitriypronichev7048 4 жыл бұрын
спасибо, очень интересно. а продолжение будет?
@TechTrainFest
@TechTrainFest 4 жыл бұрын
Можем посоветовать посмотреть наш митап с Евгением Борисовым - Spring-построитель kzfaq.info/get/bejne/qMpmqtuB3761pqM.html
@asgzxbaasg9766
@asgzxbaasg9766 Ай бұрын
Первое доходчивое объяснение зачем разработчику писать тесты. Защитить свой код любой ценой...
@obusis
@obusis 6 ай бұрын
Классика 😏
@edwin-jq4dp
@edwin-jq4dp 4 жыл бұрын
16:30 my timestamp
@zuzu-wz9be
@zuzu-wz9be 2 жыл бұрын
На 56 минуте нельзя будет так сделать после 6 версии спринга, поскольку уберут возможность кидать @autowired на методы. Выпиливают setter injection (но это не точно)
@user-ro1lq7ve2g
@user-ro1lq7ve2g 3 жыл бұрын
Скажите это точно не Александр Якушев из Примы?
@galinashapoval2695
@galinashapoval2695 2 жыл бұрын
У нас досих пор как в первой истории местами
@alexmur07
@alexmur07 3 жыл бұрын
и как этот шаблон проектирования называется ?) в конечном то итоге?))
@jonua
@jonua 3 жыл бұрын
Я правильно понял, что паттерн registry ломает принцип single responsibility?
@leko6766
@leko6766 6 күн бұрын
Проблема с изменением НДС стала релевантна спустя 4 года)))
@romanihnatov5629
@romanihnatov5629 3 жыл бұрын
Спасибо за доклад, не совсем понимаю как отработал registerMySelf если его не вызывали, как жто хэндлиться, в какой момент он будет вызвал и отработан, у всех классов реализаций одновременно, вот эти вопросы интересуют, возможно статейку, пока нахожу только как обычная setter injection, но эти методы явно вызывают, вот это смутило
@funbiscuit
@funbiscuit 3 жыл бұрын
Этот метод будет вызываться спрингом, когда тот будет создавать бин, который реализует данный интерфейс. После создания бина (еще до вызова post construct) спринг пройдется по всем методам, которые помечены autowired и вызовет их, передав в них нужные параметры. Именно так работает обычный setter injection, просто здесь сам сеттер вынесли в дефолтный метод интерфейса. Ну и логика не сеттера, но спрингу то без разницы, он просто его вызывает. До какой то версии спринга autowired над дефолтным методом не работал, насколько я помню. Вроде бы в спринг паззлерах Евгений про это рассказывал (где-то точно рассказывал).
@romanihnatov5629
@romanihnatov5629 3 жыл бұрын
@@funbiscuit спасибо за ответ!
@WebSterXGM
@WebSterXGM 4 жыл бұрын
А где strategy и command? На слайдах это было упомянуто и в описании видео есть, но по ходу выступления так и не было упомянуто...
@donquih0te396
@donquih0te396 4 жыл бұрын
Там, где switсh заменил на компоненты
@WebSterXGM
@WebSterXGM 4 жыл бұрын
@@donquih0te396 разобрался, спасибо!
@infosmartsound
@infosmartsound 2 ай бұрын
Тред, синглтон
@alex-petrov
@alex-petrov 3 жыл бұрын
Почему собака лэйзи, а не штрудель лэйзи?
@nikibut3073
@nikibut3073 2 жыл бұрын
Сингалтон антипатерн потому что приводит к ожирению!
@ventilyator
@ventilyator 4 жыл бұрын
я не понимаю как в гите при мердже могут улетать отдельные строчки (ну, если их никто не правил, конечн)
@tatyanayurchenko6840
@tatyanayurchenko6840 Жыл бұрын
49:22 логичнее было бы называть классы переставив слова: MailGeneratorHappyBirthday. Тогда мы сразу в панели project слева видели бы все классы данной группы в алфавитном порядке
@user-ke1ix8ob9b
@user-ke1ix8ob9b 9 ай бұрын
Про юнит-тесты не согласен. Основные проблемы лежат именно в интеграции между модулями. Если будут только юнит-тесты, то интеграция остается не протестирована. А если делать нормальные интеграционные тесты + юнит, то в случае проблем упадут и те и те, и человеки также испугаются. Выходит что у юнитов нет смысла. И эта проблема "всё упало и страшно" это надумано. Начинаешь разбираться и сразу понятно откуда проблема
@asgzxbaasg9766
@asgzxbaasg9766 Ай бұрын
А вот очень полезный паттерн стратегия который можно реализовать так, а вот еще более полезная реализация стратегии без необходимости передавать состояние объекта, но показывать я это конечно не буду...
@Vladimir-vd2im
@Vladimir-vd2im 2 жыл бұрын
Великолепный спикер! Но успокойте меня кто-нибудь. Скажите, пожалуйста, что не один я такой тупой, что почти ничего не понял 😂
@reliniideadea
@reliniideadea 3 жыл бұрын
Подскажите, как писать тесты для микросервисов?
@vyacheslavs5642
@vyacheslavs5642 8 ай бұрын
посмотрите про testcontainers
@AlexJPep
@AlexJPep 3 жыл бұрын
default в интерфейсах создалидля обратной совместимости, а не чтобы использовать как "патерн". Так что последний вариант это больше "плохой пример" чем рекомендация ;)
@olegpicik363
@olegpicik363 5 ай бұрын
мок на английском - ржать над кем-то))) Чтобы точно ни у кого вопросов не возникло!))
@DimaTiunov
@DimaTiunov 5 ай бұрын
23:22 ах сука, наобарот сделал((
@kolob204
@kolob204 2 жыл бұрын
11:28 "Профессионалы не ошибаються" - пишется без мягкого знака 😁😁😁 (возможно в этом и была ирония, но не мог пройти мимо этого в любом случае) Спасибо за видео ))
@at0m616
@at0m616 2 жыл бұрын
Конечно ирония. И ты не все ошибки там нашел)
@falken5869
@falken5869 3 жыл бұрын
Некорректное объяснение причины появления volatile keyword в double-check singleton pattern.
@ipasenko
@ipasenko 2 жыл бұрын
Блин. Ну как бы всё круто, но за такие лайфхаки тебя будут проклинать будущие поколения твоих коллег. Круто когда ты умеешь писать всои бинпостпроцессоры и аннотации. Но это должно быть очевидным для применения.
@baschlykoff
@baschlykoff 2 жыл бұрын
Не нужно экспертам в software development выступать с мыслями про эпидемиологии, даже вскользь не нужно, это важно. Евгений лидер мнений и кумир молодежи. Неосторожные высказывания про заговоры и проделки мирового масонского правительства могут стоить жизни кому-то из тех, кто поверит в этот псевдонаучный бред. Слушайте Женю про спрингбут, не слушайте Женю про коронавирус.
@vpurazov
@vpurazov 2 жыл бұрын
Ну можно было перед выступлением слайды на орфографические ошибки проверить, что за....
@kotojava
@kotojava Ай бұрын
человек в израиле живет постоянно
@WERT2025
@WERT2025 2 жыл бұрын
Много воды, мало конкретики. Всего два простых паттерна за час? В конце вообще жуть какая-то с авторегистрацией, не делайте так.
@user-yl7jt7bw6o
@user-yl7jt7bw6o 4 жыл бұрын
"надеюсь мои дети тоже будут программистами, других профессий не будет, все будт делать компьютеры" - ясно. Спасибо, что сразу показал свой уровень, сэкономил мне время.
@user-zl5fj4vl1t
@user-zl5fj4vl1t 4 жыл бұрын
Аргументируйте.
@user-yl7jt7bw6o
@user-yl7jt7bw6o 4 жыл бұрын
@@user-zl5fj4vl1t Слишком узкий взгляд, экстраполяция для сложных систем не годный метод. Вот совсем недавно некоторые деятели в одной "энергетической сверхдержаве" тоже предрекали, что цена на углеводороды будет только расти, а при цене нефти ниже 80 мировая экономика рухнет)
@serjpavlenko
@serjpavlenko 4 жыл бұрын
@@user-yl7jt7bw6o Это была ирония. Спасибо, что сразу показали уровень своего чувства юмора, скепсиса головного мозга, а также самооценки (судя по никнейму).
@user-zl5fj4vl1t
@user-zl5fj4vl1t 3 жыл бұрын
@@serjpavlenko это может быть реальные фамилия и имя, а еще может быть разное ударение -> Изольда вАгина
Евгений Борисов - Spring-построитель
2:24:30
JPoint, Joker и JUG ru
Рет қаралды 173 М.
Техническое интервью с Евгением Борисовым
1:33:04
Haha😂 Power💪 #trending #funny #viral #shorts
00:18
Reaction Station TV
Рет қаралды 16 МЛН
Looks realistic #tiktok
00:22
Анастасия Тарасова
Рет қаралды 7 МЛН
Must-have gadget for every toilet! 🤩 #gadget
00:27
GiGaZoom
Рет қаралды 12 МЛН
KINDNESS ALWAYS COME BACK
00:59
dednahype
Рет қаралды 60 МЛН
Библиотека Unsafe в Golang
27:24
Нина Пакшина
Рет қаралды 145
Евгений Борисов - Spring Data? Да, та!
50:04
JPoint, Joker и JUG ru
Рет қаралды 103 М.
Factory Method Pattern - Design Patterns (ep 4)
27:21
Christopher Okhravi
Рет қаралды 537 М.
Spring Cloud goes Cloud
2:10:21
Aleksandr Barmin
Рет қаралды 32 М.
Haha😂 Power💪 #trending #funny #viral #shorts
00:18
Reaction Station TV
Рет қаралды 16 МЛН