9. Похоже, но не совсем
1. Все еще Два клевых пацана
на сцене
2. Меньше хи-хи, больше
хардкора!
3. Вы все равно голосуете!
4. Спасибо dataart, luxoft,
eleks, и infusion за призы!
13. Аннотации 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. Папа придёт
15. Аннотации спринга в наследовании
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. Папа придёт
16.
17. @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();
18.
19. @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();
20. Как мы это чиним?
• Прокси надо делать после инит методов!
• Для это есть postProcessAfterInit
21. @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 из-за двухуровневого прокси
22.
23. Как мы это чиним?
• Пишем нормальный BPP, который не делает
bean.getClass()
25. @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.
Что будет?
26.
27. Почему не работает??
@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");
}
}
28. Почему не работает??
@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");
}
}
34. @Service
public class JEEConfServiceImpl implements JEEConfService
{
@Transactional
@PostConstruct
public void warmCache() {
…
}
@Override
public void processPayment() {
…
}
}
35. @Transactional @PostConstruct
• Что будет, с методом у которого обе аннотации?
A. Сработает с транзакцией
B. Сработает без транзакции
C. Не сработает вообще
D. MethodMissingException
38. Чего не будет в BeanDefinition-e?
@Bean
@Scope("singleton")
public String str() {
return "Chuck Norris";
} A. Scope
B. Bean name
C. BeanClass
D. Всё будет
49. Что будет?
@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
50.
51. Смотрим!
@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();
}
52. Выводы
1. Учите спринг!
2. Читайте документацию
3. Иногда это баги, И Иногда их
можно починить
4. Пользуйте spring integration в
intellij IDEA!
5. Учите спринг, Я сказал!