& CountDownLatch CyclicBarrier локи смофоры синхронайзд монитор сортировки при дедлоках
& Управление потоками на уровне диспетчера сервлетов:
- стандарт. - не стандарт.
& КонтроллерАдвайс Класс помечается @ControllerAdvice
Внутри класса пишем методы помеченные @ExceptionHandle в параметрах указываем исключения какого типа будет обрабатывать каждый конкретный метод.
& Is-A (Является). Связано с типом объекта (наследование или реализация интерфейса).
Has-A (имеет) - внедрение зависимостей (композиция/агрегация)
& GOF - Порождающие - Структурные - Поведенческие
---Abstract Factory / Builder / Factory Method / Prototype / Singleton---
---Adapter / Composite / Decorator / Facade / Proxy---
---Chain of R..y /Mediator /Memento /Observer /State /Strategy /Template Method---
& InputStream (Абстрактный класс) его реализуют FileInputStream ByteArrayInputStream
StringReader System.in и др. их можно положить в обертки BufferedInputStream
DataInputStream (читает примитивные типы данных) GZIPInputStream (из ZIP-архива)
ObjectInputStream десериализует объект если он создан в ObjectOutputStream
& Раньше (java.io.File) File file = new File("my_file.txt");
Новый (java.nio.file) Path filePath = Paths.get("my_file.txt");
& Stream API:
Collection.stream() Arrays.stream(array) Stream.of(elements...) BufferedReader.lines() итд
filter(Predicate) map(Function) flatMap(Function) distinct(удаляет дубликаты) sorted() спец. стримы для примитивов: IntStream, LongStream, итд с доп методами sum() итд
Терминальные: forEach() toArray() min() count() collect(Collector collector) итд
& SOLID Single Responsibility Open/Closed Liskov Substitution Interface Segregation Dependency Inversion
& utils.concurent: там много всего вот основное...
Интерфейс Executor реализуют Executors(фабричный класс) создает newFixedThreadPool(int) итд
Блокировки (Locks) Атомарные переменные (Atomic Variables) и Коллекции (Collections):
ConcurrentHashMap CopyOnWriteArrayList CopyOnWriteArraySet ConcurrentLinkedQueue
& Удаление из list: итератором, пересечением 2 списков, utils.concurent
& Отправляем Callable в поток ExecutorService.newFixedThreadPool(4) результат храним в Future пока он не понадобится и потом в try блоке result = future.get();
& CompletableFuture thenCombine() позволяет вам выполнить два CompletableFuture параллельно,
а затем, когда оба завершатся, применить функцию для объединения их результатов.
& Optional класс нужен преимущественно для методов которые могут вернуть нулл чтобы явно указать на такую возможность и предотвратить рунтайм ексепшны
& Байтовые потоки: (FileInputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream)
Символьные потоки: (FileReader, FileWriter, BufferedReader, BufferedWriter)
& Comparable и Comparator
& public (Класс,Пакет,Класс наследник,Другие пакеты)
protected (Класс,Пакет,Класс наследник)
default он же Package-private (Класс,Пакет)
private (Класс, вложенный класс)
& Методы Object: Object() (Конструктор), toString(), equals(Object obj), hashCode(),
getClass(), notify(), notifyAll(), wait(), finalize(), clone().
& java.math.BigDecimal для точных операций. int a=(int) (0.1+0.8999); =0, усечение и унбоксинг
& Массив, Список, Стек, Очередь, Дерево, Хеш-таблица, Граф
& O(1), O(logn), O(n), O(n logn), O(n^2), O(2^n) (Exponential)
& N+1: "FetchType.EAGER" для сущности "JOIN FETCH" @Query для запроса конкретного,
"EntityGraph ставится под @Entity"
& JPA: JDBC -> ORM frameworks -> Hibernate -> JPA
(позволяет переносить код между разными реализациями JPA если вдруг нужно заменить хибернейт)
& До появления пакета java.util.concurrent, Collections.synchronizedList(List<T> list)
& Generics: raw types, типобезопасность КЛАССОВ ИНТЕРФЕЙСОВ МЕТОДОВ, проверка на этапе компиляции,
стирание типов в рантайме информация о типе параметра (например, String или Integer) стирается.
& @WebServlet @RestController @Controller
& Данные в RestFul (Рекомендуется, чтобы URI не превышал 2048 символов)
  • В теле запроса (основной способ, строка формата json или xml помещается в тело запроса )
  • В пути (по каждой ссылке доступен свой эндпоинт)
  • В параметрах запроса (users? firstName=John&lastName=Doe)(414 Request-URI Too Long)
  • Вхедере + куки в хедере
& Ссылки: strong(obj не даляется) -> soft(obj удаляется при нехватке памяти)
  • -> weak(obj будет удален при сборке мусора)
  • -> phantom(хранится в очереди обработки и значит obj был удален)
& Типы корней сборки в Java:
  • Локальные переменные в стеке текущих потоков
  • Статические переменные (классовые переменные)
  • Активные потоки (Threads) все объекты, на которые он ссылается, живы.
  • Нативный код - если нативный код удерживает ссылку на объект он жив.
& Externalizable - это интерфейс в Java, который расширяет интерфейс Serializable
& GC (System.gc) - Работа с поколениями, - Разделение кучи на две части, - Деление кучи на регионы, - Конкурентная сборка мусора, - Сжатие памяти Colored Pointers.
- Epsilon GC и Garbage-First Garbage Collector (G1 GC).
& Ссылки:
-> strong(obj не удаляется)
-> soft(obj удаляется при нехватке памяти)
-> weak(obj будет удален при сборке мусора)
-> phantom(хранится в очереди обработки и значит obj был удален)
& AtomicInteger - работает за счет CAS (Compare-and-Swap) - это атомарная инструкция процессора, работает по принципу Оптимистической блокировки если значение было изменено перед сохранением set() просто запишет новое
compareAndSet() вернет фолс который нужно будет обрабатывать самому
get() - set() getAndSet() - updateAndGet(updateFunction)
getAndUpdate(Upd..Func..)
& Откат произойдет только когда метод помеченный @Transactional выкинет исключение рантайм и поэтому его нужно вызывать из обычного метода который обработает исключение в катч например повторит вызов этого транзакшнл метода
& @Transactional(propagation = Propagation.REQUIRED)
REQUIRED, SUPPORTS, * MANDATORY, REQUIRES_NEW, NOT_SUPPORTED, * NEVER, NESTED
!!Checked Exceptions НЕ ОТКАТЫВАЮТ ТРАНЗАКЦИЮ (rollbackFor и noRollbackFor)
!!Вызов обычного метода из транзакционного будет в транзакции
!!Вызов метода даже транзакционного без обращения к заинжекченому бину не будет в транзакции (нет прокси)
!!private или final или static методы не проксируются и будут без транзакций
& В БД настроены только уровни изоляции для записей и никаких блокировок. Блокировки могу установить я сам в своих запросах @Lock над @Query и поле @Version в JPA - значит автоматически оптимистическая блокировка
& Пустой конструктор в @Entity нужен чтобы провайдер(Hibernate) мог создать объект с пустыми полями а потом их заполнить из базы данных
& Hibernate работа с БД
SessionFactory(одна на все приложение) -> sessionFactory.openSession() -> session.beginTransaction() -> session.save(myObject) -> try/catch -> transaction.commit()/rollback() -> session.close()
-> SessionFactory.close (при завершении приложения)
SpringDataJPA заменяет все что выше просто методом .save
& Жизненный цикл сущности hibernate:
Transient->Persistent->Detached->Persistent->Removed->Transient - Transient не отслеживается джпа не попадет в БД
& --- findById() - всегда загрузит сущность из БД
--- getReferenceById() - вернет из контекста постоянства (если там нет, из БД)
--- entityManager.refresh(entity) принудительно обновляет состояние из БД
Spring Data JPA не поддерживает автоматическое заполнение контекста постоянства результатами запросов, сделанных не по ID.
Чтобы гарантировать, что данные в контексте постоянства актуальны, то после вызова findByEmail (или другого метода поиска) вы должны использовать entityManager.refresh(entity)
& @Modifying <- это и три строчки ниже пример куери
@Transactional <- модифинг исп-ся только с ТРАНЗАКШНЛ!!!
@Lock(PESSIMISTIC_WRITE) <- только для JPQL и критери API(лок не работает с натив и модифаинг (нужен блок натив в запросе))
@Query(value = "текст запроса на SQL", nativeQuery = true)
void increaseAllPricesByPercentage(BigDecimal percentage);
& @OneToMany(mappedBy = "автор", cascade = CascadeType.ALL) CascadeType.ALL Распространяет все операции (PERSIST, MERGE, REMOVE, REFRESH, DETACH) т.е как операции с БД в Hibernate orphanRemoval = true
& - @Component - @Service - @Repository - @Controller -@RestController
@Scope под @Bean или @Component или XML
@Qualifier чтобы знать какой экзепляр бина внедрять
@ComponentScan и реже @Import чтобы найти бины
@Conditional принимает класс, который реализует интерфейс
Condition. Создает бин только при определенных условиях
@Configuration про initMethod про destroyMethod про
библиотеки, сложную логику, про бин с разными именами итд
@Autowired(required = false) бин не найден приложение не
выбросит исключение и скомпилится без него
& @Scope("prototype") используется совместно с ObjectFactory из Spring Framework. Это фабрика для создания бина. Потому что в зависимости будет один раз создаваться а объект фактори каждый раз вернет новый
& Основные модули Spring Framework:
Core, Context, Beans, AOP, MVC(веб), Data Access
& Преимущества Spring Boot
-- Упрощение начальной настройки -- Автоматическая конфигурация(starters) -- Встроенный сервер приложений
& FOREIGN KEY
ON DELETE или ON UPDATE имеют тип связи:
RESTRICT или CASCADE или SET NULL или SET DEFAULT
& Ключи в БД
Первичные ключи - GenerationType.IDENTITY / SEQUENCE / UUID
Внешние ключи (foreign keys)
Естественный ключ
Суррогатный ключ
Простой ключ
Составной ключ
& Уровни изоляции в БД (locks)
1. Read Uncommitted - dirty read
2. Read Committed - non repetanle read
3. Repeatable Read - phantom read
4. Serializable
& Основные типы констрейнтов:
NOT NULL
UNIQUE
PRIMARY KEY В большинстве бд NOT NULL UNIQUE
FOREIGN KEY
CHECK
DEFAULT
& ACID свойства транзакций
1. Atomicity Транзакция журналирование откат
2. Consistency констрейнты
3. Isolation Используются механизмы блокировок (locks)
4. Durability бэкапы
& Операции в БД:
SELECT, *INSERT, *UPDATE, *DELETE, JOINs
(INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN), UNION, UNION ALL
Made on
Tilda