- Студент
- Модуль hw01-gradle
- Модуль hw02-DIY-ArrayList
- Модуль hw03-Reflection
- Модуль hw04-GCComparisons
- Модуль hw05-AOP
- Модуль hw06-ATM
- Модуль hw07-MessageHandler
- Модуль hw08-JsonObjectWriter
- Модуль hw09-Jdbc
- Модуль hw09-Hibernate
- Модуль hw11-MyCache
- Модуль hw12-WebServer
- Модуль hw13-DI
- Модуль hw14-SpringMVC
- Модуль hw15-Executors
- Модуль hw16-MessageSystem
- Модуль hw17-MicroServices
ФИО слушателя: Люлин Вадим Евгеньевич Название курса: Разработчик Java Группа: 2020-06
Проект gradle с модульной структурой
Домашнее задание Проект gradle с модульной структурой Цель: нучиться создавать проект Gradle (Maven), подготовиться к выполнению домашних заданий.
- Создайте аккаунт на github.com (если еще нет)
- Создайте репозиторий для домашних работ
- Сделайте checkout репозитория на свой компьютер
- Создайте локальный бранч hw01-gradle
- Создать проект gradle
- В проект добавьте последнюю версию зависимости com.google.guava guava
- Создайте модуль hw01-gradle
- В модуле сделайте класс HelloOtus
- В этом классе сделайте вызов какого-нибудь метода из guava
- Создайте "толстый-jar"
- Убедитесь, что "толстый-jar" запускается.
- Сделайте pull-request в gitHub
- Ссылку на PR отправьте на проверку (личный кабинет, чат с преподавателем).
При желании, можно сделать maven-проект и далее на курсе работать с maven-ом. Для Maven инструкция аналогичная (просто в тексте замените Gradle на Maven).
Домашнее задание DIY ArrayList
Цель: изучить как устроена стандартная коллекция ArrayList. Попрактиковаться в создании своей коллекции. Написать свою реализацию ArrayList на основе массива. class DIYarrayList implements List{...}
Проверить, что на ней работают методы из java.util.Collections: Collections.addAll(Collection<? super T> c, T... elements) Collections.static void copy(List<? super T> dest, List<? extends T> src) Collections.static void sort(List list, Comparator<? super T> c)
Домашнее задание Свой тестовый фреймворк Цель: научиться работать с reflection и аннотациями, понять принцип работы фреймворка junit. Написать свой тестовый фреймворк.
Поддержать свои аннотации @Test, @Before, @After.
Запускать вызовом статического метода с именем класса с тестами.
Т.е. надо сделать:
- создать три аннотации - @Test, @Before, @After.
- Создать класс-тест, в котором будут методы, отмеченные аннотациями.
- Создать "запускалку теста". На вход она должна получать имя класса с тестами, в котором следует найти и запустить методы отмеченные аннотациями и пункта 1.
- Алгоритм запуска должен быть следующий:: метод(ы) Before текущий метод Test метод(ы) After для каждой такой "тройки" надо создать СВОЙ объект класса-теста.
- Исключение в одном тесте не должно прерывать весь процесс тестирования.
- На основании возникших во время тестирования исключений вывести статистику выполнения тестов (сколько прошло успешно, сколько упало, сколько было всего)
Сравнение разных сборщиков мусора Цель: на примере простого приложения понять какое влияние оказывают сборщики мусора Написать приложение, которое следит за сборками мусора и пишет в лог количество сборок каждого типа (young, old) и время которое ушло на сборки в минуту.
Добиться OutOfMemory в этом приложении через медленное подтекание по памяти (например добавлять элементы в List и удалять только половину).
Настроить приложение (можно добавлять Thread.sleep(...)) так чтобы оно падало с OOM примерно через 5 минут после начала работы.
Собрать статистику (количество сборок, время на сборки) по разным GC.
!!! Сделать выводы !!! ЭТО САМАЯ ВАЖНАЯ ЧАСТЬ РАБОТЫ: Какой gc лучше и почему?
Выводы оформить в файле Сonclusions.md в корне папки проекта. Результаты измерений сведите в таблицу.
Попробуйте провести этот эксперимент на небольшом хипе порядка 256Мб, и на максимально возможном, который у вас может быть.
Автоматическое логирование. Цель: Понять как реализуется AOP, какие для этого есть технические средства. Разработайте такой функционал: метод класса можно пометить самодельной аннотацией @Log, например, так:
class TestLogging { @Log public void calculation(int param) {}; }
При вызове этого метода "автоматически" в консоль должны логироваться значения параметров. Например так.
class Demo { public void action() { new TestLogging().calculation(6); } }
В консоле дожно быть: executed method: calculation, param: 6
Обратите внимание: явного вызова логирования быть не должно.
Учтите, что аннотацию можно поставить, например, на такие методы: public void calculation(int param1) public void calculation(int param1, int param2) public void calculation(int param1, int param2, String param3)
P.S. Выбирайте реализацию с ASM, если действительно этого хотите и уверены в своих силах. Критерии оценки: Система оценки максимально соответсвует привычной школьной: 3 и больше - задание принято (удовлетворительно). ниже - задание возвращается на доработку.
Эмулятор банкомата Цель: Применить на практике принципы SOLID. Написать эмулятор АТМ (банкомата).
Объект класса АТМ должен уметь:
- принимать банкноты разных номиналов (на каждый номинал должна быть своя ячейка)
- выдавать запрошенную сумму минимальным количеством банкнот или ошибку если сумму нельзя выдать Это задание не на алгоритмы, а на проектирование. Поэтому оптимизировать выдачу не надо.
- выдавать сумму остатка денежных средств
В этом задании больше думайте об архитектуре приложения. Не отвлекайтесь на создание таких объектов как: пользователь, авторизация, клавиатура, дисплей, UI (консольный, Web, Swing), валюта, счет, карта, т.д. Все это не только не нужно, но и вредно! Критерии оценки: Система оценки максимально соответсвует привычной школьной: 3 и больше - задание принято (удовлетворительно). ниже - задание возвращается на доработку.
Домашнее задание Обработчик сообщений Цель: Применить на практике шаблоны проектирования. Реализовать todo из модуля homework.
Cвой json object writer Цель: Научиться сериализовывать объект в json, попрактиковаться в разборе структуры объекта. Напишите свой json object writer (object to JSON string) аналогичный gson на основе javax.json.
Gson это делает так: Gson gson = new Gson(); AnyObject obj = new AnyObject(22, "test", 10); String json = gson.toJson(obj);
Сделайте так: MyGson myGson = new MyGson(); AnyObject obj = new AnyObject(22, "test", 10); String myJson = myGson.toJson(obj);
Должно получиться: AnyObject obj2 = gson.fromJson(myJson, AnyObject.class); System.out.println(obj.equals(obj2));
Поддержите:
- примитивные типы
- массивы примитивных типов
- коллекции (interface Collection) не забываться, что obj может быть null
Самодельный ORM Цель: Научиться работать с jdbc. На практике освоить многоуровневую архитектуру приложения. Работа должна использовать базу данных H2.
Создайте в базе таблицу User с полями:
• id bigint(20) NOT NULL auto_increment • name varchar(255) • age int(3)
Создайте свою аннотацию @Id
Создайте класс User (с полями, которые соответствуют таблице, поле id отметьте аннотацией).
Реализуйте интерфейс JdbcMapper, который умеет работать с классами, в которых есть поле с аннотацией @Id. JdbcMapper должен сохранять объект в базу и читать объект из базы. Для этого надо реализовать оставшиеся интерфейсы из пакета mapper. Таким обзазом, получится надстройка над DbExecutor, которая по заданному классу умеет генерировать sql-запросы. А DbExecutor должен выполнять сгенерированные запросы.
Имя таблицы должно соответствовать имени класса, а поля класса - это колонки в таблице.
Проверьте его работу на классе User.
За основу возьмите класс HomeWork.
Создайте еще одну таблицу Account: • no bigint(20) NOT NULL auto_increment • type varchar(255) • rest number
Создайте для этой таблицы класс Account и проверьте работу JdbcMapper на этом классе.
Использование Hibernate Цель: На практике освоить основы Hibernate. Понять как аннотации-hibernate влияют на формирование sql-запросов. Работа должна использовать базу данных H2.
Возьмите за основу предыдущее ДЗ (Самодельный ORM), используйте предложенный на вебинаре api (пакет api) и реализуйте функционал сохранения и чтения объекта User через Hibernate. (Рефлексия больше не нужна) Конфигурация Hibernate должна быть вынесена в файл.
Добавьте в User поля: адрес (OneToOne) class AddressDataSet { private String street; } и телефон (OneToMany) class PhoneDataSet { private String number; }
Разметьте классы таким образом, чтобы при сохранении/чтении объека User каскадно сохранялись/читались вложенные объекты.
ВАЖНО.
- Hibernate должен создать только три таблицы: для телефонов, адресов и пользователей.
- При сохранении нового объекта не должно быть update-ов. Посмотрите в логи и проверьте, что эти два требования выполняются. Критерии оценки: Система оценки максимально соответсвует привычной школьной: 3 и больше - задание принято (удовлетворительно). ниже - задание возвращается на доработку.
Свой cache engine Цель: Научится применять WeakHashMap, понять базовый принцип организации кеширования. Закончите реализацию MyCache из вебинара. Используйте WeakHashMap для хранения значений.
Добавьте кэширование в DBService из задания про Hibernate ORM или "Самодельный ORM". Для простоты скопируйте нужные классы в это ДЗ.
Убедитесь, что ваш кэш действительно работает быстрее СУБД и сбрасывается при недостатке памяти.
Веб сервер Цель: Научиться создавать серверный и пользовательский http-интерфейсы. Научиться встраивать web-сервер в уже готовое приложение. Встроить веб-сервер в приложение из ДЗ про Hibernate ORM (или в пример из вебинара встроить ДЗ про Hibernate :)). Сделать стартовую страницу, на которой админ должен аутентифицироваться. Сделать админскую страницу для работы с пользователями. На этой странице должны быть доступны следующие функции:
- создать пользователя
- получить список пользователей
Домашнее задание (Собственный IoC контейнер) Цель: В процессе создания своего контекста понять как работает основная часть Spring framework. Обязательная часть:
- Скачать заготовку приложения тренажера таблицы умножения из репозитория с примерами
- В классе AppComponentsContainerImpl реализовать обработку, полученной в конструкторе конфигурации, основываясь на разметке аннотациями из пакета appcontainer. Так же необходимо реализовать методы getAppComponent
- В итоге должно получиться работающее приложение. Менять можно только класс AppComponentsContainerImpl
Дополнительное задание (можно не делать):
- Разделить AppConfig на несколько классов и распределить по ним создание компонентов. В AppComponentsContainerImpl добавить конструктор, который обрабатывает несколько классов-конфигураций
Дополнительное задание (можно не делать):
- В AppComponentsContainerImpl добавить конструктор, который принимает на вход имя пакета, и обрабатывает все имеющиеся там классы-конфигурации (см. зависимости в pom.xml)
Домашнее задание Веб-приложение на Spring MVC Цель: Нучиться создавать war-пакеты и запускать их в TomCat. Научиться пользоваться Thymeleaf.
- Собрать war для приложения из ДЗ про Web Server
- Создавать основные классы приложения, как Spring beans (Кэш, Dao, DBService)
- Настройку зависимостей выполнить с помощью Java/Annotation based конфигурации
- Для обработки запросов использовать @Controller и/или @RestController
- В качестве движка шаблонов использовать Thymeleaf
- Запустить веб приложение во внешнем веб сервере
Авторизацию и аутентификацию делать не надо.
##Модуль hw15-Executors Последовательность чисел Цель: Освоить базовые механизмы синхронизации. Два потока печатают числа от 1 до 10, потом от 10 до 1. Надо сделать так, чтобы числа чередовались, т.е. получился такой вывод: Поток 1:1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3 4.... Поток 2: 1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3....
Всегда должен начинать Поток 1.
Домашнее задание MessageSystem Цель: На практике освоить архитектурный подход "Система сообщений". Добавить систему обмена сообщениями в ДЗ про веб сервер с IoC контейнером (тут проще использовать Spring Boot). Пересылать сообщения из вебсокета в DBService и обратно.
Как работать с вебсокетами смотрите пример из вебинара «Asynchronous Web applications».
MessageSystem добавьте как модуль, по примеру из вебинара.
Домашнее задание MessageServer Цель: Научиться разрабатывать сетевые приложения. Cервер из предыдущего ДЗ про MessageSystem разделить на три приложения: ▪ MessageServer ▪ Frontend ▪ DBServer
-
Сделать MessageServer сокет-сервером, Frontend и DBServer клиентами
-
Пересылать сообщения с Frontend на DBService через MessageServer
-
Запустить приложение с двумя Frontend и двумя DBService (но на одной базе данных) на разных портах
-
Frontend и DBService запускать "руками"
-
По желанию, можно сделать запуск Frontend и DBServer из MessageServer
-
Такой запуск должен быть "отчуждаемый", т.е. "сборка" должна запускаться на другом компьютере без особых хлопот.
Сергей Петрелевич
Стрекалов Павел
Александр Оруджев
Вячеслав Лапин
Виталий Куценко