Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Спринг Потрошитель
Евгений Борисов
bsevgeny@gmail.com
Пишу курсы
Пишу код для JFrog-a
Синглтоны – не пишу, пью
Страдаю от аллергию на весну,
Но люблю спринг
2
2 Слова о себе
Терминология
• Аппликация = приложение
• Айбернет = хибернет
• Собака = Штрудель
• Компонент – использую с любым ударением...
Сегодня в программе
• Составляющие и жизненный цикл Спринга
• Виды Контекстов Спринга
• А как это сделать?..
• А как Сприн...
Спринг в картинках…
26.11.2003
Давайте посмотрим как декларировался БИН
IoC Container
Классы
Как всё работает
Полностью настроенные объекты
BeanDefinitions
BeanPostProcessor
• Позволяет настраивать наши бины до того, как они попадают в
контейнер
• У этого интерфейса 2 метода:
•...
У меня вопрос
А на хрена нужны инит методы?
Конструктора мало что ли?
А ты про двухфазовый
конструктор ничего не
слышал???
IoC Container
Классы
До инит метода
BeanDefinitions
IoC Container
Классы
После инит метода
Полностью настроенные объекты
BeanDefinitions
У меня вопрос
Нафига два прохода по
бинпостроцессорам
А ты про прокси ничего
не слышал?
Еще один компонент ApplicationListener
• ContextStartedEvent
• ContextStoppedEvent
• ContextRefreshedEvent
• ContextClosed...
Трёхфазовый конструктор
• Constructor
• @PostConstruct
• @AfterProxy
BeanFactoryPostProcessor
• Позволяет настравить бин дифиншны, до того, как создаются бины
• Этот интерфэйс имеет один един...
IoC Container
Классы
После инит метода
Полностью настроенные объекты
BeanDefinitions
@Component
• <context:component-scan base-package="com…"/>
• new AnnotationConfigApplicationContext("com");
ClassPathBeanDefinitionScanner
• Не является ни BeanPostProcessor-ом, ни BeanFactoryPostProcessor-ом
• Он ResourceLoaderAw...
Java Config
• new AnnotationConfigApplicationContext(JavaConfig.class);
• Казалось бы, его должен парсировать, какой-нибуд...
@Configuration
@ComponentScan("root")
public class JavaConfig {
@Bean
public CoolDao dao() {
return new CoolDaoImpl();
}
@...
Кто обрабатывает JavaConfig?
• ConfigurationClassPostProcessor (особый BeanFactoryPostProcessor)
• Его регистрирует Annota...
Groovy Config
• Создаётся вот так:
new GenericGroovyApplicationContext("context.groovy");
• Парсируется GroovyBeanDefiniti...
А может мы свой контекст напишем?
Почём Spring для народа?
Что будем мерить?
• Время создания объекта (new / reflection / Spring)
• Время на лукап и инжекшн
• Время создания прокси
...
CGLIB Dynamic Proxy
VS
Как будем мерить?
• Есть разные уровни понимания
как делать MicroBenchmark
Уровень первый - Студент
Уровень второй - Junior Software Engineer
Уровень второй - Middle Software Engineer
Уровень третий - Senior Software Engineer
Уровень четвертый - Архитектор
Вы пьёте,
я пишу
Паника…
Можно выдохнуть
Можно выдохнуть
• Сколько времени нужно на создание миллиона прототайпов?
• 4.5 секунды
• Сколько времени нужно чтобы полу...
Выводы
• Хочешь, хорошо работать – пользуйся Спрингом
• Хочешь, чтобы работало хорошо – знай его кишки
Spring the ripper
Spring the ripper
Spring the ripper
Spring the ripper
Spring the ripper
Upcoming SlideShare
Loading in …5
×

Spring the ripper

4,118 views

Published on

JEConf Kiev 2014

Published in: Software
  • Be the first to comment

Spring the ripper

  1. 1. Спринг Потрошитель Евгений Борисов bsevgeny@gmail.com
  2. 2. Пишу курсы Пишу код для JFrog-a Синглтоны – не пишу, пью Страдаю от аллергию на весну, Но люблю спринг 2 2 Слова о себе
  3. 3. Терминология • Аппликация = приложение • Айбернет = хибернет • Собака = Штрудель • Компонент – использую с любым ударением • Параметр = Параметр
  4. 4. Сегодня в программе • Составляющие и жизненный цикл Спринга • Виды Контекстов Спринга • А как это сделать?.. • А как Спринг влияет на производительность?
  5. 5. Спринг в картинках…
  6. 6. 26.11.2003
  7. 7. Давайте посмотрим как декларировался БИН
  8. 8. IoC Container Классы Как всё работает Полностью настроенные объекты BeanDefinitions
  9. 9. BeanPostProcessor • Позволяет настраивать наши бины до того, как они попадают в контейнер • У этого интерфейса 2 метода: • Object postProcessBeforeInitialization(Object bean, String beanName) • Object postProcessAfterInitialization(Object bean, String beanName) • А между ними вызывается init метод • init-method • afterPropertiesSet • @PostConstruct
  10. 10. У меня вопрос А на хрена нужны инит методы? Конструктора мало что ли?
  11. 11. А ты про двухфазовый конструктор ничего не слышал???
  12. 12. IoC Container Классы До инит метода BeanDefinitions
  13. 13. IoC Container Классы После инит метода Полностью настроенные объекты BeanDefinitions
  14. 14. У меня вопрос Нафига два прохода по бинпостроцессорам
  15. 15. А ты про прокси ничего не слышал?
  16. 16. Еще один компонент ApplicationListener • ContextStartedEvent • ContextStoppedEvent • ContextRefreshedEvent • ContextClosedEvent • Из любого ивента можно вытащить контекст
  17. 17. Трёхфазовый конструктор • Constructor • @PostConstruct • @AfterProxy
  18. 18. BeanFactoryPostProcessor • Позволяет настравить бин дифиншны, до того, как создаются бины • Этот интерфэйс имеет один единственный метод: • postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) • Этот метод запустится на этапе, когда другие бины ещё не созданы, и есть только BeanDefinitions и сам BeanFactory
  19. 19. IoC Container Классы После инит метода Полностью настроенные объекты BeanDefinitions
  20. 20. @Component • <context:component-scan base-package="com…"/> • new AnnotationConfigApplicationContext("com");
  21. 21. ClassPathBeanDefinitionScanner • Не является ни BeanPostProcessor-ом, ни BeanFactoryPostProcessor-ом • Он ResourceLoaderAware • Создаёт BeanDefinitions из всех классов, над которыми стоит @Component, или другая аннотация, аннотированная @Component
  22. 22. Java Config • new AnnotationConfigApplicationContext(JavaConfig.class); • Казалось бы, его должен парсировать, какой-нибудь BeanDefinitionReader, как это было с XML • И даже его класс его называется схоже: AnnotatedBeanDefinitionReader. • Но нет, AnnotatedBeanDefinitionReader вообще ничего не имплементирует • Он просто является часть ApplicationContext-a • Он только регестрирует все JavaConfig-и
  23. 23. @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; } }
  24. 24. Кто обрабатывает JavaConfig? • ConfigurationClassPostProcessor (особый BeanFactoryPostProcessor) • Его регистрирует AnnotationConfigApplicationContext • Он создаёт бин-дифинишны по @Bean • А так же относится к: • @Import • @ImportResource • @ComponentScan (да-да, там опять будет задействован крот)
  25. 25. Groovy Config • Создаётся вот так: new GenericGroovyApplicationContext("context.groovy"); • Парсируется GroovyBeanDefinitionReader beans { myDao(DaoImpl) jeeConfService(JeeConfServiceImpl) { bean -> bean.scope = 'prototype' dao = myDao } }
  26. 26. А может мы свой контекст напишем?
  27. 27. Почём Spring для народа?
  28. 28. Что будем мерить? • Время создания объекта (new / reflection / Spring) • Время на лукап и инжекшн • Время создания прокси • Время вызова метода через прокси • Аспекты
  29. 29. CGLIB Dynamic Proxy VS
  30. 30. Как будем мерить? • Есть разные уровни понимания как делать MicroBenchmark
  31. 31. Уровень первый - Студент
  32. 32. Уровень второй - Junior Software Engineer
  33. 33. Уровень второй - Middle Software Engineer
  34. 34. Уровень третий - Senior Software Engineer
  35. 35. Уровень четвертый - Архитектор Вы пьёте, я пишу
  36. 36. Паника…
  37. 37. Можно выдохнуть
  38. 38. Можно выдохнуть • Сколько времени нужно на создание миллиона прототайпов? • 4.5 секунды • Сколько времени нужно чтобы получить миллион сингалтонов? • 0.1 секунды
  39. 39. Выводы • Хочешь, хорошо работать – пользуйся Спрингом • Хочешь, чтобы работало хорошо – знай его кишки

×