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

Spring the ripper

Embed Size (px)

DESCRIPTION

JEConf Kiev 2014

Citation preview

Page 1: Spring the ripper

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

[email protected]

Page 2: Spring the ripper

2

Пишу курсы Пишу код для JFrog-aСинглтоны – не пишу, пьюСтрадаю от аллергию на весну, Но люблю спринг

2 Слова о себе

Page 3: Spring the ripper

Терминология

• Аппликация = приложение• Айбернет = хибернет• Собака = Штрудель• Компонент – использую с любым ударением• Параметр = Параметр

Page 4: Spring the ripper

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

• Составляющие и жизненный цикл Спринга• Виды Контекстов Спринга• А как это сделать?..• А как Спринг влияет на производительность?

Page 5: Spring the ripper

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

Page 6: Spring the ripper

26.11.2003

XmlBeanDefinitionReader

Page 7: Spring the ripper

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

Page 8: Spring the ripper

IoC Container

Классы

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

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

BeanFactory

BeanDefinitions

Page 9: Spring the ripper

BeanPostProcessor

• Позволяет настраивать наши бины до того, как они попадают в контейнер• У этого интерфейса 2 метода:• Object postProcessBeforeInitialization(Object bean, String beanName)• Object postProcessAfterInitialization(Object bean, String beanName)

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

Page 10: Spring the ripper

У меня вопрос

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

Page 11: Spring the ripper

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

слышал???

Page 12: Spring the ripper

IoC Container

Классы

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

BeanFactory

BeanDefinitions

Page 13: Spring the ripper

IoC Container

Классы

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

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

BeanFactory

BeanDefinitions

Page 14: Spring the ripper

У меня вопрос

Нафига два прохода по бинпостроцессорам

Page 15: Spring the ripper

А ты про прокси ничего не слышал?

Page 16: Spring the ripper

Еще один компонент ApplicationListener• ContextStartedEvent• ContextStoppedEvent• ContextRefreshedEvent• ContextClosedEvent

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

Page 17: Spring the ripper

Трёхфазовый конструктор

• Constructor

• @PostConstruct

• @AfterProxy

Page 18: Spring the ripper

BeanFactoryPostProcessor

• Позволяет настравить бин дифиншны, до того, как создаются бины• Этот интерфэйс имеет один единственный метод:• postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)• Этот метод запустится на этапе, когда другие бины ещё не созданы,

и есть только BeanDefinitions и сам BeanFactory

Page 19: Spring the ripper

IoC Container

Классы

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

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

BeanFactory

BeanDefinitions

Page 20: Spring the ripper

@Component

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

• new AnnotationConfigApplicationContext("com");

Page 21: Spring the ripper

ClassPathBeanDefinitionScanner

ClassPathBeanDefinitionScanner

• Не является ни BeanPostProcessor-ом, ни BeanFactoryPostProcessor-ом• Он ResourceLoaderAware• Создаёт BeanDefinitions из всех классов,

над которыми стоит @Component, или другая аннотация, аннотированная @Component

Page 22: Spring the ripper

Java Config

• new AnnotationConfigApplicationContext(JavaConfig.class);

• Казалось бы, его должен парсировать, какой-нибудь BeanDefinitionReader,как это было с XML• И даже его класс его называется схоже: AnnotatedBeanDefinitionReader.• Но нет, AnnotatedBeanDefinitionReader вообще ничего не имплементирует• Он просто является часть ApplicationContext-a• Он только регестрирует все JavaConfig-и

Page 23: Spring the ripper

@Configuration @ComponentScan("root") public class JavaConfig { @Bean public CoolDao dao() { return new CoolDaoImpl(); } @Bean(initMethod = "init") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public CoolService coolService() { CoolServiceImpl service = new CoolServiceImpl(); service.setDao(dao()); return service; } }

Page 24: Spring the ripper

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

• ConfigurationClassPostProcessor (особый BeanFactoryPostProcessor)• Его регистрирует AnnotationConfigApplicationContext• Он создаёт бин-дифинишны по @Bean• А так же относится к:• @Import• @ImportResource• @ComponentScan (да-да, там опять будет задействован крот)

Page 25: Spring the ripper

Groovy Config

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

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

beans { myDao(DaoImpl) jeeConfService(JeeConfServiceImpl) { bean -> bean.scope = 'prototype' dao = myDao } }

Page 26: Spring the ripper

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

Page 27: Spring the ripper

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

Page 28: Spring the ripper

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

• Время создания объекта (new / reflection / Spring)• Время на лукап и инжекшн• Время создания прокси • Время вызова метода через прокси• Аспекты

Page 29: Spring the ripper

CGLIB

Dynamic Proxy

VS

Page 30: Spring the ripper

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

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

Page 31: Spring the ripper

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

Page 32: Spring the ripper

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

Page 33: Spring the ripper

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

Page 34: Spring the ripper

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

Page 35: Spring the ripper

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

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

Page 36: Spring the ripper
Page 37: Spring the ripper
Page 38: Spring the ripper
Page 39: Spring the ripper

Паника…

Page 40: Spring the ripper

Можно выдохнуть

Page 41: Spring the ripper

Можно выдохнуть

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

Page 42: Spring the ripper
Page 43: Spring the ripper
Page 44: Spring the ripper

Выводы

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