Java Portal | Программирование
12.3K subscribers
1.34K photos
108 videos
42 files
1.35K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Spring Boot: можно валидировать конфигурационные классы с помощью аннотации @Validated.

Это позволяет приложению падать на старте (fail fast), если конфигурация некорректна.

@Validated
@ConfigurationProperties(prefix = "app")
public class AppProperties {

@NotBlank
private String name;

@Min(1)
@Max(60)
private int timeout;

// getters/setters
}


#SpringBoot #JavaDev

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93
Spring Boot: Лучше использовать SpringBootTest.WebEnvironment.RANDOM_PORT вместо жёстко заданных портов в тестах, чтобы избежать конфликтов.

#SpringBoot #JavaDev

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3
По умолчанию Spring Boot не включает stacktrace в ответах REST-сервисов. Только для целей быстрого дебага (не используйте это в production) можно включить это через конфигурационное свойство include-stacktrace: always.
#SpringBoot #JavaDev

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Spring Boot: есть возможность использовать стриминг (Stream<T>) для запросов с большими наборами данных.

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

В следующем примере есть приложение с 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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍2
Java: используйте WeakHashMap для кэширования, когда ключи без ссылок должны удаляться сборщиком мусора.

В HashMap, пока существует сама мапа, ключи и связанные с ними значения не будут удаляться сборщиком мусора.

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

Пример:

Map<User, String> map = new WeakHashMap<>();

User u1 = new User("Mick");
map.put(u1, "Cached data");
...
u1 = null;

// С этого момента ключ u1 доступен для сборки мусора.


#Java #JavaDev

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥73
Java: Если нужно читать небольшие файлы, можно использовать Files.readAllLines() — это более прямой и простой способ.
#SpringBoot #JavaDev

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: можно добавить глобальные метаданные OpenAPI через аннотацию @OpenAPIDefinition.

Её размещают на основном классе приложения Spring Boot или в отдельном конфигурационном классе.

#SpringBoot #JavaDev

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Java: начиная с Java 14 можно использовать records для создания коротких неизменяемых объектов, предназначенных для хранения данных.

короче обычных POJO
имеют встроенные equals(), hashCode(), toString()
по умолчанию неизменяемые

#JavaDev #Records

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Совет по Java

Используйте осмысленные имена методов, которые отражают их назначение.

#JavaDev #CleanCode

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5