Java tip : старайся не шарить данные между потоками.
✅ Используй иммутабельные объекты
✅ Либо пусть потоки общаются через сообщения, не трогая общий state напрямую и не мутируя shared-состояние
👉 Java Portal
// С иммутабельными объектами:
record Book(String title, int price) {} // Иммутабельный
public class BookJob implements Runnable {
private final Book book;
.... // конструктор
@Override
public void run() {
System.out.println(book.title() + " " + book.price());
}
}
// Обмен сообщениями:
...
new Thread(() -> {
try {
queue.put("mess1");
} catch (InterruptedException e) {}
}).start();
...
new Thread(() -> {
try {
String mess = queue.take();
} catch (InterruptedException e) {}
}).start();
Please open Telegram to view this post
VIEW IN TELEGRAM
1🌚1
Какой SQL-запрос будет выполнен при вызове метода
1.
2.
3.
4.
5.
👉 Java Portal
findByEmail()?1.
SELECT * FROM users WHERE email LIKE ?2.
SELECT id, name, email FROM users WHERE email LIKE ?3.
SELECT * FROM users WHERE email = ? LIMIT 14.
SELECT * FROM users WHERE email = ?5.
SELECT * FROM users WHERE email = emailPlease open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: используй
✅ Одна из возможных причин: кастомная конфигурация конфликтует с дефолтной.
👉 Java Portal
@SpringBootApplication(exclude = …), чтобы отключить конкретные классы автоконфигурации.Please open Telegram to view this post
VIEW IN TELEGRAM
java.evolved это подборка, где каждый старый паттерн из Java показан рядом с его современным заменителем, прямо бок о бок.
👍 👍 👍
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
java.evolved
java.evolved Code Snippets | java.evolved
A collection of modern Java code snippets. Every old Java pattern next to its clean, modern replacement — side by side.
❤12🔥2
Совет по Spring Boot: если тебе нужны интеграционные тесты для контроллеров Spring MVC, а всё остальное ты хочешь замокать, используй
▪️ Он грузит только MVC-бины, а не весь application context целиком.
▪️ Интеграционные тесты медленнее юнитов, поэтому их стоит ускорять, выкидывая все лишнее, что не нужно конкретно для MVC.
▪️ В этом примере мы мокaем бин
👉 Java Portal
@WebMvcTest — он поднимет только MVC-бины (контроллеры, конфиг MVC, конвертеры, валидацию и т.п.), без полного контекста приложения.HelloService и поднимаем только MVC-контекст и сам контроллер:@WebMvcTest(HelloController.class)
class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private HelloService helloService; // замокано
@Test
void sayHello_returnsExpectedMessage() throws Exception {
given(helloService.getMessage()).willReturn("Hello!");
mockMvc.perform(get("/api/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello!"));
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Пожизненная PRO-подписка на easyoffer по цене одного года.
Беспрецедентная акция на PRO-тариф сайта для подготовки к собеседованию на программиста, тестировщика, проектного менеджера и другие IT-профессии.
⚙️ Доступные функции сейчас:
1. База вопросов из реальных технических собеседований с вероятностью встречи и примерами ответов.
2. База задач с этапа live-coding.
3. База 1100+ реальных собеседований, в том числе в топовые компании (Сбер, Авито, Яндекс, WB, OZON, МТС и др.) на позиции Junior/Middle/Senior.
4. База 400+ тестовых заданий от компаний.
5. Аналитика ТОП-требований из вакансий для лучшего написания резюме по ключевым словам.
6. Тренажеры для подготовки к собеседованию. В том числе тренажер «Реальное собеседование» со сценарием вопросов под конкретную компанию.
⌛️ Функции, которые появятся в ближайшие полгода:
1. Агрегатор вакансий из Telegram, сайтов компаний и джоббордов.
2. Улучшение и оптимизация резюме, чтобы проходить ATS-системы.
3. Генерация уникального резюме и сопроводительного письма под вакансию.
Акция до 20 февраля (включительно) на PRO-тариф. Покупаешь сейчас один раз — пользуешься всю жизнь без лимита, включая все будущие функции.
👉 Смотри подробности тарифа и покупай на easyoffer
Беспрецедентная акция на PRO-тариф сайта для подготовки к собеседованию на программиста, тестировщика, проектного менеджера и другие IT-профессии.
⚙️ Доступные функции сейчас:
1. База вопросов из реальных технических собеседований с вероятностью встречи и примерами ответов.
2. База задач с этапа live-coding.
3. База 1100+ реальных собеседований, в том числе в топовые компании (Сбер, Авито, Яндекс, WB, OZON, МТС и др.) на позиции Junior/Middle/Senior.
4. База 400+ тестовых заданий от компаний.
5. Аналитика ТОП-требований из вакансий для лучшего написания резюме по ключевым словам.
6. Тренажеры для подготовки к собеседованию. В том числе тренажер «Реальное собеседование» со сценарием вопросов под конкретную компанию.
⌛️ Функции, которые появятся в ближайшие полгода:
1. Агрегатор вакансий из Telegram, сайтов компаний и джоббордов.
2. Улучшение и оптимизация резюме, чтобы проходить ATS-системы.
3. Генерация уникального резюме и сопроводительного письма под вакансию.
Акция до 20 февраля (включительно) на PRO-тариф. Покупаешь сейчас один раз — пользуешься всю жизнь без лимита, включая все будущие функции.
👉 Смотри подробности тарифа и покупай на easyoffer
🤣5💊1
Spring Boot: Используй ResponseEntity<T>, чтобы получить тонкий контроль над HTTP-ответом.
Можно явно задать status, headers и body.
👉 Java Portal
Можно явно задать status, headers и body.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Вопрос для интервью по Spring Boot:
Когда ты делаешь REST API в Spring Boot, часто используют префикс
Но добавлять
Есть ли способ проще, чтобы не писать это на каждом контроллере?
Да: можно задать единый префикс через конфигурацию.
Так ты автоматически добавляешь
👉 Java Portal
Когда ты делаешь REST API в Spring Boot, часто используют префикс
/api для всех контроллеров.Но добавлять
@RequestMapping("/api") в каждый контроллер неудобно и захламляет код.Есть ли способ проще, чтобы не писать это на каждом контроллере?
Да: можно задать единый префикс через конфигурацию.
@Configuration
class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("/api",
aClass -> aClass.getPackage().getName()
.startsWith("com.sivalabs.bookstore"));
}
}
Так ты автоматически добавляешь
/api ко всем контроллерам из нужного пакета, а код контроллеров остается чистым.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2