Why should we know about Spring internals? It works! So use it and enjoy! However, as always, in order to use Spring in most efficient way, you must know, what is under the fork. Only in case you really understand its internals you will be able to use all power of Spring. You will be able to customize this framework according to challenges of your project, to achieve best performance and solve any problem without applying to Spring-support center. ;) Here are several topics about Spring internals, which will be covered during this session (with examples for each one): What is Spring impact on the performance of your application? What are the phases of Spring lifecycle? What is ApplicationContext structure? “You can’t do it with Spring!” – or maybe you can?
4. Сегодня в программе
• Составляющие и жизненный цикл Спринга
• Виды Контекстов Спринга
• А как это сделать?..
• А как Спринг влияет на производительность?
9. BeanPostProcessor
• Позволяет настраивать наши бины до того, как они попадают в
контейнер
• У этого интерфейса 2 метода:
• Object postProcessBeforeInitialization(Object bean, String beanName)
• Object postProcessAfterInitialization(Object bean, String beanName)
• А между ними вызывается init метод
• init-method
• afterPropertiesSet
• @PostConstruct
16. BeanFactoryPostProcessor
• Позволяет настравить бин дифиншны, до того, как создаются бины
• Этот интерфэйс имеет один единственный метод:
• postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
• Этот метод запустится на этапе, когда другие бины ещё не созданы,
и есть только BeanDefinitions и сам BeanFactory
19. ClassPathBeanDefinitionScanner
• Не является ни BeanPostProcessor-ом, ни BeanFactoryPostProcessor-ом
• Он ResourceLoaderAware
• Создаёт BeanDefinitions из всех классов,
над которыми стоит @Component,
или другая аннотация, аннотированная @Component
21. @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;
}
}
22. Java Config
• new AnnotationConfigApplicationContext(JavaConfig.class);
• Казалось бы, его должен парсировать, какой-нибудь BeanDefinitionReader,
как это было с XML
• И даже его класс его называется схоже: AnnotatedBeanDefinitionReader.
• Но нет, AnnotatedBeanDefinitionReader вообще ничего не имплементирует
• Он просто является частью ApplicationContext-a
• Он только регистрирует все JavaConfig-и
23. Кто обрабатывает JavaConfig?
• ConfigurationClassPostProcessor (особый BeanFactoryPostProcessor)
• Его регистрирует AnnotationConfigApplicationContext
• Он создаёт бин-дифинишны по @Bean
• А так же относится к:
• @Import
• @ImportResource
• @ComponentScan (да-да, там опять будет задействован крот)
28. Что будем мерить?
• Время создания объекта (new / reflection / Spring)
• Время на лукап и инжекшн
• Время создания прокси
• Время вызова метода через прокси
• Аспекты
40. Можно выдохнуть
• Сколько времени нужно на создание миллиона прототайпов?
• 4.5 секунды
• Сколько времени нужно чтобы получить миллион сингалтонов?
• 0.1 секунды