Евгений Борисов - Spring-потрошитель, часть 2
HTML-код
- Опубликовано: 2 июл 2014
- Ближайшая конференция - Joker 2024, 9 октября (Online), 15-16 октября, Санкт-Петербург
- -
. . . . Евгений Борисов - Spring-потрошитель, часть 2
Встреча JUG.ru
Санкт-Петербург, 26.06.2014
Казалось бы, зачем знать, как работают внутренности спринга для того, чтобы им пользоваться? Работает? Ну и ладно.
Но как всегда, для эффективной работы с фреймворком, неплохо бы понимать, что находится под капотом. Ведь только понимая его внутреннее устройство, вы сможете пользоваться Спрингом на полную мощность, адаптировать его под нужды вашего проекта, добиться максимальной производительности и решить любую проблему самостоятельно, не обращаясь в Spring-сервис-центр.
Итак, несколько вопросов про Spring, которые мы рассмотрим в рамках данного доклада (с примерами к каждому):
Насколько Spring влияет на производительность вашей программы?
Что входит в жизненный цикл спринга?
Как устроен ApplicationContext?
«Вот это на Spring сделать нельзя» - а может можно? - Наука
0:00 - BeanFactoryPostProcessor
2:58 - @DeprecatedClass через BeanFactoryPostProcessor
10:43 - способ через аннотации @Component
12:24 - ClassPathBeanDefifnitionScanner
13:08 - способ через Java Config
16:27 - метод @Bean это не метод Java, это определение бина, просто имеет формат метода Java
16:47 - ConfigurationClassPostProcessor - особый BeanFactoryPostProccesor (! не bpp, а именно bFpp !)
17:45 - Groovy Config
19:54 - Пишем свой контекст
23:36 - Пишем свой контекст: context.properies
24:53 - Пишем свой контекст: PropertyFileApplicationContext
30:00 - Обновление Prototype в Singleton
38:06 - Обновление Prototype в Singleton: Prototype - Prototype
40:58 - Обновление Prototype в Singleton: Решение 1 (не правильное, через инжект ApplicationContext)
42:50 - Обновление Prototype в Singleton: Решение 2 (решение 50/50, через proxyMode = ...TARGET_CLASS, т.к. другая крайность - при любом обращении к полю - новый бин)
43:50 - Обновление Prototype в Singleton: Решение 3 (через фабричный метод и абстрактный класс)
46:53 - Написание кастомного Scope
59:16 - Benchmarks
(Правильный бенчмарк - использовать сторонние инструменты, а не "изобретать велосипед", иначе ложный результат.)
1:04:27 - Benchmarks. Lookup бина. 1:05:06
1:05:13 - Benchmarks. Создание бина. 1:07:34 XML (700) < Annotation (2100) < Java Config (5100)
1:07:40 - Benchmarks. Инжекшн. 1:08:24 Annotation (150) < XML/Groovy (700 - 900) < Java Config (3000)
1:09:57 - Benchmarks. Создание объекта с прокси. 1:10:28 - (3,3) < DP (1800) < CGLib (4000)
1:10:48 - Benchmarks. Инвокация метода через прокси. 1:11:47 - (3,3) < CGLib/DP (10) < Spring Aspect (250)
Я только удивлён, у такого грамотного и бесценного материала всего 130к просмотров... В то же время у какого-нибудь мусора миллионы))) Автору огромное спасибо!
поэтому основная масса и живет по течению. и получает деньги чтобы не умереть . А это для Java разработчиков - это гордая профессия
@@airat2010 Java, это Java, на лучшем языке писать имеешь право
когда 10 минут видео пересматриваешь 10 раз)
Тёска, спасибо, ты лучший учитель по спрингу!
Жека, спасибо большое! Смотреть интересно и увлекательно. Дай Бог тебе здоровья)
На этом приложении понятно , что такое прототайп и что такое сингелтон 🙂 Зачет!
Чертовский интересно, полезно, грамотно, живо. Спасибо за труд!
Мой мозг от этой лекции: Я ЖИДКИЙ
Да! Я тоже сразу не понимаю, первую лекцию смотрел раза 3)
Спасибо за отличный доклад!
очень интересные примеры, которые наводят улыбку и поднимают настроение)
Спасибо большое эту потрясающую лекцию. Очень хотелось бы попасть на офлайн конференцию к Евгению!
Легенда
просто супер
кстати, Color можно было еще вот так определить
@Autowired
private javax.inject.Provider color;
и потом где нужно
color.get();
кому-нибудь удалось первый пример с заменой класса воспроизвести ? У Евгения на 9:30 возвращается нужный бин и вызывается метод, а у меня возвращется null
всю лекцию смотрел, не стоит ли у меня ускоренное воспроизведение видео, не стояло...
Это для меня очень важный фактор оценки, чаще всего приходится ставить скорость на 1.5, потому что спикеры мямлят. Тут не пригодилось, отличная подача
Legenda!
ссылка на гит есть?
Доклад вышел 26.06.2014, а 04.09.2014 вышел Spring 4.1 где появилась аннотация @Lookup, которая по сути делает то же самое что и Евгений на 43:56
43:00-44:00
Не понимаю, почему использование proxyMode = target class у бина Color приводит к тому что при получение ColorFrame его зависимость Color будет каждый раз разная
По логике ColorFrame должен иметь один и тотже цвет, только этот цвет по сути прокси через cglib
Отвечаю на свой коммент, дело в комбинации скопа прототайп и использовании прокси. При вызове любого метода прокси обьекта вначале изпользуя TargetSource получается объект что должен проксироватся. При чем для получения target обьекта используется beanFactory.getBean, что приводит к создании нового обекта, тк скоп бина в данном случае прототайп
@@mykytapiskarov7291 как ты узнал?)
Harv two погулял по соурс коду спринга
top
Этому человеку надо книги писать ) Есть что-то подобное почитать?
Приятная атмосфера в аудитории шутят, подсказывают, майки требуют
Как он все понимает, научите меня, буду весьма благодарен
Он разработчик со стажем больше 20 лет )
Прошло 9 лет. Про создание бинов через Groovy так и не слышал.
По факту:) Хз, мне сразу показалось, что это не удобно
45
Benchmark, кстати, отнюдь не восьмилетний =) Цифра 8 на этикетке к возрасту никакого отношения не имеет.
Я, конечно, всё понимаю, но откуда у студента деньги на 8-летний виски?
Уже 10 летний)
не вижу ничего плохого, что бы автовайрить контекст в синглтон и из него получать Бин. Да больше связность, но больше контроля, более предсказуемо и очевидно будет работать, в продакшене только такое и встречал. Смущает, что если вызвать по ошибке гетколор 2 раза в одном методе, то будет 2 разных инстенса, это не очевидно в месте вызова, потом можно долго искать причину баги.
Сколько людей без масок, ужас
чудом выжили!
Отличный метод раздачи футболок! :)
ОГНЕННОЕ ВИДЕО! Жека - терминатор!
"Какая разница между Spring, String и Swing?" )))
во второй букве
Swing это когда парами меняются
@@ip4989 нет, это графическая либа в джаве
@@randomaccess4402 если я смотрю видео по спрингу, каков шанс, что я не знаю что такое свинг?)
@@ip4989 Зависит от того в какой год отправили терминатора)
Интересно слушать, хорошая подача!
А есть код программы? посмотреть бы повнимательнее.
Эпично
А когда пропертя загружаются? И можно ли их заюзать в postProcessBeanFactory?
50-60 минуты, где создается Scope "periodical", я воспроизвела этот пример, долго смотрела на работающую программу и обнаружила, что через 20-30 секунд Screensaver перестает менять цвет. Время смены цвета в коде я указала 2 секунды.
Кто также воспроизводил код, понаблюдайте подольше за работающей программой, возникнет ли у вас такое же странное поведение?
Думаю проблема в том что метод getSecond() возвращает секунды в минуте, и когда now() доходит до конца минуты то секунды сбрасываются в ноль, и разность now().getSecond() - someTime.getSecond() уходит в отрицательные значения а значит меньше 3. Надо пользоваться duration-ами. Как написал Igor Salnikov выше.
Вот спасибо!
Всё ещё актуально?
Проблема в том, что метод getSecond() возвращает кол-во секунд от начала минуты (то есть значение от 0 до 60), соответственно смена цвета будет не каждые три секунды, а как повезет (например если первый вызов был в 10:20 а следующий в 11:10, то цвет не сменится)
java когда чтобы отнять два времени нужно гуглить ;)
Кто в итоге ящик пива выиграл? Барух или Жека?
Я хочу от него ребенка!)))
для это нужно переписать beanpostprocessor