Евгений Борисов - Spring Patterns для взрослых
Ближайшая конференция - Joker 2024, 9 октября (Online), 15-16 октября, Санкт-Петербург
- -
Сколько дизайн-паттернов вы знаете? 24? 36? 100? А сколько из них вы применяете в реальной жизни? 3? 5? 10?
В этом докладе Евгений покажет, как при помощи Spring можно легко и просто реализовывать наиболее популярные паттерны, с которыми мы сталкиваемся в повседневной жизни. Chain of responsibility, strategy, command, lazy initialization, scala traits, AOP, proxy, decorator, и прочие паттерны и концепции, внедренные при помощи Spring, сделают ваш код мягким и шелковистым. А перхоть вашего boilerplate в виде switch-ей, статических методов, наследования, и прочей устаревшей шелухи, посыпется с вашего проекта под радостные крики сонара. Код станет более читабельным, гибким и поддерживаемым. Такой код проще обкладывать тестами и, наконец, это просто красиво.
В этом докладе мы не будем ковырять внутренности Spring или пытаться его кастомизировать. Мы даже не напишем ни одного beanpost-процессора или стартера (разве что кастомный classloader). Только практические задачи и самый обычный, простой, добрый, пятый Spring.
Кажеться этот человек (Евгений Борисов) научил весь СНГ понимать спринг, сейчас эти вещи, что он говорит нужно само собой знать, а раньше наверно только крутые дядьки это знали и учили молодых где то, памятник при жизни ему , спасибо за ваши труды, буду рад смотреть новые конференции и всем рассказывать какой крутой мужик, этот Борисов Евгений
00:09:34 Singletons 00:10:25 Singletons Концепция и Паттерн 00:34:55 Тесты - Как поднять контекст только часть контекста - @ComponentScan(lazyInit = true) 00:46:05 Преимущество field injection над constructor через @Autowired 01:00:30 Open Closed principle broken 01:25:13 GenericBeanDefinition 01:37:18 Strategy and Command 02:00:08 Реализация механизма добавления новых бинов в контекст без перезапуска приложения 02:26:11 AOP 02:30:00 Динамическая реализация pointcut 02:39:44 Patterns which are easy with Spring
Вижу Евгения - ставлю лайк
вижу лайк для Евгения - ставлю лайк )
@@necromancer151 вижу лайк лайка для Евгения - ставлю лайк)
Пишите тогда сервис, который будет собирать деревом все комментарии где используется слово лайк, и курсивно его обрабатывать... ну вы поняли)))
Вижу лайк ради лайка - ставлю дизлайк.
Обычно слушаю доклады на скорости 1.25, но Евгения приходится ставить на 0.75 :))
слушаю на 1.75 и норм
Смотрю на х3, как и все другие видосы, нормально
Икона, чем больше работаю, тем больше понимаю из конференций Борисова. ❤
Уже дошло до того, что на интервью в ответ на вопрос говоришь про бинпостпроцессор и Борисова - и интервьювер доволен
И что? Неадекватный интервьюер значит. Не Евгений же в этом виноват.
Божественно, особенно вторая часть доклада. Огромное спасибо организаторам
Спасибо, Евгений, как всегда интересно.
Сижу работаю из дома, фоном переслушиваю лекции Евгения. И тут на 51:00 такая прям совсем домашняя атмосфера :) Улыбнуло.
Черт, когда Борисову будут давать достаточно времени и не гнать уже! Человек творит! Это то же самое что вырезать из Властелина колец почти час времени, для чего, хер знает, люди пришли насладиться фильмом, а не на работу, что бы уйти побыстрее)
Доклад - пушка/бобма!💣 Спасибо большое, Евгений & Co🤝
Как всегда круто. Спасибо Евгений за доклад
Как всегда прекрасная дотошность 🙏🏻🎉
смотрится на одном дыхании, Женя заряжает своей энергией. класс!!!
Отличный доклад, спасибо!
Спасибо огромное! Очень круто!
Женя как всегда крут ) Спасибо!
Полностью посмотрел и законспектировал самые интересные места. Огромное спасибо! Однозначно лайк! :-)
Отвечая на вопрос в описании: все что есть в докладе применяю. Этот доклад возможно будет хорошим стартом для кого-то. Евгений как всегда на высоте.
Евгений и ребята , как всегда огромное спасибо за отличный доклад 😊🥳
Фонд золотых цитат: "Все что угодно может быть бесконечно" )))))) Евгений, каждый доклад очень интересно слушать, спасибо!
Евгений, спасибо ) очень интересно
Спасибо, jeka borisov!
Евгений, как всегда на высоте, спасибо. Вот бы конференцию провели, где он не был бы ограничен по времени.
Тогда это будет самая длинная конференция в мире в одно лицо - т.к. Евгений в предмете прекрасно разбирается, любит этим знанием делиться и очень при этом увлекается, то остановится конференция, скорее всего, только после того как он сознание от истощения потеряет... Ну или жена заругает ))))
6:57 - старт
9:36 старт
"Юль, батарея!" на 0:51:02
covid
Опа, супер - будет, что глянуть на выходных. Лайк сразу поставлю
отличная перезентация. почерпнул много интересного. Епаму привет! ) Жаль не на англ - поделился бы с коллегами
Евгений, с вашими скилами выступления, вам бы народ про DDD просвещать, то цены бы вам не было :-) Без сарказма, правда очень жду. Я как для себя открыл синюю книгу про DDD, так просто не могу понять почему люди до сих пор так мало знают про такие базовые, но очень важные идеи, которые попросту _всюду_ в микросервисах, о которых вы, кстати, упомянули в начале видео, но вскользь. А про синглтоны мы уже слышали от вас много раз, но все равно спасибо.
умник чтоли? сам бери и просвещай, я 100% уверен что ты по DDD и TDD не пишешь
DDD == domain driven? Тоже очень интересна эта тема
Обожаю Евгения, почти как бедкомедина
Ну всё - работа встала!!!
в примере с инжектом листа есть вопрос (но я не знаю, как его задать, ибо не попасть мне в телегу): а есть ли разница, будет ли каждый элемент листа прототайпом или синглтоном? ибо, так как мы ищем по имени бина, а бинов могло быть уже создано несколько на момент инжекта, не упадет ли это всё из-за "multiple bean error блаблабла"?
Начало с 6:55
Предлагаю называть концепцию "синглтон" "сингл инстансом", чтобы устранить путаницу. При этом синглтон это одна из имплементаций синг инстанса.
В конце 2022 с ностальгией вспоминаются ковидные проблемы 2020 года, какое было прекрасное время
наушники sony wh-1000xm3?
1:42:08 230 кейсов разбиваются на классы всего двумя тушками студентов-джунов и не за полгода, а за две ночи, потому что студенты обычно выбираются упоротые, которые ночь не спят и день не спят и не едят, а только кодят до полного выполнения задачи. Я помню, мне как-то выдавали задачи из техдолга в начале проекта, когда ещё работал джуном(правда тогда и понятия такого не было ещё, но суть та же) и там попадался switch внутри switch - это было весело разбивать и реально никто не сказал, что не надо упарываться, что народ работает неспеша, по 8-9 часов, что не нужно 2 дня без продыху кодить, но понял я это наверное лет через 5.
59:10 Я правильно понимаю, что тут ошибка? Когда spring выбирает beanName он пробегает по всем аннотациям бина и ищет там value, не только на аннотацию @Component смотрит
Евгений, у Вас со звуком проблема была из-за... Точнее проблема была не со звуком, а с производительностью, судя по количеству свёрнутый программ и тому, что при подключении зарядки проблема полностью исчезла. Если работаете под запись, лучше всегда ноут подключать к сети
Те синглтоны и свичи - это бэд патерн, а дефолты со спринг аннотациями в интерфейсах - это образец сингл респонсобилити и вообще правильного дизайна? ;) А вообще спасибо за контент, понравился доклад.
47:30 а что если объявить конструктор ломбока в спринге антипаттерном
воу воу, а мне как раз прошлый доклад по спринг паттернам оказался недостаточным)
Евгения после этого вебинара предадут анафеме ))))
3 часа на одном дыхании
16:07 о каком докладе идёт речь? Что за доклад о том, что "мы в спринге похоронены"?
40:46 вот может тогда не писать логику в сервисах, чтобы для её тестирования нужно было поднимать контекст? Плюс вопросец, а разве если у тебя будут разные конфигурации для тестов, то это будет плохо, потому что будут для тестов разные контексты подниматься. Вроде же контекст кешируется для тестов нет? А если это так и есть разные конфигурации контекстов, то это будет медленнее работать.
И всё таки, default в интерфейсе сделан для того чтобы поддерживать старый код, когда необходимо расширить интерфейсы (а в старом коде вы этого не сделаете). Другими словами, дефолтовые методы в интерфейсах, для того чтобы расширять интерфейсы библиотек безопастно с точки зрения поддержки ранее написаного кода на них (как это делает java для коллекций добавляя stream функционал). Тут же явно мы не пишем библиотеку, а пишем конечный продукт. Поэтому в данном случае лучше было сделать абстрактный класс для само регистрации, а не костылить default метод (который ещё и со спрингом в придачу!).
@InjectList({Баня.class, Водка.class, Гармонь.class, Лосоль.class})
super.Девки
@Lazy надо ставить над сервисом и над местом инъекции тогда будет работать
в 2:00:00 у нас есть перевод list to map бинов, все классно работает. А как это протестировать. К примеру у меня 20 таких бинов. И как сделать чтобы они появились в тесте. Обычно я делаю @Spy. Но я хочу протестировать что все эти бины окажутся в map. Для этого можно конечно их всех перечислить, но тест получится бесполезным. Сейчас я придумал через reflection в тесте найти всех предков. Есть ли лучше решение?
точно такая же проблема возникла, через @Import({ExportServiceLevelOne.class, ExportServiceLevelTwo.class, ExportServiceLevelThee.class}) решил сначала, потом сделал свой ImportBeanDefinitionRegistrar через него по типу интерфейса от которого наследованы классы в мапе регистрировал бины и оно работало. В ролике есть. Но! Мне под каждого теперь рестрары писать? Тем более что они только для тестов нужны.. Да и в @Configuration классе он глаза мозолит.... Переписал регистрар с дженериками, но как его подключить и передать тип класса.. в @Import не понятно...
мастхэвный доклад для тех, кто работает со спрингом уже скинул его всем своим друзьям-программистам
Тема "своя Spring Data" интересна! в стандартном спринге не поддерживаются графовые БД ...
Давно используем Spring Data Neo4j
Нападки Евгения на синглтон меня смутили. intellij idea которую Евгений демонстрировал, сплошняком построена на классических синглтонах. Это видно из документации о том как плагины писать к идее. И все же, почему kotlin генерирует из object прямой singleton "анти-паттерн" (так же как и скала) и никому дела нет до этого? На этот прямой вопрос создатели kotlin лишь говорили, что следовали по пятам scala, а scala в свою очередь лишь только хотела заменить static на что-то более объектно-ориентированное, согласно моей дырявой памяти и моему гуглению года полтора назад. Для меня этот вопрос все еще открытый. Если практично подходить к проблеме, для меня классический синглтон имеет лишь следующие проблемы: * неявная зависимость (когда у меня неявная зависимость это spring transactional management, то это прозрачно для меня и для моей бизнес логики, но когда неявная зависимость это синглтон, который представляет собой бизнес идею, то это уже тяжело для моего тупого мозга, в особенности если это два-три-четыре жирных таких синглтона) * один класс на весь jvm (но ведь я хочу много инстансов в моих тестах, чтобы каждый тест был изолированным)
Интересная идея с lazy component scan, при случае попробую для тестов (я как раз из тех, кто пишет конфигурацию и помечает мок бин @Primary =)). По поводу Знахарей и Лечения, тут очень похоже, что вы решаете задачи бизнес логики средствами фреймворка - когда Знахарь выбирает, какие виды лечений он применяет, то делать это спрингом - а тем более таким нестандартным способом - это немного не комильфо, на мой взгляд. Кстати, а в чем была бы проблема для знахаря просто сделать inject через конструктор и по списку с Лечениями сделать .filter { it::class in setOf(Баня::class, ...) } ?
идея конечно интересная, но не работает к сожалению
1:47:09 - Что обычно делает дефолтный целитель? - Он говорит UnsupportedOperationException.
1:03:40 А почему нельзя было сделать пустой интерфейс и наследоваться им от Лечения назвав Алкоголь и не указать его в List?
Как на всё это написать тесты?
да пздц)))
Хорошо но мало (
37:35 Подтверждаю, все так и происходит.
последняя секунда: Раунд!
Please explain in English video
Женя крут🔥👍💪
хм вот lazy в тестах это то что я искал , у самого в проде для каждого теста есть свой конфиг и при добавлении новых бинов все конфиги падают и хоть убей в оф доках я не нашел как с этим люди борятся
lazy это какая то дичь, мало того что не работает, так еще нужно понять, какие бины реально нужны, если тестируется сервис с кучей инжектов - это просто нереально использовать.. гораздо проще заварить нужные сервисы и потом мокнуть те , которые попросит тест
А есть ли Spring Patterns для детей?
мой коммент со ссылкой на гитхаб попал в спам фильтр похоже(( админы канала, можете там перепрочитать и без ссылки вставить вопрос, а то я заново это всё не опишу, ну никак!
Ленивое сканирование в продакшене может помочь, если из-за проблем в инфраструктуре какой-то бин не сможет инициализироваться.
не поможет
Евгений, на 26:33 опечатка на слайде "speacial"
А почему спринг постоянно выдает предупреждение на @Autowired? Всегда пишет, ну, дружок, ты давай-ка лучше через конструктор это сделай.
Потому что через конструктор бест практис
@@user-if3qj9wm5j очень спорный бест практис. Не вижу существенных плюсов, кроме fail fast, да и не такая частая проблема - отсутствие нужного бина
Эх) сколько живу работаю все эти паттерны все больше превращаются в антипаттерны)
top
00:59:24 - нашествие НЛО в вебку Кирилла
В сотый раз про синглетон , зачем , можно же про что-то более актуальное поговорить в 2020.
Может потому что бесплатно?) Все более актуальное - платно)
Для меня Женбка - оргазм с первого раза)
В магазах вдруг пропал Синглтон и я понимаю кто виноват), скрытая реклама?
Интересный акцент у Борисова. Удивляет что он вместо приложения говорит - аппликация. Тут у меня, большого любителя искусств начинается kernel panic головного мозга :)
Это Израильский акцент :) на иврите не говорят "приложение", говорят "апликация" :)
59:20
Думаю: Надо же у Евгения речь обычная стала. А оказывается стояла скорость 0.75.
иногда @Lazy(false) тоже турба
34:37
47:21 еще при field injection используется reflection, что не очень хорошо
теперь я тоже буду говорить синглЬтон )
"сингАЛЬтон"
@@stanislavkuzmin2611 спасибо. точно!
Тодд Говард и Кирилл Толкачев это один человек?
Здравствуйте. Лекция очень полезная. Хотите ли немного критики от пенсионера, который в JAVA с 95 года? Когда она еще была только в Нетскэйепе? Складывается впечатление, что spring настолько крут, что тривиальные паттерны с ним невозможно реализовать без плясок с бубном, описанным в этой лекции. Безусловно это не так. И без спринга эти паттерны реализовывали. И как спринг смог этому помешать? Другой вопрос насколько помогает ? Просто автор почему то выбрал самый низкоуровневый способ реализации паттернов. Для того чтобы понять как работает спринг? Ок! Но ведь не только классы должны отвечать Single Responsibility Principal. В итоге из за деревьев леса плохо видно. И такой еще вопрос. Зачем похоронили XML context? Ведь все, что автор здесь рассказывал, на XML сделать можно "левой ногой". List. Map. Для удобства программистов? С каких пор удобство программистов, стало мерилом качества продукта, вместо удобства пользователей?Я не думаю, что для пользователей (поддержка, администраторы и т.п.) конфигурация на JAVA удобней конфигурации XML. Не говоря уже об конфигурации распыленной в виде аннотаций по куче java файлов. Ok, если вы делаете конфигурацию на JAVA, она должна быть управляемой другой конфигурацией в каком то формате в удобной для пользователе виде. Вы уверены, что программисты это делают?
Увидев Кирилла, испугался, что опять будет парное выступление, к счастью, этого не произошло. Никого не хочу обидеть, но у Евгения лучше получается выступать соло.
Patient это что?
01:00:30
@Bean public CustomPointcut() { return new CustomPointcut(); } // Same applies to Exception.... @Bean public DefaultPointcutAdvisor defaultPointcutAdvisor(final CustomPointcut customPointcut, final ExceptionHandlerAspect exceptionHandlerAspect ) { return new Default...(customPointcut, exceptionHandlerAspect ); } In this case, you do not call initialization methods, but instead use already created beans.
When you call configuration methods, you also get beans. Because configuration is wrapped with proxy (cglib proxy) and any call to method marked as @Bean returns bean instead.
хмм а материальчик то бу....
InhectList не нарушает разве OCP?
2020 год, а звук нормально записать не можем
Паттерны, принципы.....но по факту spring driven development никак не связанный с паттернами и принципами. Да стратегии, команды, но и те реализованые не по принципам SOLID. Я бы назвал доклад - как можно сделать кучу всего используя рефлексию и спринг. Подробный разбор в комментарии глупо писать, но я бы поспорил с 80% сказаного P.S Мне нравятся доклады Борисова, я люблю спринг, но конкретный доклад, на мой субьективный взгляд худший из его докладов. Автор начинает видить везде гвозди, имея спринг молоток.
Lajk!
@Repository надо если модульный проект, и слой репозиториев лежит в отдельном модуле Возможно я что то не так делал, но без @Repository интерфейсы CrudRepository не работали. Поправьте если не прав
Е.Борисов, xml умер 🤣 ну, ну
Всё здорово, но почему столько грамматических ошибок и опечаток в слайдах?
Потому что делал как студент, в ночь перед экзаменом.
Не забывайте про TypeCheck в field.set, так как туда можно засетить будет список с разными объектами и потом словить ClassCastException.
Мда, сингл респонсибилити, а потом вдруг лукап по имени филда...
Женя, че похудел так? Корона и коронтин??
чёж тормозит чёж тормозит - оказалось зарядка не включена. Вроде большой уже, а не знает что ноутбуки медленней работают без питания
Разбейте по блокам на ютубе. Пожалуйста.