Спрнг Потроштель - jpointПосле н тметода Полностью...

40
Спринг Потрошитель Евгений Борисов [email protected]

Upload: others

Post on 24-Jul-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Спринг ПотрошительЕвгений Борисов

[email protected]

Page 2: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Сегодня в программе

• Как работает Спринг• 4 вида контекста + напишем пятый

• Сравнение контекстов, обсуждение плюсов и минусов

• Что входит в жизненный цикл Спринга• BeanDefinitionReader

• BeanFactoryPostProcessor

• FactoryBeans

• BeanPostProcessors

• ApplicationListener

Page 3: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Сегодня в программе

• А как Спринг влияет на производительность?• Цена создания объекта

• Prototype – против синглтона

• Цена создания прокси

• Цена вызова метода через прокси

• Аспекты: как разные поинткаты бьют по производительности

• А как это сделать?..• Обновление прототайпов в синглтоне при помощи JavaConfig

• Протухание бинов

• Custom Scopes

Page 4: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Спринг в картинках…

Page 5: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

26.11.2003

Page 6: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Давайте посмотрим как декларировался БИН

Page 7: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

IoC Container

Классы

Как всё работает

Полностью настроенные объекты

BeanDefinitions

Page 8: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

BeanPostProcessor

• Позволяет настраивать наши бины до того, как они попадают в контейнер

• У этого интерфейса 2 метода:• Object postProcessBeforeInitialization(Object bean, String beanName)

• Object postProcessAfterInitialization(Object bean, String beanName)

• А между ними вызывается init метод• init-method

• afterPropertiesSet

• @PostConstruct

Page 9: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

У меня вопрос

А на хрена нужны инит методы?Конструктора мало что ли?

Page 10: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

А ты про двухфазовый конструктор ничего не

слышал???

Page 11: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

IoC Container

Классы

До инит метода

BeanDefinitions

Page 12: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

IoC Container

Классы

После инит метода

Полностью настроенные объекты

BeanDefinitions

Page 13: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

BeanFactoryPostProcessor

• Позволяет настравить бин дифиншоны, до того, как создаются бины

• Этот интерфэйс имеет один единственный метод:

• postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

• Этот метод запуститься на этапе, когда другие бины ещё не созданы, и есть только BeanDefinitions

Page 14: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

IoC Container

Классы

После инит метода

Полностью настроенные объекты

BeanDefinitions

Page 15: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

@Component

• <context:component-scan base-package="com…"/>

• new AnnotationConfigApplicationContext("com");

Page 16: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

ClassPathBeanDefinitionScanner

• Не является ни BeanPostProcessor-ом, ни BeanFactoryPostProcessor-ом

• Он ResourceLoaderAware

• Создаёт BeanDefinitions из всех классов, над которыми стоит @Component, или другая аннотация включающая @Component

Page 17: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Java Config

• new AnnotationConfigApplicationContext(JavaConfig.class);

• Казалось бы, его должен парсировать, какой-нибудь BeanDefinitionReader,как это было с XML

• И даже его класс его называется схоже: AnnotatedBeanDefinitionReader.

• Но нет AnnotatedBeanDefinitionReader, вообще ничего не имплементирует

• Он просто является часть ApplicationContext-a

• Он только регестрирует все JavaConfig-и

Page 18: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Кто обрабатывает JavaConfig?

• ConfigurationClassPostProcessor (особый BeanFactoryPostProcessor)

• Его регистрирует AnnotationConfigApplicationContext

• Он создаёт бин-дифигишоны по @Bean

• А так же относится к:• @Import

• @ImportResource

• @ComponentScan (да да там опять будет задействован крот)

Page 19: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Groovy Config

• Создаётся вот так: new GenericGroovyApplicationContext("context.groovy");

• Парсируется GroovyBeanDefinitionReader

beans {

myDao(DaoImpl)

jPointService(JPointServiceImpl){bean->

bean.scope = 'prototype'

dao = myDao

}

}

Page 20: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

А может мы свой контекст напишем?

Page 21: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Еще один компонент ApplicationListener

• ContextStartedEvent

• ContextStoppedEvent

• ContextRefreshedEvent

• ContextClosedEvent

• Из любого ивента можно вытащить контекст

Page 22: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

А теперь давайте решим что-нибудь не «Элементарное»…

Page 23: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Почём Spring для народа?

Page 24: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Что будем мерить?

• Время создания объекта (new / reflection / Spring)

• Время на лукап и инжекшн

• Время создания прокси

• Время вызова метода через прокси

• Аспекты

Page 25: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

CGLIB Dynamic Proxy

VS

Page 26: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Как будем мерить?

• Есть разные уровни пониманиякак делать MicroBenchmark

Page 27: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Уровень первый - Студент

Page 28: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Уровень второй - Junior Software Engineer

Page 29: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Уровень второй - Middle Software Engineer

Page 30: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Уровень третий - Senior Software Engineer

Page 31: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Уровень четвертый - Архитектор

Вы пьёте, я пишу

Page 32: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет
Page 33: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет
Page 34: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет
Page 35: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет
Page 36: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Паника…

Page 37: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Всё это ещё не страшно

• Сколько времени нужно на создание миллиона прототайпов?

• 4.5 секунды

• Сколько времени нужно чтобы получить миллион сингалтонов?

• 0.1 секунды

Page 38: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет
Page 39: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет
Page 40: Спрнг Потроштель - JPointПосле н тметода Полностью настроенные объекты BeanDefinitions BeanFactoryPostProcessor •Позволяет

Выводы

• Хочешь, хорошо работать – пользуйся Спрингом

• Хочешь, чтобы работало хорошо – знай его кишки