spring puzzlers by evgeny borisov, baruch sadogursky

60
The Spring Puzzlers: Начало…

Upload: javadayua

Post on 06-Jan-2017

414 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

The Spring Puzzlers:

Начало…

Page 2: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Ты кто такой?

linkedin.com/in/evborisov

Page 3: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Ты кто такой?

linkd.in/jbaruch

stackoverflow.com/users/402053/jbaruch

Page 4: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Вместе мы:

Page 5: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Свистнули идейку:

Page 6: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Свистнули идейку:

Page 7: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Свистнули идейку:

Page 8: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Похоже, но не совсем

1. ВесЕлые загадки

2. Меньше хи-хи, больше

хардкора!

3. Вы все равно голосуете!

4. Спасибо jug.ua за призы

Page 9: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 10: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 11: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Аннотации Спринга в наследовании

implements

extends

extends

Page 12: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Аннотации 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. Папа придёт

Page 13: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Папа точно придёт

Page 14: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Аннотации спринга в наследовании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. Папа придёт

Page 15: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 16: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

@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();

Page 17: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 18: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

@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();

Page 19: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Как мы это чиним?

• Прокси надо делать после инит методов!

• Для это есть postProcessAfterInit

Page 20: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

@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 из-за двухуровневого прокси

Page 21: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 22: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Как мы это чиним?

• Пишем нормальный BPP, который не делает bean.getClass()

Page 23: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 24: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 25: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Подключаем транзакции Cпринга

@Retention(RetentionPolicy.RUNTIME)

@Transactional

public @interface JavadayTransaction {

Propagation propagation() default Propagation.REQUIRES_NEW;

}

Page 26: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

@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. Что будет?

Page 27: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 28: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Почему не работает??@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");

}

}

Page 29: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Почему не работает??@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");

}

}

Page 30: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 31: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 32: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Самовпрыскивание

Page 33: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Самовпрыскивание. Как сделать?

A. @Autowired

B. @Inject

C. @Resource

D. Что за бред?! Это невозможно!

Page 34: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 35: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

4 Года назад им открыли джиру

Page 36: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

У Cпринга 4 года, а сколько надо?

A. 4 часа

B. 4 дня

C. 4 минуты

D. 4 секунды

Page 37: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Разогреваем Cache

Page 38: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

@Service

public class JavadayServiceImpl implements JavadayConfService

{

@Transactional

@PostConstruct

public void warmCache() {

}

@Override

public void processPayment() {

}

}

Page 39: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

@Transactional @PostConstruct

• Что будет, с методом у которого обе аннотации?

A. Сработает с транзакцией

B. Сработает без транзакции

C. Не сработает вообще

D. MethodMissingException

Page 40: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 41: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

ApplicationListener

• Решаем своей аннотацией @PostInitialize

Page 42: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Трёхфазовый конструктор

• Constructor

• @PostConstruct

• @PostInitialize

Page 43: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Чего не будет в BeanDefinition-e?

@Bean

@Scope("singleton")

public String str() {

return “WTF";

} A. Scope

B. Bean name

C. BeanClass

D. Всё будет

Page 44: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 45: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

@PostInitialize

String[] names = context.getBeanDefinitionNames();

for (String name : names) {

BeanDefinition beanDefinition =

factory.getBeanDefinition(name);

String beanClassName = beanDefinition.getBeanClassName();

try {

Class<?> originalBeanClass = Class.forName(beanClassName);

Page 46: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Но ведь не так же…

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);

Page 47: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Сделаем по-взрослому

A. 4 минуты

B. 3 минуты

C. 2 минуты

D. 1 минуты

Page 48: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

СТРАШНЫЕ ИСТОРИИ

Page 49: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

МАЛЬЧИК, КОТОРЫЙ НЕ ЛЮБИЛ ИНТЕРФЕЙСЫ

Page 50: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Добавляем Serializable…

A. NoSuchBeanDefinitionException

B. No proxies (Will work without Aspect)

C. NoSuchMethodException

D. All OK

Page 51: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

я ж казав працює

Page 52: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Добавляем Comparable…

A. NoSuchBeanDefinitionException

B. No proxies (Will work without Aspect)

C. NoSuchMethodException

D. All OK

Page 53: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 54: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Как мы это чиним?

• Прививаемлюбовь к интерфейсам

Page 55: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

ДЕВОЧКА, КОТОРАЯ ХОТЕЛА СДЕЛАТЬ НАДЕЖНО

Page 56: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Что будет?

@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

Page 57: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Page 58: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Смотрим!

@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();

}

Page 59: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky

Выводы

1. Учите спринг!

2. Читайте документацию

3. Иногда это баги, И Иногда их можно починить

4. Пользуйте spring integration в intellij IDEA!

5. Учите спринг, Я сказал!

Page 60: Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky