ݺߣ

ݺߣShare a Scribd company logo
Спринг Потрошитель
Евгений Борисов
bsevgeny@gmail.com
Пишу курсы
Пишу код для JFrog-a
Синглтоны – не пишу, пью
Страдаю от аллергию на весну,
Но люблю спринг
2
2 Слова о себе
Терминология
• Аппликация = приложение
• Айбернет = хибернет
• Собака = Штрудель
• Компонент – использую с любым ударением
• Параметр = Параметр
Сегодня в программе
• Составляющие и жизненный цикл Спринга
• Виды Контекстов Спринга
• А как это сделать?..
• А как Спринг влияет на производительность?
Спринг в картинках…
26.11.2003
Давайте посмотрим как декларировался БИН
IoC Container
Классы
Как всё работает
Полностью настроенные объекты
BeanDefinitions
BeanPostProcessor
• Позволяет настраивать наши бины до того, как они попадают в
контейнер
• У этого интерфейса 2 метода:
• Object postProcessBeforeInitialization(Object bean, String beanName)
• Object postProcessAfterInitialization(Object bean, String beanName)
• А между ними вызывается init метод
• init-method
• afterPropertiesSet
• @PostConstruct
У меня вопрос
А на хрена нужны инит методы?
Конструктора мало что ли?
А ты про двухфазовый
конструктор ничего не
слышал???
IoC Container
Классы
До инит метода
BeanDefinitions
IoC Container
Классы
После инит метода
Полностью настроенные объекты
BeanDefinitions
У меня вопрос
Нафига два прохода по
бинпостроцессорам
А ты про прокси ничего
не слышал?
Еще один компонент ApplicationListener
• ContextStartedEvent
• ContextStoppedEvent
• ContextRefreshedEvent
• ContextClosedEvent
• Из любого ивента можно вытащить контекст
Трёхфазовый конструктор
• Constructor
• @PostConstruct
• @AfterProxy
BeanFactoryPostProcessor
• Позволяет настравить бин дифиншны, до того, как создаются бины
• Этот интерфэйс имеет один единственный метод:
• postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
• Этот метод запустится на этапе, когда другие бины ещё не созданы,
и есть только BeanDefinitions и сам BeanFactory
IoC Container
Классы
После инит метода
Полностью настроенные объекты
BeanDefinitions
@Component
• <context:component-scan base-package="com…"/>
• new AnnotationConfigApplicationContext("com");
ClassPathBeanDefinitionScanner
• Не является ни BeanPostProcessor-ом, ни BeanFactoryPostProcessor-ом
• Он ResourceLoaderAware
• Создаёт BeanDefinitions из всех классов,
над которыми стоит @Component,
или другая аннотация, аннотированная @Component
Java Config
• new AnnotationConfigApplicationContext(JavaConfig.class);
• Казалось бы, его должен парсировать, какой-нибудь BeanDefinitionReader,
как это было с XML
• И даже его класс его называется схоже: AnnotatedBeanDefinitionReader.
• Но нет, AnnotatedBeanDefinitionReader вообще ничего не имплементирует
• Он просто является часть ApplicationContext-a
• Он только регестрирует все JavaConfig-и
@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;
}
}
Кто обрабатывает JavaConfig?
• ConfigurationClassPostProcessor (особый BeanFactoryPostProcessor)
• Его регистрирует AnnotationConfigApplicationContext
• Он создаёт бин-дифинишны по @Bean
• А так же относится к:
• @Import
• @ImportResource
• @ComponentScan (да-да, там опять будет задействован крот)
Groovy Config
• Создаётся вот так:
new GenericGroovyApplicationContext("context.groovy");
• Парсируется GroovyBeanDefinitionReader
beans {
myDao(DaoImpl)
jeeConfService(JeeConfServiceImpl) { bean ->
bean.scope = 'prototype'
dao = myDao
}
}
А может мы свой контекст напишем?
Почём Spring для народа?
Что будем мерить?
• Время создания объекта (new / reflection / Spring)
• Время на лукап и инжекшн
• Время создания прокси
• Время вызова метода через прокси
• Аспекты
CGLIB Dynamic Proxy
VS
Как будем мерить?
• Есть разные уровни понимания
как делать MicroBenchmark
Уровень первый - Студент
Уровень второй - Junior Software Engineer
Уровень второй - Middle Software Engineer
Уровень третий - Senior Software Engineer
Уровень четвертый - Архитектор
Вы пьёте,
я пишу
Spring the ripper
Spring the ripper
Spring the ripper
Паника…
Можно выдохнуть
Можно выдохнуть
• Сколько времени нужно на создание миллиона прототайпов?
• 4.5 секунды
• Сколько времени нужно чтобы получить миллион сингалтонов?
• 0.1 секунды
Spring the ripper
Spring the ripper
Выводы
• Хочешь, хорошо работать – пользуйся Спрингом
• Хочешь, чтобы работало хорошо – знай его кишки

More Related Content

What's hot (6)

PPTX
Capability Design & Data Sourcing
accenture
PDF
Unified Data Analytics: Helping Data Teams Solve the World’s Toughest Problems
Databricks
PDF
SAP S/4HANA: Finance Capability and Frequently Asked Questions
Capgemini
PDF
The Wright Way into the Cloud: The Argument for ARCS
Alithya
PPTX
Leading Practices in Multi-Pillar Oracle Cloud Implementations
Alithya
PPTX
Why and How to Implement Operation Transfer Pricing (OTP) with Oracle EPM Cloud
Alithya
Capability Design & Data Sourcing
accenture
Unified Data Analytics: Helping Data Teams Solve the World’s Toughest Problems
Databricks
SAP S/4HANA: Finance Capability and Frequently Asked Questions
Capgemini
The Wright Way into the Cloud: The Argument for ARCS
Alithya
Leading Practices in Multi-Pillar Oracle Cloud Implementations
Alithya
Why and How to Implement Operation Transfer Pricing (OTP) with Oracle EPM Cloud
Alithya

Similar to Spring the ripper (20)

PDF
Spring the Ripper by Evgeny Borisov
JavaDayUA
PDF
Curse of spring boot test
Кирилл Толкачёв
PDF
Spring Boot Test horror
Кирилл Толкачёв
PPTX
Spring 4. Part 1 - IoC, AOP
Nakraynikov Oleg
PDF
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
PDF
Spring puzzlers
Evgeny Borisov
PPTX
Python Meetup
iQSpace
PDF
Разработка web-приложений с repoze.bfg
Andrey Popp
PDF
Spring data jee conf
Evgeny Borisov
PPT
Ejb in java. part 1.
Asya Dudnik
PDF
Apache Lucene + Hibernate = Hibernate Search
Vitebsk Miniq
PDF
"Внутренности" CPython, часть II
Python Meetup
PDF
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
JavaDayUA
PDF
Spring puzzlers 2
Evgeny Borisov
PPTX
Александр Фокин, Рефлексия в C++
Sergey Platonov
PPT
Selenium RC + python: история одного проекта
Konstantin Prishchenko
PPT
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Andrey Rebrov
PPTX
COMAQA.BY Conf #2: "Codeception + PHP for QA Automation", Евгений Борисик, CO...
COMAQA.BY
PDF
Spring Boot Ripper
Кирилл Толкачёв
PDF
React Native в продакшне
Eugeni Feudorov
Spring the Ripper by Evgeny Borisov
JavaDayUA
Curse of spring boot test
Кирилл Толкачёв
Spring Boot Test horror
Кирилл Толкачёв
Spring 4. Part 1 - IoC, AOP
Nakraynikov Oleg
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
Spring puzzlers
Evgeny Borisov
Python Meetup
iQSpace
Разработка web-приложений с repoze.bfg
Andrey Popp
Spring data jee conf
Evgeny Borisov
Ejb in java. part 1.
Asya Dudnik
Apache Lucene + Hibernate = Hibernate Search
Vitebsk Miniq
"Внутренности" CPython, часть II
Python Meetup
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
JavaDayUA
Spring puzzlers 2
Evgeny Borisov
Александр Фокин, Рефлексия в C++
Sergey Platonov
Selenium RC + python: история одного проекта
Konstantin Prishchenko
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Andrey Rebrov
COMAQA.BY Conf #2: "Codeception + PHP for QA Automation", Евгений Борисик, CO...
COMAQA.BY
React Native в продакшне
Eugeni Feudorov
Ad

More from Evgeny Borisov (7)

PDF
Java 8 puzzlers
Evgeny Borisov
PDF
мифы о спарке
Evgeny Borisov
PPTX
Groovy puzzlers jug-moscow-part 2
Evgeny Borisov
PDF
Groovy jug-moscow-part 1
Evgeny Borisov
PPTX
Javaone 2013 moscow gradle english
Evgeny Borisov
PDF
Javaone 2013 moscow gradle
Evgeny Borisov
Java 8 puzzlers
Evgeny Borisov
мифы о спарке
Evgeny Borisov
Groovy puzzlers jug-moscow-part 2
Evgeny Borisov
Groovy jug-moscow-part 1
Evgeny Borisov
Javaone 2013 moscow gradle english
Evgeny Borisov
Javaone 2013 moscow gradle
Evgeny Borisov
Ad

Spring the ripper

Editor's Notes

  • #5: А как Спринг влияет на производительность? Цена создания объекта Prototype – против синглтона Цена создания прокси Цена вызова метода через прокси Аспекты: как разные поинткаты бьют по производительности А как это сделать?.. Обновление прототайпов в синглтоне при помощи JavaConfig Протухание бинов Custom Scopes
  • #25: ApplicationContext регстрирует специальный BFPP ConfigurationClassPostProcessor который в том числе добавляет BeanDifinitions по @Bean, а также относится к @Import, @ImportResource, @ComponentScan (там в итоге пользуются тем же кротом) AnnotatedBeanDefinitionReader Добавляет @Configuration, вначале делая проверку @Condition Этот класс держит в себе ApplicationContext и он создаёт его в пустом конструкторе. Дальше при помощи AnnotationConfigUtilsAnnotatedBeanDefinitionReader Подгружает все внутренние бин пост процессоры сприрнга (при помощи которых он будет настраивать нашу @Configuration И в конечном итоге AnnotatedBeanDefinitionReader Регистрирует все @Configuration, которые передали в конструктор ApplicationContexta BeanDefinitionRegistryPostProcessor Есть только одна имплементация: ConfigurationClassPostProcessorПри помощи ConfigurationClassParserПарсирует все @Configuration и ищет в них определение биновConfClassParser держит в себе ComponentScanAnnotationParser, который имеет ClassPathBeanDefinitionScannerКоторый он сначала пол часа настраивает (говорит ему какие пакеты сканировать, какие фильтры), а потом при его помощи сканирует и ищет все @Component
  • #27: person.(class)=anlyze.Person person.name=Jeka person.(singleton)=false public class PropertyFileApplicationContext extends GenericApplicationContext { public PropertyFileApplicationContext(String fileName) { BeanDefinitionReader reader = new PropertiesBeanDefinitionReader(this); reader.loadBeanDefinitions(new ClassPathResource(fileName)); refresh(); } }
  • #39: Пофиг @Autowire над полем или сеттором @Resource работает медленнее на 13%
  • #45: Причем @Around – работает быстрее всех (200)