Telegram Web Link
🗑Кэширование Redis для максимальной производительности в Spring Boot и Java

Настройка приложения Spring Boot
Для начала создайте новое приложение Spring Boot с помощью Spring Initializr. Добавьте следующие зависимости:

Web;
JPA;
Lombok;
Redis.

Вы можете создать проект и импортировать его в любимую IDE.

Настройка кэша Redis
Прежде чем использовать Redis в качестве кэша в приложении, его нужно настроить. Сначала добавьте следующие свойства в файл application.properties:

spring.redis.host=localhost
spring.redis.port=6379


Далее создайте класс конфигурации RedisCacheConfig:
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory(new RedisStandaloneConfiguration(redisHost, redisPort));
}
@Bean
public RedisCacheManager cacheManager() {
return RedisCacheManager.builder(jedisConnectionFactory()).build();
}
}


Этот класс включает поддержку кэширования и настраивает бины (объекты) JedisConnectionFactory и RedisCacheManager.

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

Сначала создадим сущность User:
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
}


Теперь создадим интерфейс UserRepository:
public interface UserRepository extends JpaRepository<User, Long> {}

Далее создаем UserService:

@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Cacheable(value = "users", key = "#id")
public User findById(Long id) {
return userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("User not found"));
}
}

Аннотация @Cacheable указывает на то, что результат метода findById должен быть кэширован. Атрибут value определяет имя кэша, а атрибут key  — ключ кэша.

Способы вытеснения кэша 👇

Читать продолжение

@javatg
🔥 Подборка обучающих каналов для программистов.

🖥 Machine learning
ai_ml – крупнейши канал по ии, нейросетям и науке о данных.
datasc - дата сайнс обучение самой востребованной профессии.
@bigdatai - Big Data

@machinelearning_ru – гайды по машинному обучению
@machinelearning_interview – подготовка к собеседованию мл.
@datascienceiot – бесплатные книги ds
@ArtificialIntelligencedl – ИИ

@machinee_learning – чат о машинном обучении
@datascienceml_jobs - вакансии ds, ml
@Machinelearning_Jobs - чат с вакансиями

🖥 Python
@pythonl - крупнейший канал для Python программистов.
@pro_python_code – учим python с ментором.
@python_job_interview – подготовка к Python собеседованию.
@python_testit - проверочные тесты на python
@pythonlbooks - современные книги Python
@python_djangojobs - работа для Python программистов
@python_django_work - чат обсуждения вакансий

#️⃣ c#
C# - канал для изучения C# на практике.
@csharp_cplus - C# чат
@csharp_1001_notes - инструменты C#

🖥 C++
@cpluspluc - C++ кодинг


🖥 SQL базы данных

@sqlhub - Повышение эффективности кода с грамотным использованием бд.
@chat_sql - чат изучения бд.

👣 Golang
@Golang_google - восхитительный язык от Google, мощный и перспективный.
@golang_interview - вопросы и ответы с собеседований по Go. Для всех уровней разработчиков.
@golangtests - интересные тесты и задачи GO
@golangl - чат изучающих Go
@GolangJobsit - отборные вакансии и работа GO
@golang_jobsgo - чат для ищущих работу.
@golang_books - полезные книги Golang
@golang_speak - обсуждение языка Go
@golangnewss - новости go

🖥 Linux
linux - kali linux ос для хакинга
linux chat - чат linux для обучения и помощи.
@linux_read - бесплатные книги linux

🖥 Javascript / front

@react_tg - - 40,14% разработчиков сайтов использовали React в 2022 году - это самая популярная библиотека для создания сайтов.
@javascript -канал для JS и FrontEnd разработчиков. Лучшие практики и примеры кода. Туториалы и фишки JS
@Js Tests - каверзные тесты JS
@hashdev - погружение в web разработку.
@javascriptjobjs - отборные вакансии и работа FrontEnd.
@jsspeak - чат поиска FrontEnd работы.

🖥 Java
@javatg - выучить Java с senior разработчиком на практике
@javachats - чат для ответов на вопросы по Java
@java_library - библиотека книг Java
@android_its - Android разработка
@java_quizes - тесты Java
@Java_workit - работа Java
@progersit - шпаргалки ит

👷‍♂️ IT работа

https://www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi -ит каналы по яп с вакансиями

🤡It memes
@memes_prog - ит-мемы

⚙️ Rust
@rust_code - Rust избавлен от болевых точек, которые есть во многих современных яп
@rust_chats - чат rust

📓 Книги

https://www.tg-me.com/addlist/HwywK4fErd8wYzQy - актуальные книги по всем яп

⭐️ Нейронные сети
@vistehno - chatgpt ведет блог, решает любые задачи и отвечает на любые ваши вопросы.
@aigen - сети для генерации картинок. видео, музыки и многого другого.
@neural – погружение в нейросети.

📢 English for coders

@english_forprogrammers - Английский для программистов

🖥PHP
@phpshka - PHP академия для программистов.

🖥 Devops
Devops - канал для DevOps специалистов.

🔥 Папки для программитов

https://www.tg-me.com/addlist/_FjtIq8qMhU0NTYy - машинное обучение, нейросети, глубокое обучение

https://www.tg-me.com/addlist/eEPya-HF6mkxMGIy - папка для Python разработчиков

https://www.tg-me.com/addlist/MUtJEeJSxeY2YTFi - папка для Golang разработчиков
Please open Telegram to view this post
VIEW IN TELEGRAM
📕 Изучение Stream API и управляющие конструкции в Java

1️⃣ Stream API. Java. Максимально простым языком

Посмотрев видео, любой новичок, изучающий язык Java, получит четкое понимание, что такое Stream API и как применять эту библиотеку при работе с кодом.

2️⃣ Управляющие конструкции в Java

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

3️⃣ Примитивные типы данных

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

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Project Loom и Spring Boot: тесты производительности

Сегодня я хочу выяснить, готов ли Project Loom заменить Spring WebFlux при создании высоконагруженных приложений с высокой пропускной способностью.

Проблемы реактивного подхода
WebFlux - замечательная технология с фантастической производительностью, однако:

При использовании реактивного подхода код сложнее писать и сопровождать
Стектрейсы малополезны при разборе ошибок
Все связанные клиенты/библиотеки также должны быть написаны в реактивном стиле

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

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🗄Создание аннотаций с использованием Reflection API.

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

Как с помощью аннотации можно проверять электронную почту?
Для этого сначала создадим аннотацию Email:

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Email {
}


Чтобы объявить аннотацию, используйте ключевое слово @interface. В Target было объявлено, что оно будет использоваться в полях (fields), а в Retention объявлено, что оно будет использоваться во время выполнения (runtime).

Теперь воспользуемся этой аннотацией. Давайте создадим класс Person с двумя полями: age и email.
public class Person {
private String name;

@Email
private String email;

public Person(String name, String email) {
this.name = name;
this.email = email;
}

public String getName() {
return name;
}

public String getEmail() {
return email;
}
}



Обратите внимание, что электронное письмо снабжено аннотацией @Email. Теперь создадим класс ValidateUtil, который будет проверять электронную почту с помощью Reflection API.
public class ValidateUtil {

public static void validate(Object object) throws IllegalAccessException {

Class<?> class = object.getClass();
for(Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
if(field.isAnnotationPresent(Email.class)) {
validateEmail(field, object);
}
}
}

private static void validateEmail(Field field, Object object) throws IllegalAccessException {
Pattern pattern = Pattern.compile("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$");
String email = (String) field.get(object);
if(isNotMatching(pattern, email)) {
throw new InvalidEmailException("Email " + email + " is invalid");
}
}

private static boolean isNotMatching(Pattern pattern, String value) {
return !pattern.matcher(value).matches();
}
}


В методе validate он берет объект, перебирает все поля, устанавливает их как доступные и проверяет, имеет ли поле аннотацию Email. Если аннотация есть, то он вызывает метод validateEmail.

Продолжение

@javatg
⚡️ 6 лучших ресурсов для изучения Java в 2023 году

Java - один из самых популярных и универсальных языков программирования в мире. Он используется в различных областях - от веб-разработки до создания мобильных приложений и игр. Независимо от того, являетесь ли вы опытным программистом или только начинаете, Java - это отличный язык, который необходимо иметь в своем арсенале.

1️⃣ Официальные учебники Oracle по Java

2️⃣ Курс Codecademy по изучению Java

3️⃣ Coursera: Программирование на Java и основы программной инженерии

4️⃣ Udemy: Мастер-класс по программированию на Java для разработчиков программного обеспечения

5️⃣ YouTube: курс JAVA

6️⃣ Java курс 2023

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Полный список сайтов с практическимим задачами для программистов.

Любите битвы роботов? Тогда игра Robocode для вас. Вы научитесь программировать, создавая боевых роботов-танков на Java или .NET. Когда вы создадите робота, на экране в реальном времени начнётся битва.

Edabit.com - 350+ практических задач по C#

C Puzzles - cайт с головоломками на языке С. Может быть полезен и тем, кто не знает C, но изучает С-подобные языки.

Codeforces — платформа для алгоритмических соревнований. Проводит контесты и раунды с 5 задачами на 2 часа. Есть система рейтинга и два дивизиона. Задачи можно решать и проверять после соревнования. Также есть доступ к тренировкам с задачами с прошлых соревнований.

SQLEx- большой кладез знаний для тех, кто изучает SQL. Множество упражнений для отработки навыков и рейтинг участников.

HackerRank - сайт будет больше интересен продвинутым программистам, которые уже многое умеют. На этом сайте собрано множество задач на самые разные разделы Computer Science: традиционная алгоритмика, ИИ, машинное обучение и т.д. Если вы решите много задач, то вами могут заинтересоваться работодатели, регуляторно мониторящие эту платформу.

C# задачи для начинающих - помощь в решении задач. Готовые программы.

Codewars — популярный cборник задач на разные темы, от алгоритмов до шаблонов проектирования.

LeetCode — известный сайт с задачами для подготовки к собеседованиям. Можно пообщаться и посмотреть решения других программистов.

Timus Online Judge — русскоязычная (хотя английский язык также поддерживается) платформа, на которой более тысячи задач удачно отсортированы по темам и по сложности.

TopCoder - популярная американская платформа. Она проводит алгоритмические контесты, а также соревнования по промышленному программированию и марафоны, где задачи требуют исследования и нет единого верного алгоритма. Участникам даются недели на решение таких задач.

informatics.mccme.ru - платформа с теоретическим материалом и задачами, удобно разделенными по категориям. Большая база задач с олимпиад школьников также доступна.

SPOJ - большой англоязычный сайт с 20000+ задачами на разные темы: DP, графы, структуры данных и др. Иногда проводят неинтересные контесты, если не из страны их проведения.

CodeChef — менее крупный аналог Codeforces и TopCoder, тоже с огромным архивом задач и регулярными контестами.

Project Euler - сборник 500 задач, проверяющих знание математических алгоритмов. Часто используется на собеседованиях, чтобы оценить алгоритмическую подготовку кандидата.

Kaggle - соревнования по анализу данных.

Golang tests - канал с тестами по Go

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

Al Zimmermann’s Programming Contests — платформа, на которой регулярно проводятся контесты с задачами на исследование и оптимизацию. Интересен тем, что писать программу необязательно — даются только тестовые данные. Ответы можно расчитывать вручную, или просто гадать их на кофейной гуще.

Programming Praxis — сайт, где можно найти много интересных задач.

CheckIO — сайт с задачами для программистов всех уровней, который вы проходите в виде игры.

Ruby Quiz — сайт с задачами для программистов на Ruby, но решения можно писать и на других языках.

Prolog Problems — Подборка задач для программистов, использующих Prolog.

Сборник задач от СppStudio - задачи на С++, но их можно и на других языках.

Operation Go — практика написания кода на Go в форме браузерной игры.

Empire of Code — сайт для программистов, где необходимо писать код, реализующий стратегию и тактику виртуальных бойцов.

@javatg
⭐️ Корутины в Kotlin

Корутины — одна из важнейших фич Kotlin, которая даёт очень удобный и простой способ работы с многопоточность.

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

В этой серии стате вы узнаете всё, что разработчик Kotlin должен знать о корутинах:

https://maxkim.eu/series/kotlin-coroutines

#kotlin

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое атомарные переменные в Java.

В Java атомарные переменные находятся в пакете java.util.concurrent.atomic. Учитывая, что они предлагают потокобезопасное программирование без блокировок, это повышает эффективность и предотвращает тупиковые ситуации, которые могут возникнуть при использовании традиционных методов синхронизации.

Атомарная операция неделима. Это означает, что как только операция начинает выполняться, она выполняется до завершения, не прерываясь другим потоком. Эта атомарность жизненно важна для параллельного программирования, поскольку помогает предотвратить состояние гонки.

В качестве примера рассмотрим операцию приращения (increment operation):
count++;

Атомарные классы Java:

▪️AtomicInteger
▪️AtomicLong
▪️AtomicBoolean
▪️AtomicReference
И другие…

Давайте рассмотрим пример с использованием AtomicInteger:
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();


В этом примере incrementAndGet() является атомарной операцией. Она увеличивает значение count на единицу и возвращает обновленное значение. Независимо от того, сколько потоков одновременно вызывает этот метод, он всегда будет правильно увеличивать count.

📌 Преимущества использования атомарных переменных

@javatg
🖥 Магия 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
2025/07/07 07:17:47
Back to Top
HTML Embed Code: