Как в Java используются final, finally и finalize
В этой статье вы узнаете, где, когда и зачем используется ключевое слово
https://telegra.ph/Kak-v-Java-ispolzuyutsya-final-finally-i-finalize-04-17
👉@BookJava
В этой статье вы узнаете, где, когда и зачем используется ключевое слово
Finalize
, и стоит ли его вообще применять в Java. Также вы узнаете о различиях между final
, finally
и finalize
.https://telegra.ph/Kak-v-Java-ispolzuyutsya-final-finally-i-finalize-04-17
👉@BookJava
Telegraph
Как в Java используются final, finally и finalize
В этой статье вы узнаете, где, когда и зачем используется ключевое слово Finalize, и стоит ли его вообще применять в Java. Также вы узнаете о различиях между final, finally и finalize. Где используется блок finally? Блок finally в Java используется для размещения…
👍2
Как не допустить сериализацию?
Чтобы не допустить автоматическую сериализацию можно переопределить private методы для создания исключительной ситуации NotSerializableException.
👉@BookJava
Чтобы не допустить автоматическую сериализацию можно переопределить private методы для создания исключительной ситуации NotSerializableException.
private void writeObject(ObjectOutputStream out) throws IOException {
throw new NotSerializableException();
}
private void readObject(ObjectInputStream in) throws IOException {
throw new NotSerializableException();
}
👉@BookJava
👍5
Media is too big
VIEW IN TELEGRAM
Docker и Spring Boot микросервис (Быстрый старт)
Разберем основные понятия докера и запустим spring boot микросервис в докере
00:00 Intro
00:58 Установить докер
02:05 Развитие виртуализации
09:30 Компоненты Docker
11:25 Docker Daemon
11:50 Dockerfile
12:42 Docker Image
13:12 Docker Registry
13:45 Docker Container
14:00 Dockerhub
14:57 Практика. Пишем микросервис
17:30 Практика. Пишем dockerfile
23:25 Практика. Создаем docker образ
25:48 Практика. Запускам docke контейнер
27:19 Практика. Основные команды
30:00 Best practice. Как еще можно написать dockerfile
33:14 Best practice. Рекомендации
35:01 Итог
источник
👉@BookJava
Разберем основные понятия докера и запустим spring boot микросервис в докере
00:00 Intro
00:58 Установить докер
02:05 Развитие виртуализации
09:30 Компоненты Docker
11:25 Docker Daemon
11:50 Dockerfile
12:42 Docker Image
13:12 Docker Registry
13:45 Docker Container
14:00 Dockerhub
14:57 Практика. Пишем микросервис
17:30 Практика. Пишем dockerfile
23:25 Практика. Создаем docker образ
25:48 Практика. Запускам docke контейнер
27:19 Практика. Основные команды
30:00 Best practice. Как еще можно написать dockerfile
33:14 Best practice. Рекомендации
35:01 Итог
источник
👉@BookJava
👍12
Как работают фильтры сервлетов?
Filter Chain – типичный пример реализации паттерна Chain of responsibility. Каждый фильтр может модифицировать запрос/ответ, и либо отправить на обработку следующему фильтру, либо заворачивать обратно. В фильтрах удобно выполнять некий общий код обработки запросов: отклонение неавторизованных обращений, логгирование, обогащение запроса/ответа данными из контекста.
Фильтр состоит из трех методов:
👉@BookJava
Servlet
содержит саму бизнес-логику обработки запросов. Реализации интерфейса javax.servlet.Filter
выстраиваются в цепочку, через которую проходит запрос по пути в сервлет, и ответ на него по пути обратно к пользователю.Filter Chain – типичный пример реализации паттерна Chain of responsibility. Каждый фильтр может модифицировать запрос/ответ, и либо отправить на обработку следующему фильтру, либо заворачивать обратно. В фильтрах удобно выполнять некий общий код обработки запросов: отклонение неавторизованных обращений, логгирование, обогащение запроса/ответа данными из контекста.
Фильтр состоит из трех методов:
init
, doFilter
и destroy
. doFilter – основная реализация фильтрации, он вызывается для каждого запроса. Инициализация и уничтожение вызываются строго по одному разу. Кроме того, сервлет-контейнер гарантирует, что их вызовы не будут пересекаться: doFilter
не начнет работать до конца выполнения init
, и закончит до начала destroy
.👉@BookJava
👍7
Media is too big
VIEW IN TELEGRAM
Kafka Cluster в Docker
Настроим docker-compose.yml для кафка кластера и запустим наше приложение с кафкой из докера
00:00 Intro
00:30 Конфигурация одного сервера
10:23 Запуск и проверка работы
15:15 Конфигурация кластера
18:05 Запуск кластера и проверка работы
19:30 environment.env
21:30 environment.env
22:56 Итог
источник
👉@BookJava
Настроим docker-compose.yml для кафка кластера и запустим наше приложение с кафкой из докера
00:00 Intro
00:30 Конфигурация одного сервера
10:23 Запуск и проверка работы
15:15 Конфигурация кластера
18:05 Запуск кластера и проверка работы
19:30 environment.env
21:30 environment.env
22:56 Итог
источник
👉@BookJava
🔥5👍3
JRE – Java Runtime Environment, Java-окружение времени выполнения. Это набор всего необходимого чтобы запустить скомпилированную Java-программу. Окружение состоит из виртуальной машины Java (JVM), библиотеки классов (Java Class Library), консольной команды java и прочей инфраструктуры. Тем не менее, JRE не достаточно чтобы создавать новые программы.
JDK – Java Development Kit, набор Java-разработчика. Это полнофункциональный SDK для Java. JDK включает в себя JRE, но кроме того содержит компилятор (javac) и другие инструменты разработки, такие как javadoc и jdb. С помощью JDK можно создавать и компилировать программы.
В большинстве случаев, если вам нужно только запускать Java программы, вы устанавливаете только JRE, если же вы планируете программировать на Java, вместо этого вам необходим JDK.
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre/1906455#1906455
👉@BookJava
JDK – Java Development Kit, набор Java-разработчика. Это полнофункциональный SDK для Java. JDK включает в себя JRE, но кроме того содержит компилятор (javac) и другие инструменты разработки, такие как javadoc и jdb. С помощью JDK можно создавать и компилировать программы.
В большинстве случаев, если вам нужно только запускать Java программы, вы устанавливаете только JRE, если же вы планируете программировать на Java, вместо этого вам необходим JDK.
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre/1906455#1906455
👉@BookJava
👍3
Какие задачи решает Spring Data?
Это проект, который упрощает работу с системами доступа к данным: реляционными и нереляционными базами данных, map-reduce фреймворками и облачными хранилищами. Центральная концепция проекта – репозитории из предметно-ориентированного дизайна (Domain-driven design, DDD).
Spring Data состоит из множества отдельных библиотек для разных случаев жизни. Вот самые популярные из них:
• Spring Data JPA – адаптер для реализаций Java Persistence API, таких как Hibernate.
• Spring Data JDBC – более простой и ограниченный чем JPA адаптер для JDBC-драйверов.
• Spring Data REST – создание готовых hypermedia-driven RESTful сервисов на основе репозиториев.
• Spring Data KeyValue – работа с хранилищами типа ключ-значение.
• Библиотеки поддержки конкретных реализаций хранилищ: MongoDB, Redis, Cassandra, LDAP, и других.
👉@BookJava
Это проект, который упрощает работу с системами доступа к данным: реляционными и нереляционными базами данных, map-reduce фреймворками и облачными хранилищами. Центральная концепция проекта – репозитории из предметно-ориентированного дизайна (Domain-driven design, DDD).
Spring Data состоит из множества отдельных библиотек для разных случаев жизни. Вот самые популярные из них:
• Spring Data JPA – адаптер для реализаций Java Persistence API, таких как Hibernate.
• Spring Data JDBC – более простой и ограниченный чем JPA адаптер для JDBC-драйверов.
• Spring Data REST – создание готовых hypermedia-driven RESTful сервисов на основе репозиториев.
• Spring Data KeyValue – работа с хранилищами типа ключ-значение.
• Библиотеки поддержки конкретных реализаций хранилищ: MongoDB, Redis, Cassandra, LDAP, и других.
👉@BookJava
👍4
Совет по Java 💡☕️
Как легко просуммировать все числа в Java-списке? Для этого мы можем использовать метод Java Stream
👉@BookJava
Как легко просуммировать все числа в Java-списке? Для этого мы можем использовать метод Java Stream
reduce
👉@BookJava
👍10👎7
Что происходит внутри TreeMap.put()?
Подобно нодам в хэш-таблице, внутренняя структура дерева строится из объектов внутреннего класса узла – Entry. В каждом узле хранится информация о данных (пара key-value), и о положении в структуре (ссылки на родительский узел, левую и правую ветви).
Сама структура представляет из себя красно-чёрное дерево относительно ключей. Не будем здесь углубляться в детали его реализации. О нем важно знать два факта:
1. Это бинарное дерево поиска. Значит, каждый новый элемент начинает искать свое место в дереве, сравниваясь с узлами начиная с корневого. Меньшие элементы движутся влево, большие – вправо. Для этого и требуется наличие метода
2. Это самобалансирующееся дерево. Если какая-то ветка начинает становиться слишком длинной (а её эффективность вырождаться в эффективность связного списка), происходит балансировка. В результате этой операции правило из пунтка 1 остается в силе, но нагрузка на ветки перераспределяется. Самое длинное поддерево становится выше самого короткого максимум на один элемент.
👉@BookJava
TreeMap
требует либо задать порядок ключей вручную (передать в конструктор Comparator
), либо чтобы они имели собственный естественный порядок (были Comparable
).Подобно нодам в хэш-таблице, внутренняя структура дерева строится из объектов внутреннего класса узла – Entry. В каждом узле хранится информация о данных (пара key-value), и о положении в структуре (ссылки на родительский узел, левую и правую ветви).
Сама структура представляет из себя красно-чёрное дерево относительно ключей. Не будем здесь углубляться в детали его реализации. О нем важно знать два факта:
1. Это бинарное дерево поиска. Значит, каждый новый элемент начинает искать свое место в дереве, сравниваясь с узлами начиная с корневого. Меньшие элементы движутся влево, большие – вправо. Для этого и требуется наличие метода
compare
. Дойдя до конца, пара ключ-значение «повисает» новым узлом.2. Это самобалансирующееся дерево. Если какая-то ветка начинает становиться слишком длинной (а её эффективность вырождаться в эффективность связного списка), происходит балансировка. В результате этой операции правило из пунтка 1 остается в силе, но нагрузка на ветки перераспределяется. Самое длинное поддерево становится выше самого короткого максимум на один элемент.
👉@BookJava
👍8
👍3
Перечислите стандартные функциональные интерфейсы
Стандартная библиотека содержит пакет
Функции
Обычная обобщенная функция – интерфейс
Бинарные функции – функции с двумя параметрами и возвращаемым значением.
Поставщики (Suppliers)
Интерфейсы
Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T
Предикаты
Операторы
Унарный (
👉@BookJava
Стандартная библиотека содержит пакет
java.util.function
, в котором хранятся функциональные интерфейсы для большинства случаев жизни. Их можно разделить на 5 групп:Функции
Обычная обобщенная функция – интерфейс
Function<T, R>
. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации – семейство интерфейсов XtoYFunction
. (Здесь и далее вместо X и Y подставляются названия примитивов).Бинарные функции – функции с двумя параметрами и возвращаемым значением.
BiFunction<T
, U
, R>
, ToXBiFunction<T, U>
.Поставщики (Suppliers)
Интерфейсы
Supplier<T>
, XSupplier
– не принимают ничего, возвращают (поставляют) значение.Потребители (Consumers)
Consumer<T>, XConsumer – принимают (потребляют) значение, ничего не возвращают.
Бинарный вариант, BiConsumer<T
,
U> и XYConsumer, потребляет два параметра.Предикаты
Predicate<T>
, XPredicate
– принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.Операторы
Унарный (
UnaryOperator<T>
) и бинарный (BinaryOperator<T>
) – просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator
и XBinaryOperator
вдобавок содержат дефолтные реализации методов для композиции операторов.👉@BookJava
👍6
Какие отличия между @Component, @Service, @Repository и @Controller?
Остальные аннотации – это алиасы аннотации
Эти аннотации называют «Stereotype annotations». Их главное отличие – семантика, логическая роль компонентов:
•
•
•
Сторонние компоненты могут пользоваться этой семантикой. Например, трансляция исключений Persistence API работает именно на компонентах стереотипа
👉@BookJava
@Component
– простой способ сделать объявление класса объявлением Spring-бина. Из всех компонентов, которые попали в сканирование (о которых знает @ComponentScan
), будут созданы бин-дефинишны.Остальные аннотации – это алиасы аннотации
@Component
. Сами по себе они не добавляют поведения, и технически в рамках ядра Spring Framework работают так же.Эти аннотации называют «Stereotype annotations». Их главное отличие – семантика, логическая роль компонентов:
•
@Service
– реализация бизнес-логики;•
@Repository
– хранилище данных: «репозиторий» из Domain-Driven Design или классический DAO;•
@Controller
– обработка веб-запросов (методы @RequestMapping
)Сторонние компоненты могут пользоваться этой семантикой. Например, трансляция исключений Persistence API работает именно на компонентах стереотипа
@Repository
. Таким образом, в отдельных случаях кроме семантики может меняться и поведение кода библиотек.👉@BookJava
👍8👎2😁2
Создание пользовательской аннотации в Java. Дженерики и стирание типов в Java
Аннотация — это функция, которая служит механизмом добавления в код дополнительной информации, что способствует улучшению организации, документирования и автоматизации в рамках программных проектов. Если вы какое-то время программировали на Java, то, вероятно, вам знакома хотя бы пара аннотаций. Одним из примеров является
Хотя аннотации используют многие разработчики, не все из них понимают, насколько легко создавать собственные аннотации. При этом многие платформы часто используют свои собственные аннотации наряду со встроенными аннотациями Java.
https://medium.com/@gulsum.satic/creating-custom-annotation-in-java-942e44f3d870
👉@BookJava
Аннотация — это функция, которая служит механизмом добавления в код дополнительной информации, что способствует улучшению организации, документирования и автоматизации в рамках программных проектов. Если вы какое-то время программировали на Java, то, вероятно, вам знакома хотя бы пара аннотаций. Одним из примеров является
@Override
. Хотя аннотации используют многие разработчики, не все из них понимают, насколько легко создавать собственные аннотации. При этом многие платформы часто используют свои собственные аннотации наряду со встроенными аннотациями Java.
https://medium.com/@gulsum.satic/creating-custom-annotation-in-java-942e44f3d870
👉@BookJava
👍7❤1
Как использовать ReadWriteLock?
Стандартный интерфейс
Оба типа блокировок одного экземпляра
Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
👉@BookJava
Стандартный интерфейс
ReadWriteLock
предоставляет потокобезопасный разделенный доступ на чтение и на запись. Для этих целей в нём объявлены два метода: readLock()
и writeLock()
. Они возвращают объекты под интерфейсом Lock.Оба типа блокировок одного экземпляра
ReadWriteLock
связаны. Пока какой-то поток не заберет блокировку на запись, сколько угодно потоков могут читать не мешая друг другу. Блокировкой readLock
закрывается часть кода с семантикой «только чтения» некоторого условного «ресурса». В критической секции кода writeLock
осуществляется модификация ресурса.Свойства этих локов защищают программу от ситуаций конкурентной записи ресурса и чтения во время записи. Подобно copy-on-write коллекциям, этот подход становится выгодным, когда ресурс читают сильно чаще чем модифицируют.
Интерфейс реализуется классом
ReentrantReadWriteLock
, который во многом похож на обычный ReentrantLock.👉@BookJava
👍3👏2
Исходные файлы статьи о быстром нахождении чисел Фибоначчи.
https://github.com/nebel-abyssus/fibonacci
👉@BookJava
https://github.com/nebel-abyssus/fibonacci
👉@BookJava
GitHub
GitHub - nebel-abyssus/fibonacci: Исходные файлы статьи о быстром нахождении чисел Фибоначчи.
Исходные файлы статьи о быстром нахождении чисел Фибоначчи. - nebel-abyssus/fibonacci
👍3
Что такое classpath?
Classpath – это параметр, который указывает приложениям где искать пользовательские классы. По этому адресу должны быть найдены все классы, для которых не применяются специальные загрузчики. На место поиска стандартных классов JRE этот параметр не влияет.
Кроме непосредственно Java-приложений (команда
Есть два основных способа установки classpath: в переменной окружения ОС
В параметре передаются пути к jar-файлам и корневым директориям с пакетами. Пути разделяют символом
Если приложение запускается из jar-файла (
👉@BookJava
Classpath – это параметр, который указывает приложениям где искать пользовательские классы. По этому адресу должны быть найдены все классы, для которых не применяются специальные загрузчики. На место поиска стандартных классов JRE этот параметр не влияет.
Кроме непосредственно Java-приложений (команда
java
), этот параметр применим и для других утилит JDK, таких как javac
, javadoc
и другие.Есть два основных способа установки classpath: в переменной окружения ОС
CLASSPATH
, и в аргументе командной строки -cp
(синоним -classpath
). Второй способ предпочтительнее, потому что позволяет устанавливать разные значения для разных приложений. Значение по умолчанию – текущая директория.В параметре передаются пути к jar-файлам и корневым директориям с пакетами. Пути разделяют символом
:
в параметре командной строки, или же ;
в переменной окружения. Чтобы включить все файлы директории, разрешается использовать в конце пути символ *
.Если приложение запускается из jar-файла (
java -jar
), classpath должен быть указан в его манифесте.👉@BookJava
👍6