Telegram Web Link
🖥 Магия Spring Framework своими руками

Мотивация
Spring Framework позволяет сфокусироваться на бизнес-логике, а вся настройка инфраструктуры выполняется силами самого фреймворка. Так, например, разработчик вешает аннотацию @RestController на бин, и бин начинает обрабатывать REST запросы, при этом разработчик не трогает Servlet Context, не настраивает цепочку фильтров или веб сервер: все конфигурируется автоматически. Автоматическая настройка инфраструктуры выполняется благодаря постобработке бинов. Зачастую для реализации дополнительной функциональности применяется Spring AOP - аспектно-ориентированное программирование.

Spring AOP удобен, когда необходимо выполнить код перед, после или вместо вызова метода бина. Управление транзакциями - классический пример использования Spring AOP: начать транзакцию перед вызовом метода и зафиксировать ее после завершения метода.

Spring AOP бин, который накручивает дополнительную функциональность другим Spring бинам, помечается аннотацией @Aspect, но как потом этот бин используется для добавления дополнительной функциональности в поток исполнения? Все работает благодаря тому, что в жизненный цикл бина можно вклиниться при помощи BeanPostProcessor.

📌Читать полностью
📌Код

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Шаблон проектирования объектный пул на Java

Объектный пул (англ. object pool) — порождающий шаблон проектирования, набор инициализированных и готовых к использованию объектов. Когда системе требуется объект, он не создаётся, а берётся из пула. Когда объект больше не нужен, он не уничтожается, а возвращается в пул.

Паттерн объектный пул обычно используется в случаях, где вызов объектов является дорогостоящим, а объекты можно эффективно использовать повторно. К числу таких примеров относятся:

1. Соединения с базами данных: Управление пулом соединений с базами данных позволяет повысить производительность приложений, взаимодействующих с базами данных.

2. Пул потоков: в многопоточных приложениях повторное использование потоков из пула потоков позволяет избежать накладных расходов на создание новых потоков для каждой задачи.

3. Сетевые соединения: В сетевом программировании управление пулом сетевых соединений может привести к более эффективному использованию ресурсов.

Теперь рассмотрим пример использования паттерна в Java для создания простого пула объектов Connection.

В этом примере (смотри картинку) мы создали простой класс `ConnectionPool` для управления пулом соединений с базой данных. При создании объекта `ConnectionPool` пул инициализируется с заданным количеством соединений. Клиенты могут запрашивать соединения из пула с помощью метода `getConnection()` и освобождать их обратно в пул с помощью метода releaseConnection(), когда они закончили их использовать.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Лучшие практики написания кода в Spring Boot

Spring Boot — это широко используемый и очень популярный высокопроизводительный фреймворк корпоративного уровня. Практики и советы, приведенные в этой статье, помогут улучшить приложение Spring Boot и сделать его более эффективным.

Применяйте надлежащий стиль упаковки

Надлежащая упаковка помогает легко понять код и поток приложения. Это позволяет успешно структурировать приложение.

Вы сможете распределить по отдельным пакетам все контроллеры, сервисы, утилитарные классы и т. д. Такой стиль очень удобен в небольших микросервисах.

При работе с огромной кодовой базой полезно использовать функционально-ориентированный подход. Вы можете принять решение в зависимости от требований проекта — на основе типов или на основе функций.
*Пример в изображении.

Используйте паттерны проектирования

Паттерны проектирования — безупречная практика. С проверенными шаблонами у вас не будет поводов для недовольства. Но вам необходимо определить место использования шаблонов.

👇
ЧИТАТЬ

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Шпаргалка по структурам данных в Java

К каждому собеседованию важно готовиться и проще всего это делать, когда перед глазами есть готовый материал. В данной публикации я хочу поделиться с вами своей шпаргалкой, которую использую перед собеседованиями для повторения структур данных в Java.

Что такое структуры данных, для чего они и какие есть в Java?


Под структурами данных подразумевается хранение данных и их организация таким образом, чтобы решать поставленную задачу наиболее эффективным способом.

В Java есть следующие структуры данных:

Массив
Список (Динамический массив)
Стек
Очередь
Связный список
HashTable и HashMap
Дерево

📌 Читать полностью

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Руководство по созданию мультиплатформенного проекта Kotlin с помощью Kobweb

Kobweb — это фреймворк Kotlin для создания сайтов и веб-приложений, построенный поверх Compose HTML, а также немного Next.js и Chakra UI.

✔️Смотреть

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️Маст-хэв список для программистов, каналы с последними книжными новинками, библиотеками, разбором кода и актуальной информацией, связанной с вашим языком программирования.
Лучший способ получать свежие обновлении и следить за трендами в разработке.

Машинное обучение: www.tg-me.com/ai_machinelearning_big_data
Python: www.tg-me.com/pythonl
C#: www.tg-me.com/csharp_ci
C/C++/ www.tg-me.com/cpluspluc
Data Science: www.tg-me.com/data_analysis_ml
Devops: www.tg-me.com/devOPSitsec
Go: www.tg-me.com/Golang_google
Базы данных: www.tg-me.com/sqlhub
Rust: www.tg-me.com/rust_code
Javascript: www.tg-me.com/javascriptv
React: www.tg-me.com/react_tg
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Мобильная разработка: www.tg-me.com/mobdevelop
Linux: www.tg-me.com/+A8jY79rcyKJlYWY6
Big Data: www.tg-me.com/bigdatai
Хакинг: www.tg-me.com/linuxkalii
Тестирование: https://www.tg-me.com/+F9jPLmMFqq1kNTMy
Java: www.tg-me.com/javatg

💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy

Папка машинное обучение: https://www.tg-me.com/addlist/_FjtIq8qMhU0NTYy

📕 Бесплатные Книги для программистов: https://www.tg-me.com/addlist/YZ0EI8Ya4OJjYzEy

🎞 YouTube канал: https://www.youtube.com/@uproger

😆ИТ-Мемы: www.tg-me.com/memes_prog

🇬🇧Английский: www.tg-me.com/english_forprogrammers
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код ?

class Test
{
boolean[] array = new boolean[3];
int count = 0;

void set(boolean[] arr, int x)
{
arr[x] = true;
count++;
}

void func()
{
if(array[0] && array[++count - 2] | array [count - 1])
count++;

System.out.println("count = " + count);
}


public static void main(String[] args)
{
Test object = new Test();
object.set(object.array, 0);
object.set(object.array, 1);
object.func();
}
}


Пишите свое решение в комментариях👇

@javatg
Как Spring Framework реализует паттерн Dependency Injection?

Инверсия контроля (inversion of control, IoC) – принцип проектирования, по которому контроль над потоком управления передается фреймворку. Управляющий и прикладной код разделяются. При разработке модуля этот подход избавляет от необходимости знать о других модулях программы и деталях их взаимодействия. Такой код становится более переипользуемым и модульным, уменьшает связность.

Внедрение зависимостей (Dependency Injection, DI) – одна из реализаций IoC. При взаимодействии с другими модулями, программа оперирует высокоуровневыми абстракциями, тогда как конкретная её реализация поставляется фреймворком.

Стандартная реализация DI – фреймворк инстанциирует все сервисы, и складывает их в IoC-контейнер. При этом специальная сущность, Service Locator, занимается поиском соответствия реализаций абстракциям и их внедрением.

Spring – большой набор различных библиотек. DI реализуется одной из основных библиотек – Spring IoC.

Сущности бизнес-логики в Spring, как и в JavaEE называются beans. Бины объявляются различными способами, корни большинства из них лежат в понятии Configuration. В качестве контейнера бинов выступает ApplicationContext. Чтобы передать инициализацию зависимости контексту, она помечается аннотацией
@Autowired.

@javatg
🖥Spring Security в деталях

Аутентификация - Spring Security в деталях
Получение информации о пользователе - Spring Security в деталях
Ещё один способ получения аутентифицированного пользователя #java #springsecurity
Точки входа аутентификации - Spring Security в деталях
Источники информации о пользователях - Spring Security в деталях
Устаревшие DSL в Spring Security 6.1
Отладка контекста безопасности - Spring Security в деталях
DSL и конфигураторы контекста безопасности - Spring Security в деталях
Фильтры безопасности - Spring Security в деталях

📌 источник

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20 приемов кода Java, которые помогут повысить вашу производительность

1. Используйте расширенный цикл for.
Расширенный цикл for, также известный как цикл for-each, позволяет перебирать массивы или коллекции без ручного управления индексами. Это упрощает код и делает его более читабельным. Взглянем на пример:

int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
// Делаем что-то с number
}
2. Используйте Java Stream API.
Stream API, представленный в Java 8, расширяет возможности при выполнении операций обработки коллекций. Он позволяет выполнять такие действия, как фильтрация, сопоставление и сокращение, более лаконичным образом. Потоки могут улучшить читаемость кода и уменьшить количество шаблонов. Например:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(n -> n)
.sum();

3. Пользуйтесь преимуществом ключевого слова var (Java 10+).
Ключевое слово var позволяет вам объявлять переменные с неявным выводом типа. Это уменьшает потребность в явном указании типов, делая код более кратким. Еще один пример кода:

var message = "Hello, world!";
var numbers = List.of(1, 2, 3, 4, 5);


4. Используйте StringBuilder для эффективного объединения строк.
При объединении нескольких строк использование класса StringBuilder более эффективно, чем многократное использование оператора v+. StringBuilder позволяет избежать создания ненужных объектов и обеспечивает более высокую производительность. Взгляните на этот код:

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("world");
String result = sb.toString();


5. Применяйте тернарный оператор для кратких условных выражений.
Тернарный оператор (? 🙂 позволяет записывать простые условные выражения в компактной форме. Это может быть полезно для присвоения значений или выполнения простой логики ветвления. Например:


int x = 10;
String message = (x > 5) ? "Greater than 5" : "Less than or equal to 5";
6. Используйте try-with-resources для автоматического управления ресурсами.
При работе с ресурсами, которые реализуют интерфейс AutoCloseable, такими как файловые потоки или соединения с базой данных, лучше использовать оператор try-with-resources, чтобы обеспечить надлежащую очистку ресурсов, не закрывая их явным образом. Посмотрите на пример кода:

try (FileWriter writer = new FileWriter("myfile.txt")) {
//Запись в файл
}
7. Используйте оператор ромба для вывода типа.
Оператор ромба (<>) позволяет опустить аргументы типа при создании экземпляра универсального класса, если тип можно вывести из контекста присваивания. Это уменьшает избыточность и делает код чище. Например:

List<String> names = new ArrayList<>(); // Определение типа для ArrayList

8. Используйте пакет java.time для операций с датой и временем.
В Java 8 появился пакет java.time, который предоставляет более полный и интуитивно понятный API для работы с датой и временем. Он предлагает такие классы, как LocalDate, LocalTime, LocalDateTime и Duration, которые упрощают общие операции с датой и временем.

9. Применяйте ссылки на методы.
Ссылки на методы позволяют обращаться к методу по его имени, не вызывая его. Они могут сделать ваш код более лаконичным и выразительным, особенно при работе с функциональными интерфейсами. Например:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // Ссылка на метод System.out.println


10. Используйте методы по умолчанию (default) в интерфейсах.
Начиная с Java 8, интерфейсы могут иметь методы по умолчанию, которые обеспечивают реализацию по умолчанию (default-реализацию). Методы по умолчанию позволяют добавлять в интерфейсы новые методы, не нарушая существующие реализации. Они могут быть удобны для добавления служебных методов к интерфейсам или обеспечения поведения по умолчанию.

#junior

📌 Читать дальше

@javatg
2024/10/02 20:36:11
Back to Top
HTML Embed Code: