Java Portal | Программирование
13K subscribers
1.2K photos
98 videos
37 files
1.13K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Spring Boot: можно переопределять конфиги на рантайме без перепаковки приложения.

Spring Boot по умолчанию использует лаунчер JarLauncher, который позволяет переопределить дефолтную конфигурацию через параметр loader.path при запуске приложения.

Предположим, у вас есть Spring Boot приложение со следующими зависимостями:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


С application.properties такого вида:

demo.message=Hello from inside the JAR


И простой контроллер:

@RestController
public class HelloController {

@Value("${demo.message}")
private String message;

@GetMapping("/")
public String hello() {
return message;
}
}


Если собрать jar и запустить:

java -jar springboot-propertieslauncher-demo-0.0.1-SNAPSHOT.jar


Открыв [https://localhost:8080](https://localhost:8080) вы получите:

Hello from inside the JAR


Если теперь создать внешний файл application.properties в той же директории, где лежит jar:

demo.message=Hello from outside the JAR


И запустить приложение с параметром loader.path, указывающим на текущую директорию:

java -jar springboot-propertieslauncher-demo-0.0.1-SNAPSHOT.jar --loader.path=.


Перейдя в [https://localhost:8080](https://localhost:8080) будет:

Hello from outside the JAR


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍2
JetBrains вбросили загадку про IntelliJ IDEA. Судя по всему, кто-то пытается незаметно попасть на их день рождения. Команда решила устроить мини-квест: каждый день будет новая задачка, новые подсказки и в итоге надо вычислить тайного гостя вечеринки. 😂

В первом задании предлагают сопоставить сниппеты кода с версиями Java. Там набор вполне узнаваемых фич: var, streams, diamond-оператор, enum и records. Ниже варианты: Java 5, 7, 8, 11, 17 и 21.

Выглядит легко, но подана история забавно, а оформление в стиле карты-загадки.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3
Новый способ регистрировать бины программно начиная со Spring Framework 7 👇👇👇

@Configuration
@Import(ExampleRegistrar.class)
class ExampleConfiguration {
}

class ExampleRegistrar implements BeanRegistrar {

@Override
public void register(BeanRegistry registry, Environment env) {
if (env.matchesProfiles("dev")) {
registry.registerBean(ExampleInMemoryRepository.class);
} else {
registry.registerBean(ExampleRepository.class);
}
}
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥21
В старые времена на Java самое дорогое выражение, которое я видел в проде, выглядело невинно:

→ repository.findAll()

Компилируется, тесты проходит, на QA тоже всё ок потому что данных мало.

А потом в проде прилетает реальный трафик, JVM начинает пухнуть от хипа и p99 улетает в космос. Причина простая — вызов неограниченный по объёму. Без лимитов, без пагинации, без стриминга.

показательный случай про цену подобных ошибок:

• ракета Ariane 5
• стоимость проекта — 370 млн
• в коде было преобразование 64-битного значения к 16-битному
• при ускорении значение вышло за пределы
• произошёл overflow, навигация отказала
• запуск провалился, 370 млн просто улетели

Вывод: неограниченные операции в коде — всегда риск.

Из той же категории:

• collect(toList()) на огромных стримах
@Transactional прямо на контроллерах
• synchronized на нагруженном месте

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👀6👍3