Спрнг Потроштель - jpointПосле н тметода Полностью...
TRANSCRIPT
![Page 2: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/2.jpg)
Сегодня в программе
• Как работает Спринг• 4 вида контекста + напишем пятый
• Сравнение контекстов, обсуждение плюсов и минусов
• Что входит в жизненный цикл Спринга• BeanDefinitionReader
• BeanFactoryPostProcessor
• FactoryBeans
• BeanPostProcessors
• ApplicationListener
![Page 3: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/3.jpg)
Сегодня в программе
• А как Спринг влияет на производительность?• Цена создания объекта
• Prototype – против синглтона
• Цена создания прокси
• Цена вызова метода через прокси
• Аспекты: как разные поинткаты бьют по производительности
• А как это сделать?..• Обновление прототайпов в синглтоне при помощи JavaConfig
• Протухание бинов
• Custom Scopes
![Page 4: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/4.jpg)
Спринг в картинках…
![Page 5: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/5.jpg)
26.11.2003
![Page 6: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/6.jpg)
Давайте посмотрим как декларировался БИН
![Page 7: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/7.jpg)
IoC Container
Классы
Как всё работает
Полностью настроенные объекты
BeanDefinitions
![Page 8: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/8.jpg)
BeanPostProcessor
• Позволяет настраивать наши бины до того, как они попадают в контейнер
• У этого интерфейса 2 метода:• Object postProcessBeforeInitialization(Object bean, String beanName)
• Object postProcessAfterInitialization(Object bean, String beanName)
• А между ними вызывается init метод• init-method
• afterPropertiesSet
• @PostConstruct
![Page 9: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/9.jpg)
У меня вопрос
А на хрена нужны инит методы?Конструктора мало что ли?
![Page 10: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/10.jpg)
А ты про двухфазовый конструктор ничего не
слышал???
![Page 11: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/11.jpg)
IoC Container
Классы
До инит метода
BeanDefinitions
![Page 12: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/12.jpg)
IoC Container
Классы
После инит метода
Полностью настроенные объекты
BeanDefinitions
![Page 13: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/13.jpg)
BeanFactoryPostProcessor
• Позволяет настравить бин дифиншоны, до того, как создаются бины
• Этот интерфэйс имеет один единственный метод:
• postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
• Этот метод запуститься на этапе, когда другие бины ещё не созданы, и есть только BeanDefinitions
![Page 14: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/14.jpg)
IoC Container
Классы
После инит метода
Полностью настроенные объекты
BeanDefinitions
![Page 15: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/15.jpg)
@Component
• <context:component-scan base-package="com…"/>
• new AnnotationConfigApplicationContext("com");
![Page 16: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/16.jpg)
ClassPathBeanDefinitionScanner
• Не является ни BeanPostProcessor-ом, ни BeanFactoryPostProcessor-ом
• Он ResourceLoaderAware
• Создаёт BeanDefinitions из всех классов, над которыми стоит @Component, или другая аннотация включающая @Component
![Page 17: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/17.jpg)
Java Config
• new AnnotationConfigApplicationContext(JavaConfig.class);
• Казалось бы, его должен парсировать, какой-нибудь BeanDefinitionReader,как это было с XML
• И даже его класс его называется схоже: AnnotatedBeanDefinitionReader.
• Но нет AnnotatedBeanDefinitionReader, вообще ничего не имплементирует
• Он просто является часть ApplicationContext-a
• Он только регестрирует все JavaConfig-и
![Page 18: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/18.jpg)
Кто обрабатывает JavaConfig?
• ConfigurationClassPostProcessor (особый BeanFactoryPostProcessor)
• Его регистрирует AnnotationConfigApplicationContext
• Он создаёт бин-дифигишоны по @Bean
• А так же относится к:• @Import
• @ImportResource
• @ComponentScan (да да там опять будет задействован крот)
![Page 19: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/19.jpg)
Groovy Config
• Создаётся вот так: new GenericGroovyApplicationContext("context.groovy");
• Парсируется GroovyBeanDefinitionReader
beans {
myDao(DaoImpl)
jPointService(JPointServiceImpl){bean->
bean.scope = 'prototype'
dao = myDao
}
}
![Page 20: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/20.jpg)
А может мы свой контекст напишем?
![Page 21: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/21.jpg)
Еще один компонент ApplicationListener
• ContextStartedEvent
• ContextStoppedEvent
• ContextRefreshedEvent
• ContextClosedEvent
• Из любого ивента можно вытащить контекст
![Page 22: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/22.jpg)
А теперь давайте решим что-нибудь не «Элементарное»…
![Page 23: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/23.jpg)
Почём Spring для народа?
![Page 24: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/24.jpg)
Что будем мерить?
• Время создания объекта (new / reflection / Spring)
• Время на лукап и инжекшн
• Время создания прокси
• Время вызова метода через прокси
• Аспекты
![Page 25: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/25.jpg)
CGLIB Dynamic Proxy
VS
![Page 26: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/26.jpg)
Как будем мерить?
• Есть разные уровни пониманиякак делать MicroBenchmark
![Page 27: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/27.jpg)
Уровень первый - Студент
![Page 28: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/28.jpg)
Уровень второй - Junior Software Engineer
![Page 29: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/29.jpg)
Уровень второй - Middle Software Engineer
![Page 30: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/30.jpg)
Уровень третий - Senior Software Engineer
![Page 31: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/31.jpg)
Уровень четвертый - Архитектор
Вы пьёте, я пишу
![Page 32: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/32.jpg)
![Page 33: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/33.jpg)
![Page 34: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/34.jpg)
![Page 35: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/35.jpg)
![Page 36: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/36.jpg)
Паника…
![Page 37: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/37.jpg)
Всё это ещё не страшно
• Сколько времени нужно на создание миллиона прототайпов?
• 4.5 секунды
• Сколько времени нужно чтобы получить миллион сингалтонов?
• 0.1 секунды
![Page 38: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/38.jpg)
![Page 39: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/39.jpg)
![Page 40: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет](https://reader034.vdocuments.pub/reader034/viewer/2022042806/5f6e010b61833632d7754590/html5/thumbnails/40.jpg)
Выводы
• Хочешь, хорошо работать – пользуйся Спрингом
• Хочешь, чтобы работало хорошо – знай его кишки