SlideShare une entreprise Scribd logo
1  sur  44
Спринг Потрошитель
Евгений Борисов
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
Уровень четвертый - Архитектор
Вы пьёте,
я пишу
Паника…
Можно выдохнуть
Можно выдохнуть
• Сколько времени нужно на создание миллиона прототайпов?
• 4.5 секунды
• Сколько времени нужно чтобы получить миллион сингалтонов?
• 0.1 секунды
Выводы
• Хочешь, хорошо работать – пользуйся Спрингом
• Хочешь, чтобы работало хорошо – знай его кишки

Contenu connexe

Tendances

Source code visualization (SourceViz)
Source code visualization (SourceViz)Source code visualization (SourceViz)
Source code visualization (SourceViz)
Anas Bilal
 

Tendances (20)

Domain Modeling in a Functional World
Domain Modeling in a Functional WorldDomain Modeling in a Functional World
Domain Modeling in a Functional World
 
The redux saga begins
The redux saga beginsThe redux saga begins
The redux saga begins
 
Source code visualization (SourceViz)
Source code visualization (SourceViz)Source code visualization (SourceViz)
Source code visualization (SourceViz)
 
Preparing for Scala 3
Preparing for Scala 3Preparing for Scala 3
Preparing for Scala 3
 
Functional Programming by Examples using Haskell
Functional Programming by Examples using HaskellFunctional Programming by Examples using Haskell
Functional Programming by Examples using Haskell
 
Capabilities for Resources and Effects
Capabilities for Resources and EffectsCapabilities for Resources and Effects
Capabilities for Resources and Effects
 
A Prelude of Purity: Scaling Back ZIO
A Prelude of Purity: Scaling Back ZIOA Prelude of Purity: Scaling Back ZIO
A Prelude of Purity: Scaling Back ZIO
 
Lec1
Lec1Lec1
Lec1
 
How to successfully manage a ZIO fiber’s lifecycle - Functional Scala 2021
How to successfully manage a ZIO fiber’s lifecycle - Functional Scala 2021How to successfully manage a ZIO fiber’s lifecycle - Functional Scala 2021
How to successfully manage a ZIO fiber’s lifecycle - Functional Scala 2021
 
The Art of Clean code
The Art of Clean codeThe Art of Clean code
The Art of Clean code
 
PyCon Korea 2019 REST API Document Generation
PyCon Korea 2019 REST API Document GenerationPyCon Korea 2019 REST API Document Generation
PyCon Korea 2019 REST API Document Generation
 
ZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional Programming
ZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional ProgrammingZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional Programming
ZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional Programming
 
Callbacks, promises, generators - asynchronous javascript
Callbacks, promises, generators - asynchronous javascriptCallbacks, promises, generators - asynchronous javascript
Callbacks, promises, generators - asynchronous javascript
 
Methods for meta learning in AutoML
Methods for meta learning in AutoMLMethods for meta learning in AutoML
Methods for meta learning in AutoML
 
Herramientas de reporte
Herramientas de reporteHerramientas de reporte
Herramientas de reporte
 
Conceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffersConceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffers
 
A real-world example of Functional Programming with fp-ts - no experience req...
A real-world example of Functional Programming with fp-ts - no experience req...A real-world example of Functional Programming with fp-ts - no experience req...
A real-world example of Functional Programming with fp-ts - no experience req...
 
Full Text Search In PostgreSQL
Full Text Search In PostgreSQLFull Text Search In PostgreSQL
Full Text Search In PostgreSQL
 
3 searching algorithms in Java
3 searching algorithms in Java3 searching algorithms in Java
3 searching algorithms in Java
 
Indexing with MongoDB
Indexing with MongoDBIndexing with MongoDB
Indexing with MongoDB
 

Similaire à Spring the ripper

Разработка web-приложений с repoze.bfg
Разработка web-приложений с repoze.bfgРазработка web-приложений с repoze.bfg
Разработка web-приложений с repoze.bfg
Andrey Popp
 
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Spring Puzzlers by Evgeny Borisov, Baruch SadogurskySpring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
JavaDayUA
 
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Andrey Rebrov
 

Similaire à Spring the ripper (20)

Spring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny BorisovSpring the Ripper by Evgeny Borisov
Spring the Ripper by Evgeny Borisov
 
Curse of spring boot test
Curse of spring boot testCurse of spring boot test
Curse of spring boot test
 
Spring Boot Test horror
Spring Boot Test horrorSpring Boot Test horror
Spring Boot Test horror
 
Spring 4. Part 1 - IoC, AOP
Spring 4. Part 1 - IoC, AOPSpring 4. Part 1 - IoC, AOP
Spring 4. Part 1 - IoC, AOP
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Spring puzzlers
Spring puzzlersSpring puzzlers
Spring puzzlers
 
Python Meetup
Python Meetup Python Meetup
Python Meetup
 
Разработка web-приложений с repoze.bfg
Разработка web-приложений с repoze.bfgРазработка web-приложений с repoze.bfg
Разработка web-приложений с repoze.bfg
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
 
Ejb in java. part 1.
Ejb in java. part 1.Ejb in java. part 1.
Ejb in java. part 1.
 
Apache Lucene + Hibernate = Hibernate Search
Apache Lucene + Hibernate = Hibernate SearchApache Lucene + Hibernate = Hibernate Search
Apache Lucene + Hibernate = Hibernate Search
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть II
 
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Spring Puzzlers by Evgeny Borisov, Baruch SadogurskySpring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
 
Spring puzzlers 2
Spring puzzlers 2Spring puzzlers 2
Spring puzzlers 2
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Selenium RC + python: история одного проекта
Selenium RC + python: история одного проектаSelenium RC + python: история одного проекта
Selenium RC + python: история одного проекта
 
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
 
COMAQA.BY Conf #2: "Codeception + PHP for QA Automation", Евгений Борисик, CO...
COMAQA.BY Conf #2: "Codeception + PHP for QA Automation", Евгений Борисик, CO...COMAQA.BY Conf #2: "Codeception + PHP for QA Automation", Евгений Борисик, CO...
COMAQA.BY Conf #2: "Codeception + PHP for QA Automation", Евгений Борисик, CO...
 
Spring Boot Ripper
Spring Boot RipperSpring Boot Ripper
Spring Boot Ripper
 
React Native в продакшне
React Native в продакшнеReact Native в продакшне
React Native в продакшне
 

Plus de Evgeny Borisov (7)

Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
мифы о спарке
мифы о спарке мифы о спарке
мифы о спарке
 
Groovy puzzlers jug-moscow-part 2
Groovy puzzlers jug-moscow-part 2Groovy puzzlers jug-moscow-part 2
Groovy puzzlers jug-moscow-part 2
 
Groovy jug-moscow-part 1
Groovy jug-moscow-part 1Groovy jug-moscow-part 1
Groovy jug-moscow-part 1
 
Spock
SpockSpock
Spock
 
Javaone 2013 moscow gradle english
Javaone 2013 moscow gradle   englishJavaone 2013 moscow gradle   english
Javaone 2013 moscow gradle english
 
Javaone 2013 moscow gradle
Javaone 2013 moscow gradleJavaone 2013 moscow gradle
Javaone 2013 moscow gradle
 

Spring the ripper

Notes de l'éditeur

  1. А как Спринг влияет на производительность? Цена создания объекта Prototype – против синглтона Цена создания прокси Цена вызова метода через прокси Аспекты: как разные поинткаты бьют по производительности А как это сделать?.. Обновление прототайпов в синглтоне при помощи JavaConfig Протухание бинов Custom Scopes
  2. 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          
  3. 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(); } }
  4. Пофиг @Autowire над полем или сеттором @Resource работает медленнее на 13%
  5. Причем @Around – работает быстрее всех (200)