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