Евгений Борисов - Spring Patterns
Вставка
- Опубліковано 17 лют 2020
- Сколько дизайн паттернов вы знаете? 24? 36? 100? А сколько из них вы применяете в реальной жизни? 3? 5? 10?
В этом докладе Евгений покажет, как при помощи спринга можно легко и просто реализовывать наиболее популярные паттерны, с которыми мы сталкиваемся в повседневной жизни. Chain of responsibility, strategy, command, lazy initialization, scala traits, AOP, proxy, decorator и прочие паттерны и концепции, внедренные при помощи спринга, сделают ваш код мягким и шелковистым. А перхоть вашего бойлерплэйта в виде switch-ей, статических методов, наследования, и прочей устаревшей шелухи, посыпется с вашего проекта под радостные крики сонара. Код станет более читабельным, гибким и поддерживаемым. Такой код проще обкладывать тестами и, наконец, это просто красиво.
В этом докладе мы не будем ковырять внутренности спринга или пытаться его кастомизировать. Мы даже не напишем ни одного бин пост процессора или стартера (разве что кастомный класслоадер). Только практические задачи и самый обычный, простой, добрый, пятый спринг.
Доклады Евгения можно смотреть бесконечно! Все по делу, легко, доходчиво и с юмором. Спасибо за труд!
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 - перечень аннотаций, которые будут работать в дефолтных методах интерфейсов
"Я звоню этому человеку, а он сейчас рожает 😳"
Евгений Борисов потрясающий человек! Спасибо ему!
Я человек простой - вижу доклад Е. Борисова, ставлю лайк.
Смотреть доклад и приятно и полезно, спасибо)) Поддержу, что можно было бы и дольше ❤
Женя Борисов you are the best!
дайте уже ему столько времени сколько сам захочет! :)
В новом митапе «Spring-построитель» примено это и произошло)
@@eugenetrifonov5101 Там тоже не хватило.
Смотрел как крутой фильм! вот это уровень! мужик ты красавчик!
Евгений, огромная благодарность! Очень информативно и с юмором. У нас преподаватель по матанализу похожим образом преподавал. Тоже очень нравилось слушать его лекции. Не скучно, информативно, с живыми примерами.
Круто! Спасибо за видос :)
Спасибо, узнал новое для себя!
Шикарно! Спасибо огромное!
Очень грамотно, информативно и просто. Спасибо!
Просто огонь 🔥 спасибо за доклад Евгению, спасибо автору за видео 👍
Реально крутое объяснение темы
Превосходный доклад.
Круто, я хоть и php разработчик, но для себя подчеркнул много нового.
Отдельное спасибо за рефакторинг switch в коллекцию. Порой в спринге и вправду творится магия:)
отличный доклад, как и всегда)
Отношения к разработке на Java у меня никакого нет, но, тем не менее, доклад посмотрел с интересом. Теперь буду знать про сингальтоны и виски)
Просто топ)
Охрененно
спасибо
паттерн избавления от swith вообще топчик!!!
Thanks so much for this tutorial.
44:19 Мне стало грустно после этой фразы "-Это последнее, что я вам покажу".
The best!
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)
@techtrain спасибо. Доклады Жени - топ
в джаве же 3 три вида памяти насколько я помню : stack, heap и metaSpace. В metaSpace хранятится string pool, параметры статических методов, информация о классах и т.п. Он пришел на замену как раз PermGen про которую говорил Женя
С восьмой до шести, уникальные для каждого потока: program counter, jvm stack, native method stack.
Общие: heap, method area(для метадаты), runtime constraut pool.
Permgen и metaspace это термины сборщика мусора, он не делит память, просто помечает области.
Это как я понял
String pool с седьмой джавы хранится в хипе
@@ormoroe так никто физически память не делит, не только GC. Все ее просто помечают)
Елис)))
Я не понял про Singleton, а именно причина, почему нужно делать volatile. Насколько я знаю, для synchronized работает happens before, поэтому singleton == null будет работать с заново загруженной переменной из heap. А проблема как раз в том (именно, почему нужно volitile добавить), что в строке singleton = new Singleton() может раньше вернуться ссылка на объект, в котором могут быть поля, которые не final, и они могут быть еще не проинициализированы.
Была бага до версии java 1.5 и при определённой фазе луны оно не правильно работало. Сейчас JMM пофиксили и все работает.
Да, я с вами согласен. Проблема на самом деле в том, что может вернуться объект, у которого еще не вызван конструктор. Это проблема reordering в самом компиляторе при исполнении в мультипроцессорных машинах. Следовательно, поля могут иметь дефолтные значения, а не которые присвоены конструктором. По крайней мере, так писали в The "Double-Checked Locking is Broken" Declaration
Это проблема безопасной публикации, к сожалению подготовился он плохо и суть передана не полно. Крайне неудачный пример от биг дата инженер.
11:40 TDD for me is a Type Driven Development :)
Видос просто огонь. Большое спасибо , Женя !
спасибо, очень интересно. а продолжение будет?
Можем посоветовать посмотреть наш митап с Евгением Борисовым - Spring-построитель ua-cam.com/video/rd6wxPzXQvo/v-deo.html
Я долго думал, кого же Евгений Борисов напоминает мне по манере речи. Вспомнил! Александра Якушева из команды КВН сборная Курска)) А так, Борисов очень крутой чувак!!!
Голос вообще не похож манера нееее
А ещё говорящая голова вкс на него похож)))
Классика 😏
Ещё раз огромное спасибо!
А где-то есть продолжение или более подробный рассказ конца этого доклада?
Возможно, вам покажется интересным наш митап с участием Евгения :)
ua-cam.com/video/rd6wxPzXQvo/v-deo.html
@@TechTrainFest Таки да! Уже смотрю :)
@@TechTrainFest А почему митап ? Для загадочности? :)
Последний пример с registerMySelf не будет работать, если например у этого бина будет скоуп на уровне запроса (или прототипа) с proxy mode = target classs. тогда спринг не начнет создавать бин пока кто-то не обратится к прокси этого бина.
Евгению можно давать время сколько ему нужно!!!! Что бы он все дописывал
это не поможет, помнится как-то был 8 часов доклад с ним)
16:30 my timestamp
Первое доходчивое объяснение зачем разработчику писать тесты. Защитить свой код любой ценой...
42:00 я слышал про другой случай - был утилитный класс в котором было куча утилитных методов. и в конце концов уперлись в ограничение джавы на размер класса (оказывается есть такое)). и тимлид выдал гениальное решение- класс тупо поделили пополам на 2 утилитных класса.
На 56 минуте нельзя будет так сделать после 6 версии спринга, поскольку уберут возможность кидать @autowired на методы. Выпиливают setter injection (но это не точно)
Скажите это точно не Александр Якушев из Примы?
У нас досих пор как в первой истории местами
Я правильно понял, что паттерн registry ломает принцип single responsibility?
и как этот шаблон проектирования называется ?) в конечном то итоге?))
Тред, синглтон
А где strategy и command? На слайдах это было упомянуто и в описании видео есть, но по ходу выступления так и не было упомянуто...
Там, где switсh заменил на компоненты
@@donquih0te396 разобрался, спасибо!
Проблема с изменением НДС стала релевантна спустя 4 года)))
Спасибо за доклад, не совсем понимаю как отработал registerMySelf если его не вызывали, как жто хэндлиться, в какой момент он будет вызвал и отработан, у всех классов реализаций одновременно, вот эти вопросы интересуют, возможно статейку, пока нахожу только как обычная setter injection, но эти методы явно вызывают, вот это смутило
Этот метод будет вызываться спрингом, когда тот будет создавать бин, который реализует данный интерфейс. После создания бина (еще до вызова post construct) спринг пройдется по всем методам, которые помечены autowired и вызовет их, передав в них нужные параметры. Именно так работает обычный setter injection, просто здесь сам сеттер вынесли в дефолтный метод интерфейса. Ну и логика не сеттера, но спрингу то без разницы, он просто его вызывает. До какой то версии спринга autowired над дефолтным методом не работал, насколько я помню. Вроде бы в спринг паззлерах Евгений про это рассказывал (где-то точно рассказывал).
@@funbiscuit спасибо за ответ!
Сингалтон антипатерн потому что приводит к ожирению!
Почему собака лэйзи, а не штрудель лэйзи?
я не понимаю как в гите при мердже могут улетать отдельные строчки (ну, если их никто не правил, конечн)
Великолепный спикер! Но успокойте меня кто-нибудь. Скажите, пожалуйста, что не один я такой тупой, что почти ничего не понял 😂
А вот очень полезный паттерн стратегия который можно реализовать так, а вот еще более полезная реализация стратегии без необходимости передавать состояние объекта, но показывать я это конечно не буду...
49:22 логичнее было бы называть классы переставив слова: MailGeneratorHappyBirthday. Тогда мы сразу в панели project слева видели бы все классы данной группы в алфавитном порядке
Про юнит-тесты не согласен. Основные проблемы лежат именно в интеграции между модулями. Если будут только юнит-тесты, то интеграция остается не протестирована. А если делать нормальные интеграционные тесты + юнит, то в случае проблем упадут и те и те, и человеки также испугаются. Выходит что у юнитов нет смысла.
И эта проблема "всё упало и страшно" это надумано. Начинаешь разбираться и сразу понятно откуда проблема
Подскажите, как писать тесты для микросервисов?
посмотрите про testcontainers
23:22 ах сука, наобарот сделал((
default в интерфейсах создалидля обратной совместимости, а не чтобы использовать как "патерн". Так что последний вариант это больше "плохой пример" чем рекомендация ;)
мок на английском - ржать над кем-то))) Чтобы точно ни у кого вопросов не возникло!))
11:28 "Профессионалы не ошибаються" - пишется без мягкого знака 😁😁😁 (возможно в этом и была ирония, но не мог пройти мимо этого в любом случае)
Спасибо за видео ))
Конечно ирония. И ты не все ошибки там нашел)
Некорректное объяснение причины появления volatile keyword в double-check singleton pattern.
Не нужно экспертам в software development выступать с мыслями про эпидемиологии, даже вскользь не нужно, это важно. Евгений лидер мнений и кумир молодежи. Неосторожные высказывания про заговоры и проделки мирового масонского правительства могут стоить жизни кому-то из тех, кто поверит в этот псевдонаучный бред. Слушайте Женю про спрингбут, не слушайте Женю про коронавирус.
Блин. Ну как бы всё круто, но за такие лайфхаки тебя будут проклинать будущие поколения твоих коллег. Круто когда ты умеешь писать всои бинпостпроцессоры и аннотации. Но это должно быть очевидным для применения.
Много воды, мало конкретики. Всего два простых паттерна за час?
В конце вообще жуть какая-то с авторегистрацией, не делайте так.
Ну можно было перед выступлением слайды на орфографические ошибки проверить, что за....
человек в израиле живет постоянно
"надеюсь мои дети тоже будут программистами, других профессий не будет, все будт делать компьютеры" - ясно. Спасибо, что сразу показал свой уровень, сэкономил мне время.
Аргументируйте.
@@user-zl5fj4vl1t Слишком узкий взгляд, экстраполяция для сложных систем не годный метод.
Вот совсем недавно некоторые деятели в одной "энергетической сверхдержаве" тоже предрекали, что цена на углеводороды будет только расти, а при цене нефти ниже 80 мировая экономика рухнет)
@@user-yl7jt7bw6o Это была ирония. Спасибо, что сразу показали уровень своего чувства юмора, скепсиса головного мозга, а также самооценки (судя по никнейму).
@@serjpavlenko это может быть реальные фамилия и имя, а еще может быть разное ударение -> Изольда вАгина