SlideShare a Scribd company logo
The Spring Puzzlers:
Начало…
Ты кто такой?
linkedin.com/in/evborisov
Ты кто такой?
linkd.in/jbaruch
stackoverflow.com/users/402053/jbaruch
Вместе мы:
Свистнули идейку:
Свистнули идейку:
Свистнули идейку:
Похоже, но не совсем
1. ВесЕлые загадки
2. Меньше хи-хи, больше
хардкора!
3. Вы все равно голосуете!
4. Спасибо jug.ua за призы
Аннотации Спринга в наследовании
implements
extends
extends
Аннотации Cпринга в наследовании
public class Parent {
@PostConstruct
private void init(){
System.out.println("Папа");
}
}
@Component
public class Son extends Parent {
@PostConstruct
public void init(){
System.out.println("Cын");
}
}
Создаём сына, что с папой?
A. @PostConstruct не inherited,
Поэтому Папа не придёт
B. init у Папы private,
поэтому Папа не придёт
C. Не может быть больше, чем один
init method – Папа не придёт
D. init method переопределён у
сына, поэтому папа не придёт
E. Папа придёт
Папа точно придёт
Аннотации спринга в наследовании
public class Parent {
@PostConstruct
private void init(){
System.out.println("Папа");
}
}
@Component
public class Son extends Parent {
@PostConstruct
public void init(){
System.out.println("Cын");
}
}
Создаём сына, что с папой?
A. @PostConstruct не inherited,
Поэтому Папа не придёт
B. init у Папы private,
поэтому Папа не придёт
C. Не может быть больше, чем один
init method – Папа не придёт
D. init method переопределён у
сына, поэтому папа не придёт
E. Папа придёт
@Service
public class JavadayServiceImpl implements JavadayConfService {
@Autowired
private String cityName;
@Audit
public void pay() {
…
}
@PostConstruct
public void init(){
…
}
}
Добавляем наш @Audit
A. Не сработает init method
B. NoSuchBeanDefinitionException
C. Упадёт Autowired из за то, что у
прокси нет нужного филда
D. Не сработает аспект
E. Всё будет хорошо
context.getBean(JavadayConfService.class).pay();
@Service
public class JavadayServiceImpl implements JavadayConfService {
@Autowired
private String cityName;
@Audit
public void pay() {
…
}
@PostConstruct
public void init(){
System.out.println(cityName);
}
}
Добавляем наш @Audit
A. Не сработает init method
B. NoSuchBeanDefinitionException
C. Упадёт Autowired из за то, что у
прокси нет нужного филда
D. Не сработает аспект
E. Всё будет хорошо
context.getBean(JavadayConfService.class).pay();
Как мы это чиним?
• Прокси надо делать после инит методов!
• Для это есть postProcessAfterInit
@Component
@Aspect
public class PayInformatorAspect {
@Pointcut("execution(* javaday..*.pay*(..))")
public void allPayMethods(){}
@After("allPayMethods()")
public void sendMailToAndrey(){
System.out.println("Ещё билет продали");
}
}
Добавим Аспект
A. Андрей получит извещение о проданном билете, но не аудита
B. Аудит будет, но Андрей не узнает о проданном билете
C. Будет аудит и Андрей получит извещение
D. Будет exception из-за двухуровневого прокси
Как мы это чиним?
• Пишем нормальный BPP, который не делает
bean.getClass()
Подключаем транзакции Cпринга
@Retention(RetentionPolicy.RUNTIME)
@Transactional
public @interface JavadayTransaction {
Propagation propagation() default Propagation.REQUIRES_NEW;
}
@JavadayTransaction
public class JavadayConfService {
public void transferMoney(Account from, Account to, BigDecimal amount) {
withdraw(from, amount);
deposit(to, amount);
}
@Transactional(propagation = Propagation.MANDATORY)
private void withdraw(Account from, BigDecimal amount) {
//some code here
}
@Transactional(propagation = Propagation.REQUIRED)
private void deposit(Account to, BigDecimal amount) {
//some code here
informBankManager(amount);
}
private void informBankManager(BigDecimal amount) {
//some code here
}
}
Вложенные транзакции
C. Откатится до начала
метода deposit
D. Метод withdraw
кинет exception
A. Всё откатится
до самого начала
B. Откатится только
informBankManager
Случился exception
в методе
informBankManager.
Что будет?
Почему не работает??
@Service
public class JavadayConfServiceImpl implements JavadayConfService {
@Transactional
public void transferMoney(Account from, Account to, BigDecimal amount)
…
informAboutPayment();
}
@Override
@Transactional(requiresNew = true)
public void informAboutPayment() {
System.out.println("money were transferred");
}
}
Почему не работает??
@Service
public class JavadayConfServiceImpl implements JavadayConfService {
@Transactional
public void transferMoney(Account from, Account to, BigDecimal amount)
…
this.informAboutPayment();
}
@Override
@Transactional(requiresNew = true)
public void informAboutPayment() {
System.out.println("money were transferred");
}
}
Самовпрыскивание
Самовпрыскивание. Как сделать?
A. @Autowired
B. @Inject
C. @Resource
D. Что за бред?! Это невозможно!
4 Года назад им открыли джиру
У Cпринга 4 года, а сколько надо?
A. 4 часа
B. 4 дня
C. 4 минуты
D. 4 секунды
Разогреваем Cache
@Service
public class JavadayServiceImpl implements JavadayConfService
{
@Transactional
@PostConstruct
public void warmCache() {
…
}
@Override
public void processPayment() {
…
}
}
@Transactional @PostConstruct
• Что будет, с методом у которого обе аннотации?
A. Сработает с транзакцией
B. Сработает без транзакции
C. Не сработает вообще
D. MethodMissingException
ApplicationListener
• Решаем своей аннотацией @PostInitialize
Трёхфазовый конструктор
• Constructor
• @PostConstruct
• @PostInitialize
Чего не будет в BeanDefinition-e?
@Bean
@Scope("singleton")
public String str() {
return “WTF";
} A. Scope
B. Bean name
C. BeanClass
D. Всё будет
@PostInitialize
String[] names = context.getBeanDefinitionNames();
for (String name : names) {
BeanDefinition beanDefinition =
factory.getBeanDefinition(name);
String beanClassName = beanDefinition.getBeanClassName();
try {
Class<?> originalBeanClass = Class.forName(beanClassName);
Но ведь не так же…
String[] names = context.getBeanDefinitionNames();
for (String name : names) {
BeanDefinition beanDefinition = factory.getBeanDefinition(name);
String beanClassName = beanDefinition.getBeanClassName();
try {
if (beanClassName == null) {
continue;
}
Class<?> originalBeanClass = Class.forName(beanClassName);
Сделаем по-взрослому
A. 4 минуты
B. 3 минуты
C. 2 минуты
D. 1 минуты
СТРАШНЫЕ ИСТОРИИ
МАЛЬЧИК, КОТОРЫЙ НЕ ЛЮБИЛ
ИНТЕРФЕЙСЫ
Добавляем Serializable…
A. NoSuchBeanDefinitionException
B. No proxies (Will work without Aspect)
C. NoSuchMethodException
D. All OK
я ж казав працює
Добавляем Comparable…
A. NoSuchBeanDefinitionException
B. No proxies (Will work without Aspect)
C. NoSuchMethodException
D. All OK
Как мы это чиним?
• Прививаем
любовь к интерфейсам
ДЕВОЧКА, КОТОРАЯ ХОТЕЛА СДЕЛАТЬ
НАДЕЖНО
Что будет?
@Service
public class MissionCriticalService {
@PostConstruct
public void important(){
System.out.println("Не забудь выключить утюг!");
}
}
<bean class="javaday.littlegirl.MissionCriticalService"/>
<context:component-scan base-package=“javaday.littlegirl"/>
@Bean
public MissionCriticalService missionCriticalService() {
return new MissionCriticalService();
}
A. не забыть выключить
утюг
B. не забыть выключить
утюг *2
C. не забыть выключить
утюг *3
D. BeanCreationException
Смотрим!
@Service
public class MissionCriticalService {
@PostConstruct
public void important(){
System.out.println("Не забудь выключить утюг!");
}
}
<bean class=“javaday.littlegirl.MissionCriticalService"/>
<context:component-scan base-package="javaday.littlegirl"/>
@Bean
public MissionCriticalService missionCriticalService() {
return new MissionCriticalService();
}
Выводы
1. Учите спринг!
2. Читайте документацию
3. Иногда это баги, И Иногда их
можно починить
4. Пользуйте spring integration в
intellij IDEA!
5. Учите спринг, Я сказал!
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

More Related Content

What's hot

Unit тестирование
Unit тестированиеUnit тестирование
Unit тестированиеMaxim Volchenko
 
Spring Boot Test horror
Spring Boot Test horrorSpring Boot Test horror
Spring Boot Test horror
Кирилл Толкачёв
 
Easy selenium test automation on python
Easy selenium test automation on pythonEasy selenium test automation on python
Easy selenium test automation on python
Mykhailo Poliarush
 
Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)
Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)
Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)
SQALab
 
Curse of spring boot test
Curse of spring boot testCurse of spring boot test
Curse of spring boot test
Кирилл Толкачёв
 
Применение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовПрименение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектов
PyNSK
 
Practical usage of RxJava 2
Practical usage of RxJava 2Practical usage of RxJava 2
Practical usage of RxJava 2
Evgeniy Vinogradniy
 
Ubuntu+python+selenium=легкий старт
Ubuntu+python+selenium=легкий стартUbuntu+python+selenium=легкий старт
Ubuntu+python+selenium=легкий старт
Andrey Matukhno
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Noveo
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
Alexander Kucherenko
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Noveo
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
Maxim Kulsha
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть II
Python Meetup
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
Илья Кожухов
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
QA Dnepropetrovsk Community (Ukraine)
 
Про асинхронное сетевое программирование
Про асинхронное сетевое программированиеПро асинхронное сетевое программирование
Про асинхронное сетевое программирование
Python Meetup
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - Multithreading
Noveo
 
Фреймворк Akka и его использование в Яндексе
Фреймворк Akka и его использование в ЯндексеФреймворк Akka и его использование в Яндексе
Фреймворк Akka и его использование в Яндексе
Vadim Tsesko
 

What's hot (20)

Unit тестирование
Unit тестированиеUnit тестирование
Unit тестирование
 
Spring Boot Test horror
Spring Boot Test horrorSpring Boot Test horror
Spring Boot Test horror
 
Easy selenium test automation on python
Easy selenium test automation on pythonEasy selenium test automation on python
Easy selenium test automation on python
 
Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)
Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)
Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)
 
Curse of spring boot test
Curse of spring boot testCurse of spring boot test
Curse of spring boot test
 
Применение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектовПрименение behave+webdriver для тестирования Web-проектов
Применение behave+webdriver для тестирования Web-проектов
 
Practical usage of RxJava 2
Practical usage of RxJava 2Practical usage of RxJava 2
Practical usage of RxJava 2
 
Ubuntu+python+selenium=легкий старт
Ubuntu+python+selenium=легкий стартUbuntu+python+selenium=легкий старт
Ubuntu+python+selenium=легкий старт
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
 
Selenium vs AJAX
Selenium vs AJAXSelenium vs AJAX
Selenium vs AJAX
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть II
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
 
Про асинхронное сетевое программирование
Про асинхронное сетевое программированиеПро асинхронное сетевое программирование
Про асинхронное сетевое программирование
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - Multithreading
 
Фреймворк Akka и его использование в Яндексе
Фреймворк Akka и его использование в ЯндексеФреймворк Akka и его использование в Яндексе
Фреймворк Akka и его использование в Яндексе
 

Viewers also liked

Next Generation Customer
Next Generation CustomerNext Generation Customer
Next Generation Customer
aixigo AG
 
Cualidades del personal del futuro
Cualidades del personal del futuroCualidades del personal del futuro
Cualidades del personal del futuro
parc21
 
333413629 ada-3
333413629 ada-3333413629 ada-3
333413629 ada-3
Michelle Warner
 
безсмертна пам’ять
безсмертна      пам’ятьбезсмертна      пам’ять
безсмертна пам’ять
kilobajt
 
Four hands
Four handsFour hands
Four hands
StuartMMills
 
Disturbios de aprendizagem
Disturbios de aprendizagemDisturbios de aprendizagem
Disturbios de aprendizagem
Beneditaarruda
 
Menús de raciones 2016 Restaurante Manolín de Valladolid
Menús de raciones 2016 Restaurante Manolín de ValladolidMenús de raciones 2016 Restaurante Manolín de Valladolid
Menús de raciones 2016 Restaurante Manolín de Valladolid
Restaurante Manolín Valladolid
 
Financial Portfolio Management with Java on Steroids - JAX Finance 2016
Financial Portfolio Management with Java on Steroids - JAX Finance 2016Financial Portfolio Management with Java on Steroids - JAX Finance 2016
Financial Portfolio Management with Java on Steroids - JAX Finance 2016
aixigo AG
 
Solr Schema in Multi Tenant Platform
Solr Schema in Multi Tenant PlatformSolr Schema in Multi Tenant Platform
Solr Schema in Multi Tenant Platform
BloomReach
 
情報幾何学 #2.4
情報幾何学 #2.4情報幾何学 #2.4
情報幾何学 #2.4
Taketo Sano
 
MinRole and SharePoint 2016
MinRole and SharePoint 2016MinRole and SharePoint 2016
MinRole and SharePoint 2016
InnoTech
 
Screen play
Screen playScreen play
Screen play
Zara Iqbal
 

Viewers also liked (14)

Next Generation Customer
Next Generation CustomerNext Generation Customer
Next Generation Customer
 
Cualidades del personal del futuro
Cualidades del personal del futuroCualidades del personal del futuro
Cualidades del personal del futuro
 
333413629 ada-3
333413629 ada-3333413629 ada-3
333413629 ada-3
 
безсмертна пам’ять
безсмертна      пам’ятьбезсмертна      пам’ять
безсмертна пам’ять
 
Four hands
Four handsFour hands
Four hands
 
Disturbios de aprendizagem
Disturbios de aprendizagemDisturbios de aprendizagem
Disturbios de aprendizagem
 
Menús de raciones 2016 Restaurante Manolín de Valladolid
Menús de raciones 2016 Restaurante Manolín de ValladolidMenús de raciones 2016 Restaurante Manolín de Valladolid
Menús de raciones 2016 Restaurante Manolín de Valladolid
 
Enzymen 1e deel
Enzymen 1e deelEnzymen 1e deel
Enzymen 1e deel
 
Financial Portfolio Management with Java on Steroids - JAX Finance 2016
Financial Portfolio Management with Java on Steroids - JAX Finance 2016Financial Portfolio Management with Java on Steroids - JAX Finance 2016
Financial Portfolio Management with Java on Steroids - JAX Finance 2016
 
Enzymen regulatie
Enzymen regulatieEnzymen regulatie
Enzymen regulatie
 
Solr Schema in Multi Tenant Platform
Solr Schema in Multi Tenant PlatformSolr Schema in Multi Tenant Platform
Solr Schema in Multi Tenant Platform
 
情報幾何学 #2.4
情報幾何学 #2.4情報幾何学 #2.4
情報幾何学 #2.4
 
MinRole and SharePoint 2016
MinRole and SharePoint 2016MinRole and SharePoint 2016
MinRole and SharePoint 2016
 
Screen play
Screen playScreen play
Screen play
 

Similar to Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Страх и ненависть в Event Bus
Страх и ненависть в Event BusСтрах и ненависть в Event Bus
Страх и ненависть в Event Bus
0leGG
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»
DevDay
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
Aleksandr Tarasov
 
О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?
Tatyanazaxarova
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Sergey Platonov
 
Cоздание приложений со знанием Perl
Cоздание приложений со знанием PerlCоздание приложений со знанием Perl
Cоздание приложений со знанием Perl
Anatoly Sharifulin
 
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the ParenthesesThe Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
JavaDayUA
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
Andrey Bibichev
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
Alexander Shigin
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
Andrey Karpov
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
Andrey Karpov
 
Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0
matroskin1980
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons Learned
Aleksandr Tarasov
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
Dmytro Chyzhykov
 
Design Principles
Design PrinciplesDesign Principles
Design Principles
Alexander Konduforov
 
Codeception Introduction
Codeception IntroductionCodeception Introduction
Codeception Introduction
automated-testing.info
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
 

Similar to Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky (20)

Страх и ненависть в Event Bus
Страх и ненависть в Event BusСтрах и ненависть в Event Bus
Страх и ненависть в Event Bus
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Cоздание приложений со знанием Perl
Cоздание приложений со знанием PerlCоздание приложений со знанием Perl
Cоздание приложений со знанием Perl
 
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the ParenthesesThe Epic Groovy Puzzlers S02: The Revenge of the Parentheses
The Epic Groovy Puzzlers S02: The Revenge of the Parentheses
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons Learned
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Design Principles
Design PrinciplesDesign Principles
Design Principles
 
Codeception Introduction
Codeception IntroductionCodeception Introduction
Codeception Introduction
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 

More from JavaDayUA

STEMing Kids: One workshop at a time
STEMing Kids: One workshop at a timeSTEMing Kids: One workshop at a time
STEMing Kids: One workshop at a time
JavaDayUA
 
Flavors of Concurrency in Java
Flavors of Concurrency in JavaFlavors of Concurrency in Java
Flavors of Concurrency in Java
JavaDayUA
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
JavaDayUA
 
Continuously building, releasing and deploying software: The Revenge of the M...
Continuously building, releasing and deploying software: The Revenge of the M...Continuously building, releasing and deploying software: The Revenge of the M...
Continuously building, releasing and deploying software: The Revenge of the M...
JavaDayUA
 
20 Years of Java
20 Years of Java20 Years of Java
20 Years of Java
JavaDayUA
 
How to get the most out of code reviews
How to get the most out of code reviewsHow to get the most out of code reviews
How to get the most out of code reviews
JavaDayUA
 
Unlocking the Magic of Monads with Java 8
Unlocking the Magic of Monads with Java 8Unlocking the Magic of Monads with Java 8
Unlocking the Magic of Monads with Java 8
JavaDayUA
 
Virtual Private Cloud with container technologies for DevOps
Virtual Private Cloud with container technologies for DevOpsVirtual Private Cloud with container technologies for DevOps
Virtual Private Cloud with container technologies for DevOps
JavaDayUA
 
JShell: An Interactive Shell for the Java Platform
JShell: An Interactive Shell for the Java PlatformJShell: An Interactive Shell for the Java Platform
JShell: An Interactive Shell for the Java Platform
JavaDayUA
 
Interactive Java Support to your tool -- The JShell API and Architecture
Interactive Java Support to your tool -- The JShell API and ArchitectureInteractive Java Support to your tool -- The JShell API and Architecture
Interactive Java Support to your tool -- The JShell API and Architecture
JavaDayUA
 
MapDB - taking Java collections to the next level
MapDB - taking Java collections to the next levelMapDB - taking Java collections to the next level
MapDB - taking Java collections to the next level
JavaDayUA
 
Save Java memory
Save Java memorySave Java memory
Save Java memory
JavaDayUA
 
Design rationales in the JRockit JVM
Design rationales in the JRockit JVMDesign rationales in the JRockit JVM
Design rationales in the JRockit JVM
JavaDayUA
 
Next-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
Next-gen DevOps engineering with Docker and Kubernetes by Antons KrangaNext-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
Next-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
JavaDayUA
 
Apache Cassandra. Inception - all you need to know by Mikhail Dubkov
Apache Cassandra. Inception - all you need to know by Mikhail DubkovApache Cassandra. Inception - all you need to know by Mikhail Dubkov
Apache Cassandra. Inception - all you need to know by Mikhail Dubkov
JavaDayUA
 
Solution Architecture tips & tricks by Roman Shramkov
Solution Architecture tips & tricks by Roman ShramkovSolution Architecture tips & tricks by Roman Shramkov
Solution Architecture tips & tricks by Roman Shramkov
JavaDayUA
 
Testing in Legacy: from Rags to Riches by Taras Slipets
Testing in Legacy: from Rags to Riches by Taras SlipetsTesting in Legacy: from Rags to Riches by Taras Slipets
Testing in Legacy: from Rags to Riches by Taras Slipets
JavaDayUA
 
Reactive programming and Hystrix fault tolerance by Max Myslyvtsev
Reactive programming and Hystrix fault tolerance by Max MyslyvtsevReactive programming and Hystrix fault tolerance by Max Myslyvtsev
Reactive programming and Hystrix fault tolerance by Max Myslyvtsev
JavaDayUA
 
Spark-driven audience counting by Boris Trofimov
Spark-driven audience counting by Boris TrofimovSpark-driven audience counting by Boris Trofimov
Spark-driven audience counting by Boris Trofimov
JavaDayUA
 
API first with Swagger and Scala by Slava Schmidt
API first with Swagger and Scala by  Slava SchmidtAPI first with Swagger and Scala by  Slava Schmidt
API first with Swagger and Scala by Slava Schmidt
JavaDayUA
 

More from JavaDayUA (20)

STEMing Kids: One workshop at a time
STEMing Kids: One workshop at a timeSTEMing Kids: One workshop at a time
STEMing Kids: One workshop at a time
 
Flavors of Concurrency in Java
Flavors of Concurrency in JavaFlavors of Concurrency in Java
Flavors of Concurrency in Java
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 
Continuously building, releasing and deploying software: The Revenge of the M...
Continuously building, releasing and deploying software: The Revenge of the M...Continuously building, releasing and deploying software: The Revenge of the M...
Continuously building, releasing and deploying software: The Revenge of the M...
 
20 Years of Java
20 Years of Java20 Years of Java
20 Years of Java
 
How to get the most out of code reviews
How to get the most out of code reviewsHow to get the most out of code reviews
How to get the most out of code reviews
 
Unlocking the Magic of Monads with Java 8
Unlocking the Magic of Monads with Java 8Unlocking the Magic of Monads with Java 8
Unlocking the Magic of Monads with Java 8
 
Virtual Private Cloud with container technologies for DevOps
Virtual Private Cloud with container technologies for DevOpsVirtual Private Cloud with container technologies for DevOps
Virtual Private Cloud with container technologies for DevOps
 
JShell: An Interactive Shell for the Java Platform
JShell: An Interactive Shell for the Java PlatformJShell: An Interactive Shell for the Java Platform
JShell: An Interactive Shell for the Java Platform
 
Interactive Java Support to your tool -- The JShell API and Architecture
Interactive Java Support to your tool -- The JShell API and ArchitectureInteractive Java Support to your tool -- The JShell API and Architecture
Interactive Java Support to your tool -- The JShell API and Architecture
 
MapDB - taking Java collections to the next level
MapDB - taking Java collections to the next levelMapDB - taking Java collections to the next level
MapDB - taking Java collections to the next level
 
Save Java memory
Save Java memorySave Java memory
Save Java memory
 
Design rationales in the JRockit JVM
Design rationales in the JRockit JVMDesign rationales in the JRockit JVM
Design rationales in the JRockit JVM
 
Next-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
Next-gen DevOps engineering with Docker and Kubernetes by Antons KrangaNext-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
Next-gen DevOps engineering with Docker and Kubernetes by Antons Kranga
 
Apache Cassandra. Inception - all you need to know by Mikhail Dubkov
Apache Cassandra. Inception - all you need to know by Mikhail DubkovApache Cassandra. Inception - all you need to know by Mikhail Dubkov
Apache Cassandra. Inception - all you need to know by Mikhail Dubkov
 
Solution Architecture tips & tricks by Roman Shramkov
Solution Architecture tips & tricks by Roman ShramkovSolution Architecture tips & tricks by Roman Shramkov
Solution Architecture tips & tricks by Roman Shramkov
 
Testing in Legacy: from Rags to Riches by Taras Slipets
Testing in Legacy: from Rags to Riches by Taras SlipetsTesting in Legacy: from Rags to Riches by Taras Slipets
Testing in Legacy: from Rags to Riches by Taras Slipets
 
Reactive programming and Hystrix fault tolerance by Max Myslyvtsev
Reactive programming and Hystrix fault tolerance by Max MyslyvtsevReactive programming and Hystrix fault tolerance by Max Myslyvtsev
Reactive programming and Hystrix fault tolerance by Max Myslyvtsev
 
Spark-driven audience counting by Boris Trofimov
Spark-driven audience counting by Boris TrofimovSpark-driven audience counting by Boris Trofimov
Spark-driven audience counting by Boris Trofimov
 
API first with Swagger and Scala by Slava Schmidt
API first with Swagger and Scala by  Slava SchmidtAPI first with Swagger and Scala by  Slava Schmidt
API first with Swagger and Scala by Slava Schmidt
 

Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

  • 8. Похоже, но не совсем 1. ВесЕлые загадки 2. Меньше хи-хи, больше хардкора! 3. Вы все равно голосуете! 4. Спасибо jug.ua за призы
  • 9.
  • 10.
  • 11. Аннотации Спринга в наследовании implements extends extends
  • 12. Аннотации Cпринга в наследовании public class Parent { @PostConstruct private void init(){ System.out.println("Папа"); } } @Component public class Son extends Parent { @PostConstruct public void init(){ System.out.println("Cын"); } } Создаём сына, что с папой? A. @PostConstruct не inherited, Поэтому Папа не придёт B. init у Папы private, поэтому Папа не придёт C. Не может быть больше, чем один init method – Папа не придёт D. init method переопределён у сына, поэтому папа не придёт E. Папа придёт
  • 14. Аннотации спринга в наследовании public class Parent { @PostConstruct private void init(){ System.out.println("Папа"); } } @Component public class Son extends Parent { @PostConstruct public void init(){ System.out.println("Cын"); } } Создаём сына, что с папой? A. @PostConstruct не inherited, Поэтому Папа не придёт B. init у Папы private, поэтому Папа не придёт C. Не может быть больше, чем один init method – Папа не придёт D. init method переопределён у сына, поэтому папа не придёт E. Папа придёт
  • 15.
  • 16. @Service public class JavadayServiceImpl implements JavadayConfService { @Autowired private String cityName; @Audit public void pay() { … } @PostConstruct public void init(){ … } } Добавляем наш @Audit A. Не сработает init method B. NoSuchBeanDefinitionException C. Упадёт Autowired из за то, что у прокси нет нужного филда D. Не сработает аспект E. Всё будет хорошо context.getBean(JavadayConfService.class).pay();
  • 17.
  • 18. @Service public class JavadayServiceImpl implements JavadayConfService { @Autowired private String cityName; @Audit public void pay() { … } @PostConstruct public void init(){ System.out.println(cityName); } } Добавляем наш @Audit A. Не сработает init method B. NoSuchBeanDefinitionException C. Упадёт Autowired из за то, что у прокси нет нужного филда D. Не сработает аспект E. Всё будет хорошо context.getBean(JavadayConfService.class).pay();
  • 19. Как мы это чиним? • Прокси надо делать после инит методов! • Для это есть postProcessAfterInit
  • 20. @Component @Aspect public class PayInformatorAspect { @Pointcut("execution(* javaday..*.pay*(..))") public void allPayMethods(){} @After("allPayMethods()") public void sendMailToAndrey(){ System.out.println("Ещё билет продали"); } } Добавим Аспект A. Андрей получит извещение о проданном билете, но не аудита B. Аудит будет, но Андрей не узнает о проданном билете C. Будет аудит и Андрей получит извещение D. Будет exception из-за двухуровневого прокси
  • 21.
  • 22. Как мы это чиним? • Пишем нормальный BPP, который не делает bean.getClass()
  • 23.
  • 24.
  • 25. Подключаем транзакции Cпринга @Retention(RetentionPolicy.RUNTIME) @Transactional public @interface JavadayTransaction { Propagation propagation() default Propagation.REQUIRES_NEW; }
  • 26. @JavadayTransaction public class JavadayConfService { public void transferMoney(Account from, Account to, BigDecimal amount) { withdraw(from, amount); deposit(to, amount); } @Transactional(propagation = Propagation.MANDATORY) private void withdraw(Account from, BigDecimal amount) { //some code here } @Transactional(propagation = Propagation.REQUIRED) private void deposit(Account to, BigDecimal amount) { //some code here informBankManager(amount); } private void informBankManager(BigDecimal amount) { //some code here } } Вложенные транзакции C. Откатится до начала метода deposit D. Метод withdraw кинет exception A. Всё откатится до самого начала B. Откатится только informBankManager Случился exception в методе informBankManager. Что будет?
  • 27.
  • 28. Почему не работает?? @Service public class JavadayConfServiceImpl implements JavadayConfService { @Transactional public void transferMoney(Account from, Account to, BigDecimal amount) … informAboutPayment(); } @Override @Transactional(requiresNew = true) public void informAboutPayment() { System.out.println("money were transferred"); } }
  • 29. Почему не работает?? @Service public class JavadayConfServiceImpl implements JavadayConfService { @Transactional public void transferMoney(Account from, Account to, BigDecimal amount) … this.informAboutPayment(); } @Override @Transactional(requiresNew = true) public void informAboutPayment() { System.out.println("money were transferred"); } }
  • 30.
  • 31.
  • 33. Самовпрыскивание. Как сделать? A. @Autowired B. @Inject C. @Resource D. Что за бред?! Это невозможно!
  • 34.
  • 35. 4 Года назад им открыли джиру
  • 36. У Cпринга 4 года, а сколько надо? A. 4 часа B. 4 дня C. 4 минуты D. 4 секунды
  • 38. @Service public class JavadayServiceImpl implements JavadayConfService { @Transactional @PostConstruct public void warmCache() { … } @Override public void processPayment() { … } }
  • 39. @Transactional @PostConstruct • Что будет, с методом у которого обе аннотации? A. Сработает с транзакцией B. Сработает без транзакции C. Не сработает вообще D. MethodMissingException
  • 40.
  • 41. ApplicationListener • Решаем своей аннотацией @PostInitialize
  • 43. Чего не будет в BeanDefinition-e? @Bean @Scope("singleton") public String str() { return “WTF"; } A. Scope B. Bean name C. BeanClass D. Всё будет
  • 44.
  • 45. @PostInitialize String[] names = context.getBeanDefinitionNames(); for (String name : names) { BeanDefinition beanDefinition = factory.getBeanDefinition(name); String beanClassName = beanDefinition.getBeanClassName(); try { Class<?> originalBeanClass = Class.forName(beanClassName);
  • 46. Но ведь не так же… String[] names = context.getBeanDefinitionNames(); for (String name : names) { BeanDefinition beanDefinition = factory.getBeanDefinition(name); String beanClassName = beanDefinition.getBeanClassName(); try { if (beanClassName == null) { continue; } Class<?> originalBeanClass = Class.forName(beanClassName);
  • 47. Сделаем по-взрослому A. 4 минуты B. 3 минуты C. 2 минуты D. 1 минуты
  • 49. МАЛЬЧИК, КОТОРЫЙ НЕ ЛЮБИЛ ИНТЕРФЕЙСЫ
  • 50. Добавляем Serializable… A. NoSuchBeanDefinitionException B. No proxies (Will work without Aspect) C. NoSuchMethodException D. All OK
  • 51. я ж казав працює
  • 52. Добавляем Comparable… A. NoSuchBeanDefinitionException B. No proxies (Will work without Aspect) C. NoSuchMethodException D. All OK
  • 53.
  • 54. Как мы это чиним? • Прививаем любовь к интерфейсам
  • 55. ДЕВОЧКА, КОТОРАЯ ХОТЕЛА СДЕЛАТЬ НАДЕЖНО
  • 56. Что будет? @Service public class MissionCriticalService { @PostConstruct public void important(){ System.out.println("Не забудь выключить утюг!"); } } <bean class="javaday.littlegirl.MissionCriticalService"/> <context:component-scan base-package=“javaday.littlegirl"/> @Bean public MissionCriticalService missionCriticalService() { return new MissionCriticalService(); } A. не забыть выключить утюг B. не забыть выключить утюг *2 C. не забыть выключить утюг *3 D. BeanCreationException
  • 57.
  • 58. Смотрим! @Service public class MissionCriticalService { @PostConstruct public void important(){ System.out.println("Не забудь выключить утюг!"); } } <bean class=“javaday.littlegirl.MissionCriticalService"/> <context:component-scan base-package="javaday.littlegirl"/> @Bean public MissionCriticalService missionCriticalService() { return new MissionCriticalService(); }
  • 59. Выводы 1. Учите спринг! 2. Читайте документацию 3. Иногда это баги, И Иногда их можно починить 4. Пользуйте spring integration в intellij IDEA! 5. Учите спринг, Я сказал!