Секреты Java
Ir al canal en Telegram
Обсуждаем Java, архитектуру, фреймворки и всё, о чем должны говорить разработчики. Владелец: @Alexey_Morl Реклама на бирже: https://telega.in/c/java_secrets
Mostrar más7 991
Suscriptores
Sin datos24 horas
Sin datos7 días
Sin datos30 días
Archivo de publicaciones
7 991
✅ Использование класса ThreadLocal
ThreadLocal - это класс в Java, который предоставляет уникальную копию переменной для каждого потока. Это означает, что каждый поток имеет свою собственную копию переменной, которая не доступна другим потокам.
Давайте рассмотрим пример:
Создадим класс реализующий
Runnable, в котором будет два счетчика, один - примитив, другой ThreadLocal. Значения обоих увеличиваются в методе run() и выводятся в консоль:
public class Counter implements Runnable {
private int count = 0;
private ThreadLocal<Integer> threadCount = ThreadLocal.withInitial(() -> 0);
@Override
public void run() {
count = count + 1;
threadCount.set(threadCount.get() + 1);
System.out.println("count: " + count);
System.out.println("threadCount: " + threadCount.get());
}
}
И запустим выполнение в трех потоках последовательно:
public class Demo {
@SneakyThrows
public static void main(String[] argv) {
var counter = new Counter();
startAndWait(new Thread(counter));
startAndWait(new Thread(counter));
startAndWait(new Thread(counter));
}
@SneakyThrows
private static void startAndWait(Thread thread) {
thread.start();
thread.join();
}
}
Вывод в консоль будет:
counter: 1
threadCounter: 1
counter: 2
threadCounter: 1
counter: 3
threadCounter: 1
При выполнение метода run() каждый из трех потоков работает с общей переменной count и получает свою копию threadCount.
Использование ThreadLocal позволяет безопасно работать с данными в многопоточной среде и предоставляет удобный способ хранения данных, которые должны быть доступны только в рамках определенного потока исполнения. ThreadLocal может быть полезен в многопоточных приложениях при кешировании данных, хранении какой-либо информации о сеансе в веб-приложениях, для изоляции данных между потоками и много чего другого.
🫡 Секреты Java
#multithreading #threadlocal7 991
✅ Стереотипные аннотации в Spring
Стереотипные аннотации используются для автоматического определения Spring'ом бинов.
Другими словами - без необходимости писать дополнительный код Spring:
▫️Найдет классы помеченные этими аннотациями
▫️Создаст их экземпляры
▫️Внедрит все необходимые зависимости
Основные стереотипные аннотации в Spring включают в себя
@Component, @Service, @Repository и @Controller. Каждая из них представляет определенный тип компонента в приложении и имеет свои особенности.
▫️Component:
@Component является базовой аннотацией для всех остальных стереотипных аннотаций в Spring, т.е. другие стереотипные аннотации помечены аннотацией @Component. Используется для пометки класса как компонента, который Spring должен автоматически обнаружить и настроить.
▫️Repository:
@Repository является специализацией @Component, для маркировки класса используемого для доступа к базе данных. Класс помеченный этой аннотацией будет преобразовывать исключения пробрасываемые из этого класса в Spring DataAccessExeption (с помощью классов реализующих PersistenceExceptionTranslator)
▫️Service:
@Service также является специализацией @Component и используется для пометки класса как сервиса, обеспечивающего бизнес-логику. Хоть он и не имеет функциональных отличий от @Component, предпочтительнее использовать его для того чтобы обозначить явно, что класс выполняет бизнес-логику.
▫️Controller:
@Controller также является специализацией @Component и используется для пометки класса как контроллера, обрабатывающего HTTP-запросы.
В отличии от предыдущих аннотаций, мы не можем заменить @Controller на какую либо другую стереотипную, т.к. DispatcherServler Spring'a сканирует классы, аннотированные с помощью @Controller, и ищет в них методы, помеченные аннотациями @RequestMapping для мапинга на них HTTP-запросов.
В итоге, стереотипные аннотации в Spring помогают определить разные роли компонентов в приложении и обеспечить их автоматическую конфигурацию и управление контейнером Spring.
🫡 Секреты Java
#spring7 991
✅ Что такое Snapshot версия у артефактов Maven?
Наверняка вы встречали такие зависимости у которых в версии стоит слово SNAPSHOT.
Пример:
<dependency>
<groupId>com.example</groupId>
<artifactId>my-library</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
Что это значит?
SNAPSHOT версия в Maven - это версия, которая все еще разрабатывается и может меняться. Она удобна для тестирования и обмена обновлениями на стадии разработки. Release версия (без суффикса SNAPSHOT)- это окончательная, стабильная версия проекта, которая готова к использованию и меняться уже не будет (только от версии к версии).
Если ваше приложение использует какую-либо библиотеку с версией SNAPSHOT, это значит ее автор может доработать/удалить функционал и залить новый артефакт не поменяв версию. Совесть автора чиста, а ваше приложение после обновления зависимостей может не собраться.
🫡 Секреты Java
#maven #gradle7 991
❓Исходя из изображения выше, при поднятии Spring приложения, какое будет имя у созданного бина?
7 991
✅ Использование аннотаций
@PostConstruct и @PreDestroy в Spring приложении
Spring позволяет нам привязывать выполнение кастомной логики к созданию и уничтожению бина.
В этом посте мы рассмотрим аннотации @PostConstruct и @PreDestroy для определения методов, которые должны быть выполнены после создания и до уничтожения бина соответственно.
До JDK 8 данные аннотации были частью стандартных библиотек, с JDK 11 удален из них и вынесен в отдельный артифакт, который можно найти в мавен репозитории:
implementation 'jakarta.annotation:jakarta.annotation-api:2.1.1'
- Аннотация @PostConstruct помечает метод, который Spring выполнит после завершения конструктора и инжекта всех зависимостей, но перед тем, как бин будет использоваться. Это полезно для инициализации ресурсов или выполнения других операций, которые требуют доступа к зависимостям.
- Аннотация @PreDestroy помечает метод, который должен быть выполнен перед уничтожением бина. Это полезно для освобождения ресурсов или выполнения других операций перед тем, как бин больше не будет использоваться.
Пример:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class MyBean {
@PostConstruct
public void init() {
System.out.println("MyBean init");
}
@PreDestroy
public void cleanup() {
System.out.println("MyBean will be destroyed");
}
}
При запуске Spring приложения, будет создан бин MyBean и в консоль будет выведен текст "MyBean init". Если Spring будет удалять этот бин (по каким-либо причинам), он сначала вызовет метод cleanup() и выведет в консоль "MyBean will be destroyed", после чего удалит бин.
Заключение:
Аннотации @PostConstruct и @PreDestroy в Spring обеспечивают простой и эффективный способ управления жизненным циклом бинов, позволяя выполнить необходимые действия перед и после использования бина. Это делает их ценными инструментами для инициализации и освобождения ресурсов в приложениях Spring.
🫡 Секреты Java
#spring #javax #jakarta7 991
Ребят, в начале или середине своего пути вам часто нужно смотреть на примеры кода и реализацию разных возможностей
⚠️ Это повышает вашу насмотренность, понимание кода, да и вы всегда можете сохранить заготовки себе на будущие проекты
Раньше я публиковал множество сайтов. Но теперь есть специальный канал для этого: @code_ready
У вас будет все под рукой, с оформленным кодом, примерами, шпаргалками и без занудства
➡️ Так что подписываемся
7 991
🔥 Это база с 1700 вопросами с собеседований на Java разработчика. Фишка в том, что просчитана вероятность с которой вопрос буден задан и есть примеры ответов. Теперь можно легко получить оффер, подготовившись к самым популярным вопросам 😏
7 991
✅ Нормализация SQL баз данных: Первая нормальная форма (1NF)
Нормализация баз данных нужна для того, чтобы сделать данные в них более организованными, структурированными и легко управляемыми. Это помогает избежать избыточности информации и дублирования данных, что делает базу данных более эффективной, улучшает производительность и уменьшает вероятность возникновения ошибок. Нормализация также способствует обеспечению целостности данных, что означает, что данные в базе остаются точными, актуальными и надежными во всех условиях.
Существует несколько нормальных форм и мы рассмотрим их все в серии постов.
Первая нормальная форма базы данных требует, чтобы каждая ячейка таблицы содержала только одно значение одного типа данных и чтобы каждая запись была уникальной.
Пример без нормализации:
Предположим, у нас есть таблица
students, содержащая информацию о студентах и курсах, на которых они учатся.
| name | courses |
|----------|------------------|
| Алиса | Математика, Физика |
| Боб | Физика, Химия |
В этом примере информация о курсах хранится в одной колонке courses, что является нарушением нормализации.
С нормализацией:
Чтобы привести таблицу к 1NF, мы разделим колонку courses на отдельные строки, каждая из которых содержит только один предмет:
| name | courses |
|--------|-----------|
| Алиса | Математика|
| Алиса | Физика |
| Боб | Физика |
| Боб | Химия |
Теперь каждая колонка содержит только одно значение, и таблица соответствует требованиям 1NF.
🫡 Секреты Java
#sql #1nf7 991
Невозможно написать чистый код, действуя по списку правил. Нельзя стать мастером, изучив набор приемов. Профессионализм и мастерство формируются на основе ценностей, которые определяют дисицплину.© Роберт Мартин 🫡 Секреты Java #quotes
7 991
Каналы любого уважающего себя разработчика:
Java Developer — поможет узнать обо всех тонкостях и секретах языка Java.
Python Developer — научит программировать на Python как настоящий разработчик.
Подписывайся и прокачивай свои навыки👇🏻
7 991
⚡ Когда мне говорят, что Java слишком простой язык, я показываю канал Java Learning
Здесь я научился:
▪️ Разрабатывать высоконагруженные серверные приложения
▪️ Управлять сложными базами данных
▪️ Организовывать эффективную многопоточную обработку данных
▪️ Проходить технические собеседования в ведущие IT-компании
Самый необычный канал про Java, подписывайся – @Java_per_month
7 991
✅ Протокол HTTP простыми словами
Протокол HTTP, что означает Hypertext Transfer Protocol (Протокол передачи гипертекста) - сетевой протокол прикладного уровня, который изначально предназначался для запроса у серверов документов в формате HTML, а позже стал универсальным протоколом взаимодействия в интернете.
HTTP основан на модели клиент-сервер и предполагает обмен информацией в виде запросов и ответов.
В рамках этого протокола, клиент отправляет запрос серверу, запрашивая определенные данные или ресурсы, а сервер отвечает на этот запрос, предоставляя необходимые данные или выполняя запрошенные операции.
Основные понятия:
▫️Сервер: Это компьютер, который хранит данные или ресурсы и отправляет их по запросу. Он "слушает" запросы от клиентов и отправляет им нужные данные в ответе.
▫️Клиент: Это ваш браузер, приложение, или другой сервис, который отправляет запросы серверу, когда нужно получить какие-то данные от него.
▫️URL (Uniform Resource Locator): Это веб-адрес, по которому находится какой-то ресурс (та же веб-страница). Например,
https://www.example.com/resource - это URL.
▫️HTTP-запрос: Когда вы вводите URL в браузер, он отправляет HTTP-запрос на сервер, запрашивая данные (например, HTML-страницу).
▫️HTTP-ответ: После получения запроса сервер отправляет HTTP-ответ обратно клиенту. Этот ответ может содержать запрошенную веб-страницу, изображения или другие данные.
▫️Методы HTTP: Это способы, с помощью которых клиент может взаимодействовать с сервером. Например, метод GET используется для получения данных, а метод POST - для отправки данных на сервер (например, когда вы отправляете форму).
▫️Статусы HTTP: Это числовые коды, которые сообщают клиенту о том, что произошло с запросом. Например, код "200" означает успешный запрос, а "404" - что ресурс не найден.
HTTP позволяет веб-страницам и другим данным передаваться по всему миру, обеспечивая связь между серверами и клиентами.
🫡 Секреты Java
#http #protocol