53
The Spring Puzzlers: Начало.

Spring puzzlers

Embed Size (px)

Citation preview

Page 1: Spring puzzlers

The Spring Puzzlers:

Начало.

Page 2: Spring puzzlers

Ты кто такой?

linkd.in/jbaruch

stackoverflow.com/users/402053/jbaruch

Page 3: Spring puzzlers

Ты кто такой?

linkedin.com/in/evborisov

Page 4: Spring puzzlers

Вместе мы:

Page 5: Spring puzzlers

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

Page 6: Spring puzzlers

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

Page 7: Spring puzzlers

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

Page 8: Spring puzzlers

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

Page 9: Spring puzzlers

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

1. Все еще Два клевых пацана на сцене

2. Меньше хи-хи, больше хардкора!

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

4. Спасибо dataart, luxoft, eleks, и infusion за призы!

Page 10: Spring puzzlers
Page 11: Spring puzzlers
Page 12: Spring puzzlers

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

implements

extends

extends

Page 13: Spring puzzlers

Аннотации 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 14: Spring puzzlers

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

Page 15: Spring puzzlers

Аннотации спринга в наследовании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 16: Spring puzzlers
Page 17: Spring puzzlers

@Service

public class JEEConfServiceImpl implements JEEConfService {

@Autowired

private String conference;

@Audit

public void pay() {

}

@PostConstruct

public void setup(){

}

}

Добавляем наш @Audit

A. Не сработает setup method

B. NoSuchBeanDefinitionException

C. Упадёт Autowired из за то, что у прокси нет нужного филда

D. Всё будет хорошоcontext.getBean(JEEConfService.class).pay();

Page 18: Spring puzzlers
Page 19: Spring puzzlers

@Service

public class JEEConfServiceImpl implements

JEEConfService {

@Autowired

private String conference;

@Audit

public void pay() {

}

@PostConstruct

public void setup(){

System.out.println(conference);

}

}

Добавляем наш @Audit

A. Не сработает setup method

B. NoSuchBeanDefinitionException

C. Упадёт Autowired из за то, что у прокси нет нужного филда

D. Всё будет хорошоcontext.getBean(JEEConfService.class).pay();

Page 20: Spring puzzlers

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

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

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

Page 21: Spring puzzlers

@Component

@Aspect

public class PayInformatorAspect {

@Pointcut("execution(* jeeconf..*.pay*(..))")

public void allPayMethods(){}

@After("allPayMethods()")

public void sendMailToAlimenkov(){

System.out.println("Ещё билет продали");

}

}

Добавим Аспект

A. Алименков получит извещение о проданном билете, но не аудита

B. Аудит будет, но Алименков не узнает о проданном билете

C. Будет аудит и Алименков получит извещение

D. Будет exception из-за двухуровневого прокси

Page 22: Spring puzzlers
Page 23: Spring puzzlers

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

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

Page 24: Spring puzzlers

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

@Retention(RetentionPolicy.RUNTIME)

@Transactional

public @interface JEEConfTransaction {

Propagation propagation() default Propagation.REQUIRES_NEW;

}

Page 25: Spring puzzlers

@JEEConfTransaction

public class JEEConfService {

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 26: Spring puzzlers
Page 27: Spring puzzlers

Почему не работает??@Service

public class JEEConfServiceImpl implements JEEConfService {

@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 28: Spring puzzlers

Почему не работает??@Service

public class JEEConfServiceImpl implements JEEConfService {

@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 29: Spring puzzlers

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

Page 30: Spring puzzlers

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

A. @Autowired

B. @Inject

C. @Resource

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

Page 31: Spring puzzlers
Page 32: Spring puzzlers

У Cпринга 4 года, а у нас?

A. 4 часа

B. 4 дня

C. 4 минуты

D. 4 секунды

Page 33: Spring puzzlers

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

Page 34: Spring puzzlers

@Service

public class JEEConfServiceImpl implements JEEConfService

{

@Transactional

@PostConstruct

public void warmCache() {

}

@Override

public void processPayment() {

}

}

Page 35: Spring puzzlers

@Transactional @PostConstruct

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

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

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

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

D. MethodMissingException

Page 36: Spring puzzlers
Page 37: Spring puzzlers

ApplicationListener

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

Page 38: Spring puzzlers

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

@Bean

@Scope("singleton")

public String str() {

return "Chuck Norris";

} A. Scope

B. Bean name

C. BeanClass

D. Всё будет

Page 39: Spring puzzlers
Page 40: Spring puzzlers

@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 41: Spring puzzlers

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

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 42: Spring puzzlers

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

A. 4 минуты

B. 3 минуты

C. 2 минуты

D. 1 минуты

Page 43: Spring puzzlers

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

Page 44: Spring puzzlers

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

Page 45: Spring puzzlers

Добавляем Comparable…

A. NoSuchBeanDefinitionException

B. No proxies

C. NoSuchMethodException

D. All OK

Page 46: Spring puzzlers
Page 47: Spring puzzlers

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

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

Page 48: Spring puzzlers

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

Page 49: Spring puzzlers

Что будет?

@Service

public class MissionCriticalService {

@PostConstruct

public void important(){

System.out.println("Не забудь выключить утюг!");

}

}

<bean class=“jeeconf.littlegirl.MissionCriticalService"/>

<context:component-scan base-package="jeeconf.littlegirl"/>

@Bean

public MissionCriticalService missionCriticalService() {

return new MissionCriticalService();

}

A. не забыть выключить утюг

B. не забыть выключить утюг *2

C. не забыть выключить утюг *3

D. BeanCreationException

Page 50: Spring puzzlers
Page 51: Spring puzzlers

Смотрим!

@Service

public class MissionCriticalService {

@PostConstruct

public void important(){

System.out.println("Не забудь выключить утюг!");

}

}

<bean class=“jeeconf.littlegirl.MissionCriticalService"/>

<context:component-scan base-package="jeeconf.littlegirl"/>

@Bean

public MissionCriticalService missionCriticalService() {

return new MissionCriticalService();

}

Page 52: Spring puzzlers

Выводы

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

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

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

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

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

Page 53: Spring puzzlers