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

Spring the Ripper by Evgeny Borisov

Jan 06, 2017

Download

Technology

JavaDayUA
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Spring the Ripper by Evgeny Borisov

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

[email protected]

Page 2: Spring the Ripper by Evgeny Borisov

Пишу стартап

Пишу курсы

Пишу код для JFrog-a

Синглтоны – не пишу

2

2 Слова о себе

Page 3: Spring the Ripper by Evgeny Borisov

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

• Аппликация = приложение

• Айбернет = хибернет

• Штрудель =Собака

• Компонент – использую с любым ударением

• Параметр = Параметр

• Список пополняется…

Page 4: Spring the Ripper by Evgeny Borisov

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

• Составляющие и жизненный цикл Спринга

• Виды Контекстов Спринга

• А как это сделать?..

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

Page 5: Spring the Ripper by Evgeny Borisov

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

Page 6: Spring the Ripper by Evgeny Borisov

26.11.2003

Page 7: Spring the Ripper by Evgeny Borisov

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

Page 8: Spring the Ripper by Evgeny Borisov

IoC Container

Классы

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

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

BeanDefinitions

Page 9: Spring the Ripper by Evgeny Borisov

BeanPostProcessor

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

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

• Object postProcessAfterInitialization(Object bean, String beanName)

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

• afterPropertiesSet

• @PostConstruct

Page 10: Spring the Ripper by Evgeny Borisov

IoC Container

Классы

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

BeanDefinitions

Page 11: Spring the Ripper by Evgeny Borisov

IoC Container

Классы

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

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

BeanDefinitions

Page 12: Spring the Ripper by Evgeny Borisov

У меня вопрос

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

Page 13: Spring the Ripper by Evgeny Borisov

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

слышал???

Page 14: Spring the Ripper by Evgeny Borisov

У меня вопрос

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

Page 15: Spring the Ripper by Evgeny Borisov

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

Page 16: Spring the Ripper by Evgeny Borisov

BeanFactoryPostProcessor

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

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

• postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

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

Page 17: Spring the Ripper by Evgeny Borisov

IoC Container

Классы

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

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

BeanDefinitions

Page 18: Spring the Ripper by Evgeny Borisov

@Component

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

• new AnnotationConfigApplicationContext("com");

Page 19: Spring the Ripper by Evgeny Borisov

ClassPathBeanDefinitionScanner

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

• Он ResourceLoaderAware

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

Page 20: Spring the Ripper by Evgeny Borisov

Spring 3 – Java Config

Page 21: Spring the Ripper by Evgeny Borisov

@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 22: Spring the Ripper by Evgeny Borisov

Java Config

• new AnnotationConfigApplicationContext(JavaConfig.class);

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

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

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

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

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

Page 23: Spring the Ripper by Evgeny Borisov

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

• ConfigurationClassPostProcessor (особый BeanFactoryPostProcessor)

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

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

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

• @ImportResource

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

Page 24: Spring the Ripper by Evgeny Borisov

Spring 4 - Groovy Config

Page 25: Spring the Ripper by Evgeny Borisov

Groovy Config

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

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

beans {

myDao(DaoImpl)

javadayConfService(JavadayServiceImpl) { bean ->

bean.scope = 'prototype'

dao = myDao

}

}

Page 26: Spring the Ripper by Evgeny Borisov

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

Page 27: Spring the Ripper by Evgeny Borisov

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

Page 28: Spring the Ripper by Evgeny Borisov

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

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

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

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

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

• Аспекты

Page 29: Spring the Ripper by Evgeny Borisov

CGLIB Dynamic Proxy

VS

Page 30: Spring the Ripper by Evgeny Borisov

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

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

Page 31: Spring the Ripper by Evgeny Borisov

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

Page 32: Spring the Ripper by Evgeny Borisov

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

Page 33: Spring the Ripper by Evgeny Borisov

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

Page 34: Spring the Ripper by Evgeny Borisov

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

Page 35: Spring the Ripper by Evgeny Borisov

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

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

Page 36: Spring the Ripper by Evgeny Borisov
Page 37: Spring the Ripper by Evgeny Borisov
Page 38: Spring the Ripper by Evgeny Borisov
Page 39: Spring the Ripper by Evgeny Borisov

Паника…

Page 40: Spring the Ripper by Evgeny Borisov

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

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

• 4.5 секунды

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

• 0.1 секунды

Page 41: Spring the Ripper by Evgeny Borisov

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

Page 42: Spring the Ripper by Evgeny Borisov
Page 43: Spring the Ripper by Evgeny Borisov
Page 44: Spring the Ripper by Evgeny Borisov

Выводы

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

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

Page 45: Spring the Ripper by Evgeny Borisov