Java 21 открывает новую эпоху конкурентности с виртуальными потоками — лёгкими потоками, управляемыми JVM, которые значительно повышают производительность I/O-bound приложений.
Подробнее - https://lttr.ai/Ap1Np
#Java #MongoDB #VirtualThread
👉 Java Portal
Подробнее - https://lttr.ai/Ap1Np
#Java #MongoDB #VirtualThread
Please open Telegram to view this post
VIEW IN TELEGRAM
DEV Community
Java Virtual Threads in Action: Optimizing MongoDB Operation
This article was written by Otavio Santana, a renowned contributor to the Java and open-source...
❤2
Spring Boot: можно валидировать конфигурационные классы с помощью аннотации
✅ Это позволяет приложению падать на старте (fail fast), если конфигурация некорректна.
#SpringBoot #JavaDev
👉 Java Portal
@Validated.@Validated
@ConfigurationProperties(prefix = "app")
public class AppProperties {
@NotBlank
private String name;
@Min(1)
@Max(60)
private int timeout;
// getters/setters
}
#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3
#Java Совет: вы можете откатить транзакцию БД, созданную аннотацией
👉 Java Portal
@Transactional, получив текущий TransactionStatus через класс TransactionAspectSupport и установив для него rollback через setRollbackOnly();. Таким образом, не нужно выбрасывать исключение.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥1🤣1
Spring Boot: лучше избегать логирования внутри плотных циклов, так как это может повлиять на производительность приложения и привести к засорению лог-файлов.
Пример:
Если
Если логировать всё же нужно, лучше использовать уровень
Также можно добавить проверку, если требуется выполнить нетривиальные вычисления:
👉 Java Portal
Пример:
for (Order order : orders) {
log.info("Order {}", order.getId());
process(order);
}Если
orders большой, это может замедлить обработку и засорить лог-файлы.Если логировать всё же нужно, лучше использовать уровень
debug:log.debug("Order: {}", order.getId());Также можно добавить проверку, если требуется выполнить нетривиальные вычисления:
if (log.isDebugEnabled()) {
log.debug("Order: {}", expensiveElaboration());
}Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
👍4❤3
Java API Tip
Безопасное приведение
Используй
Без него преобразование произойдёт молча — и ты можешь получить некорректный результат без всяких ошибок.
Используй
👉 Java Portal
Безопасное приведение
long к intИспользуй
Math.toIntExact() — этот метод возвращает значение long, но выбрасывает ArithmeticException, если оно не помещается в intБез него преобразование произойдёт молча — и ты можешь получить некорректный результат без всяких ошибок.
Используй
toIntExact, когда важно контролировать переполнениеPlease open Telegram to view this post
VIEW IN TELEGRAM
❤5
@RestController вместо @Controller + @ResponseBody@RestController — это мета-аннотация, которая включает @ResponseBody, и затем автоматически применяется ко всем методам:@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
}
@Controller и @ResponseBody:@Controller
public class MyController {
@ResponseBody
@GetMapping("/hello")
public String hello() {
return "Hello!";
}
}
@RestController:@RestController
public class MyController {
@GetMapping("/hello")
public String hello() {
return "Hello!";
}
}
#SpringBoot #CleanCode
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
В SpringFramework 7.1 появится поддержка
Это работает с конструкторами в Java, но ещё удобнее с компактными конструкторами в Kotlin. Также это работает с так называемыми «test records» в Java.🤓
👉 Java Portal
@MockitoBean и @MockitoSpyBean на параметрах конструктора тестаЭто работает с конструкторами в Java, но ещё удобнее с компактными конструкторами в Kotlin. Также это работает с так называемыми «test records» в Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🔥1🤔1
Spring Boot: Лучше использовать
#SpringBoot #JavaDev
👉 Java Portal
SpringBootTest.WebEnvironment.RANDOM_PORT вместо жёстко заданных портов в тестах, чтобы избежать конфликтов.#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
Прогрессивный практический туториал по изучению Agent Client Protocol (ACP) с использованием Java SDK: https://github.com/markpollack/acp-java-tutorial
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - markpollack/acp-java-tutorial: Progressive tutorial for learning the ACP Java SDK
Progressive tutorial for learning the ACP Java SDK - markpollack/acp-java-tutorial
❤4
По умолчанию Spring Boot не включает stacktrace в ответах REST-сервисов. Только для целей быстрого дебага (не используйте это в production) можно включить это через конфигурационное свойство
#SpringBoot #JavaDev
👉 Java Portal
include-stacktrace: always.#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
15 апреля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Виктору
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Освой Java с нуля
Этот бесплатный курс охватывает широкий спектр тем, начиная от базовых концепций, таких как переменные, массивы, условные операторы и циклы, до более сложных аспектов, включая ООП, работу с файлами, двумерные массивы и работу с базами данных.
Материалы включают теоретические объяснения, практические примеры кода, и иногда задачи для самостоятельного выполнения
⛓ Ссылка: тык
👉 Java Portal
Этот бесплатный курс охватывает широкий спектр тем, начиная от базовых концепций, таких как переменные, массивы, условные операторы и циклы, до более сложных аспектов, включая ООП, работу с файлами, двумерные массивы и работу с базами данных.
Материалы включают теоретические объяснения, практические примеры кода, и иногда задачи для самостоятельного выполнения
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: есть возможность использовать стриминг (Stream<T>) для запросов с большими наборами данных.
Результаты подтягиваются чанками, при этом в памяти одновременно находится только небольшая часть данных
В следующем примере есть приложение с
Метод
Важные моменты:
- Нужно использовать транзакцию, иначе соединение может закрыться раньше времени и стрим оборвётся
- Рекомендуется задать размер выборки через
- Стрим удерживает ресурсы базы данных, его обязательно нужно закрывать (через try-блок, как в примере)
#SpringBoot #JavaDev
👉 Java Portal
Результаты подтягиваются чанками, при этом в памяти одновременно находится только небольшая часть данных
В следующем примере есть приложение с
CommandLineRunner, которое сохраняет большой набор пользователей в базу данных, а затем обрабатывает данные через стрим:@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
CommandLineRunner run(UserRepository repo, UserService service) {
return args -> {
// Генерация тестовых данных
for (int i = 1; i <= 10000; i++) {
repo.save(new User("User_" + i));
}
// Обработка через стрим
service.processUsers();
};
}
}
Метод
processUsers работает в транзакции и использует метод репозитория streamAllUsers, который возвращает стрим:@Service
public class UserService {
private final UserRepository repository;
@PersistenceContext
private EntityManager em;
public UserService(UserRepository repository) {
this.repository = repository;
}
@Transactional(readOnly = true)
public void processUsers() {
AtomicInteger counter = new AtomicInteger();
try (Stream<User> stream = repository.streamAllUsers()) {
stream.forEach(user -> {
System.out.println(user.getName());
if (counter.incrementAndGet() % 100 == 0) {
em.clear();
}
});
}
}
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u")
Stream<User> streamAllUsers();
}Важные моменты:
- Нужно использовать транзакцию, иначе соединение может закрыться раньше времени и стрим оборвётся
- Рекомендуется задать размер выборки через
spring.jpa.properties.hibernate.jdbc.fetch_size=100, так как некоторые драйверы могут загрузить всё сразу- Стрим удерживает ресурсы базы данных, его обязательно нужно закрывать (через try-блок, как в примере)
#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Java: используйте WeakHashMap для кэширования, когда ключи без ссылок должны удаляться сборщиком мусора.
❌ В HashMap, пока существует сама мапа, ключи и связанные с ними значения не будут удаляться сборщиком мусора.
✅ В WeakHashMap ключи хранятся через слабые ссылки, и если на ключ больше нет сильных ссылок в программе, сборщик мусора может его удалить, и он автоматически исчезнет из мапы.
✅ Пример:
#Java #JavaDev
👉 Java Portal
Map<User, String> map = new WeakHashMap<>();
User u1 = new User("Mick");
map.put(u1, "Cached data");
...
u1 = null;
// С этого момента ключ u1 доступен для сборки мусора.
#Java #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤2
🇷🇺Разбираешься в радиочипах, оптике и связи? Забери до 2 000 000 рублей за свои инженерные навыки на турнире «Дронкон»🇷🇺
«Сталинские Соколы» открывают регистрацию на 3-й Всероссийский турнир «Дронкон», который пройдет с 8 по 14 мая.
2 направления для победы:
- Инженерное дело: беспроводная связь, радиочипы и оптические системы + стратегия «Битва Дронов»;
- Пилотирование: War Thunder, GeoGuessr и FPV-гонки + стратегия «Битва Дронов».
Призовой фонд для победителей одной дисциплины:
🥇место – 2 000 000 рублей
🥈место – 1 500 000 рублей
🥉место – 1 000 000 рублей
Награда за 4-8 места - 150 000 рублей
Пройди заочный онлайн-этап и получи путевку на очный этап турнира в Республику Татарстан!
Перелет, питание, проживание - за счет организаторов.
🇷🇺 Подать заявку и узнать подробности 🇷🇺
«Сталинские Соколы» открывают регистрацию на 3-й Всероссийский турнир «Дронкон», который пройдет с 8 по 14 мая.
2 направления для победы:
- Инженерное дело: беспроводная связь, радиочипы и оптические системы + стратегия «Битва Дронов»;
- Пилотирование: War Thunder, GeoGuessr и FPV-гонки + стратегия «Битва Дронов».
Призовой фонд для победителей одной дисциплины:
🥇место – 2 000 000 рублей
🥈место – 1 500 000 рублей
🥉место – 1 000 000 рублей
Награда за 4-8 места - 150 000 рублей
Пройди заочный онлайн-этап и получи путевку на очный этап турнира в Республику Татарстан!
Перелет, питание, проживание - за счет организаторов.
🇷🇺 Подать заявку и узнать подробности 🇷🇺
💊12
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣26🔥3🏆2
Совет по Java Spring Boot
Если в JSON-запросе приходят лишние поля, приложение может упасть с ошибкой
Чтобы этого избежать и не ломать API, добавь аннотацию:
👉 Java Portal
Если в JSON-запросе приходят лишние поля, приложение может упасть с ошибкой
UnrecognizedPropertyException.Чтобы этого избежать и не ломать API, добавь аннотацию:
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDTO {
private String name;
private int age;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Поставлено в JDK 22: JEP 454 добавил в Java стандартный API для работы с внешними функциями и памятью. Вызов нативного кода больше не обязан начинаться с шаблонного кода JNI. Небольшой пример 👇
Please open Telegram to view this post
VIEW IN TELEGRAM