Недельный курс по Spring
####Преподаватель: Барух Садогурский
- Написать свою аннотацию, скажем
@RunThisMethod
- У неё должен быть параметр
repeat
- Написать
ObjectFactory
c методомcreateObject()
- Метод получает тип класса, и возвращает объект данного типа, но если в этом классе, есть методы, аннотированные
@RunThisMethod
.ObjectFactory
должна из запустить соотвественно значению параметраrepeat
- Написать interface
Quoter
с методомsayQuote
и 2 реализации ShakespearQuoter
(c property message) andTerminatorQuoter
(messages)- По вызову метода
sayQuote()
они печатаю все сообщения - Прописать их как бины в контексте и впрыснуть в xml-e им сообщения
- Протестировать
- Создать контекст и сделать поиск
- Попробовать сделать поиск не только по имени, но и по интерфэйсу.
- Написать интерфэйс с реализацией
TalkingRobot
у которого будетList
и (прописать метод talk, чтобы он делегировал на все методы quote из всех Quoter-ов) - Определить этот бин в xml-e и впрыснуть ему оба quoter-a
- Определить метод
talk()
, как init-method - В тесте только создавать контекст
- Изменить scope на prototype
- Создать бин класса
String
, внести в негоvalue (“trust me”)
- Впрыснуть его в лист цитат терминатора
- Напишите свой
BeanPostProcessor
, который будет запускать методы аннотированные@RunThisMethod
- Напишите
BeanPostProcessor
который будет искать кастомную аннотацию@InjectRandomInt
- У этой аннотации будут параметры
min
&max
- Пишем прокси, который будет замерять время вызова метода
- Benchmark, который будет замерять время вызова метода с помощью dynamic proxy
- Напишите свой
BeanPostProcessor
, который будет печатать сколько времени работал метод аннотированный@Benchmark
- Аннотация должна находится над классом – и все его методы должны быть завернуты в логику бенчмарка
- А теперь улучшим наш framework. Теперь аннотация должна считываться с метода, а не класса.
- Напишите еще один
BeanPostProcessor
который будет делать прокси. - Например которые обворачивает транзакцией все методы бинов, класс которых аннотирован
@Transaction
- Прикрутите дополнительный компонент, который будет выводить лог названия всех destroy методов определенных для прототайпов, с предупреждением, что они работать не будет
##День второй
- Напишите собственную аннотацию, которая будет расширять
@Deprecated
. Данную аннотацию будут ставить над устаревшими классами - У этой аннотации будет параметр
newClass
указывающий на новую имплементацию - Напишите
BeanFactoryPostProcessor
, который будет заменять все устаревшие классы на новые
- Напишите
FactoryBean
для чего нибудь (например, StringBuilder)
- Напишите singleton в который впрыснут prototype.
- Проверьте, когда обновляется prototype
- Напишите 2 аннотации
@Oracle
и@Derby
- Напишите 2 класса имплементирующие интерфейс
Dao
с методомcrud()
- Один из классов является имплементаций оракла, второй дерби
- Укажите это при помощи собственных аннотаций
- Напишите сервис, в с проперти
Dao
и инжекните в него один раз имплементацию оракла, а второй дерби, при помощи собсвенных аннотаций
- Напишите свой
DatabaseRuntimeException
- Мэйлы всех работников DBA должны впрыскиваться в аспект
- Попробуйте чтобы stack trace исключения был глубже чем один
- Напишите аспект, который будет перехватывать все методы возвращающий объекты аннотированные
@MyDeprecated
и будет заменять то, что должно вернуться, на объект из нового класса, указанный в аннотации.
- Напишите свою аннотацию
@PostInitialized
- Пропишите свой
ContextListener
, чтобы он поcontextRefreshed
, запускал все методы, аннотированные этой аннотацией
##День третий
- Пишем систему регистраций на эвент
- Модель: Классы для эвента, гостя, заказа, и .т.д
- Сервис: Бизнес методы: зарегистрироваться, посмотреть список гостей
- Репозиторий: Работа с
JDBC Template
для реализации доступа к данным - База данных:
embedded h2 - compile 'com.h2database:h2:1.4.186'
- Сделайте тоже самое, но используя
Java Config
- Напишите класс Водитель
- Имя не может быть
null
- Не пьющий
- Проверьте валидатором объект водителя и распечатайте все ошибки
- А теперь напишите
Taxi
, в который будет впрыскиваться валидныйDriver
- Проверьте при помощи валидатора, что
Taxi
валидный. - В данном случае это значит, что водитель, который в него впрыснут прошел все проверки
- Написать кастомную аннотацию
@ValidCredentials
- Которая будет проверять что у объекта логин пароль не длиннее, чем имя
##День последний
- Сконфигурируйте проект
- Смэпите простой файл
- Создайте
controller
для/hello
- Верните
jsp
- Попробуйте всякие другие маппирования
- Добавляем контроллер посложнее, который принимает параметр в
URL
и показывает его обратно пользователю - Также, печатает все
header-ы
- Напишите хэндлер, который принимает текст и отправляет его обратно
- Напишите хэнлдер, который принимает
JSON
, делает из него объект, и отправляет обратноJSON-ом
. - А теперь принимает
XML
а отправляет обратноJSON-ом.
- Напишите тесты с помощью
HttpClient
- Переведите все стринговые методы на работу с
HttpEntity
- Переведите метод, который создает объект на работу с
HttpEntity
. Также, пусть он проставляетLocation header
и возвращает код201(Created)
. - Пропишите
SimpleMappingExceptionResolver
- Напишите контроллер который кидает исключение, которое вы прописали и проверьте, что маппинг работает
- Реализуйте метод
@ExceptionHandler
- Создайте класс модели, который мы будем использовать для связки данных
- Наполните его из параметров запроса
- Попробуйте с
HTML
формой - Перепишите форму с этим
taglib-ом
- Добавьте тэгов ошибок для демонстрации ошибок конверсии
- Добавьте чекбокс