Секреты Java
Открыть в Telegram
Обсуждаем Java, архитектуру, фреймворки и всё, о чем должны говорить разработчики. Владелец: @Alexey_Morl Реклама на бирже: https://telega.in/c/java_secrets
Больше7 991
Подписчики
Нет данных24 часа
Нет данных7 дней
Нет данных30 день
Архив постов
7 991
✅Виды Scope в Spring: понимание и применение
Spring предоставляет мощный механизм управления жизненным циклом объектов, известный как
scope. Scope определяет, когда создается, как долго живет и где используется экземпляр бина.
Виды scope в Spring:
▫️Singleton:
Это наиболее распространенный и используемый по умолчанию scope. Экземпляр бина создается один раз на весь жизненный цикл контекста Spring.
Все запросы на этот бин возвращают ссылку на один и тот же объект.
▫️Prototype:
Каждый запрос на бин создает новый экземпляр. В этом случае Spring не отвечает за жизненный цикл бина: бин будет удален, как только перестанет быть используемым. Этот scope подходит для случаев, когда вам нужен stateful компонент для независимого использования в разных частях приложения.
▫️Request:
Каждый HTTP-запрос создает новый экземпляр бина. Этот бин остается активным только в течение одного HTTP-запроса и уничтожается после его завершения.
▫️Session:
Каждая HTTP-сессия создает новый экземпляр бина. Этот scope особенно полезен, когда вам нужно сохранить состояние bean-компонента на протяжении всего взаимодействия пользователя с вашим приложением в течение сеанса. Хорошим примером может быть корзина в интернет-магазине.
▫️Application:
Этот scope используется, чтобы создать один бин на ServletContext. Похож на Singleton, но имеет два важных отличия: создается в одном экземпляре на ServletContext, а не на ApplicationContext (Spring IoC контейнер). У вас может использоваться несколько IoC контейнеров в одном ServletContext, поэтому вы можете иметь несколько singleton бинов одного и того же типа, но только один бин каждого типа при application scope. И второе - бин виден как атрибут ServletContext.
▫️WebSocket:
Экземпляр бина создается для каждого WebSocket-соединения. Этот бин остается активным только в течение WebSocket сеанса и уничтожается при его завершении.
🫡 Секреты Java
#spring #scope7 991
📖 Java books - огромная библиотека Java книг, актуальных на 2024 год.
🚀 Java Jobs - вакансии и проекты для Java разработчиков.
📱 Android - мобильная разработка на Java это высокие зарплаты и возможность реального развития.
🔝 Маст-хэв папка Java разработчиков: https://t.me/addlist/ZM3J6oFNAnRlNWU6
7 991
✅ Поиск дубликатов в списке в Java: различные способы
Дубликаты в списках могут быть проблемой при обработке данных в Java. Рассмотрим несколько способов, как можно найти дубликаты c использованием стандартных решений Java.
▫️Использование Set
Один из простых способов найти дубликаты.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 2, 3);
Set<Integer> set = new HashSet<>();
List<Integer> duplicates = new ArrayList<>();
for (Integer element : list) {
if (!set.add(element)) {
duplicates.add(element);
}
}
System.out.println("Дубликаты: " + duplicates);
▫️Использование Map
Считаем количество встреч каждого элемента и затем ищем элементы с количеством больше 1.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 2, 3);
Map<Integer, Integer> countMap = new HashMap<>();
List<Integer> duplicates = new ArrayList<>();
for (Integer element : list) {
countMap.put(element, countMap.getOrDefault(element, 0) + 1);
}
for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
if (entry.getValue() > 1) {
duplicates.add(entry.getKey());
}
}
System.out.println("Дубликаты: " + duplicates);
▫️Использование Stream API:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 2, 3);
List<Integer> duplicates = list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
System.out.println("Дубликаты: " + duplicates);
▫️Использование Collections.frequency:
Copy code
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 2, 3);
List<Integer> duplicates = list.stream()
.filter(i -> Collections.frequency(list, i) > 1)
.distinct()
.collect(Collectors.toList());
System.out.println("Дубликаты: " + duplicates);
Эти методы предоставляют различные способы найти дубликаты в списке в Java. Выбирайте на здоровье!
🫡 Секреты Java
#lists7 991
Это база с 1700 вопросами с собеседований на Java разработчика. Фишка в том, что просчитана вероятность с которой вопрос буден задан и есть примеры ответов. Теперь можно легко получить оффер, подготовившись к самым популярным вопросам 😏
7 991
✅ Варианты конфигурации контекста Spring приложения.
Рассмотрим какие есть варианты на примере Spring Boot приложения.
▫️XML-конфигурация:
Мы имеем файл конфигурации в classpath, допустим
beans.xml:
<beans <!-- some schema data--->>
<bean id="userService" class="com.example.UserService">
<property name="userRepository" ref="userRepository"/>
</bean>
<bean id="userRepository" class="com.example.UserRepository"/>
</beans>
Для поднятия контекста на xml добавляем аннотацию @ImportResource("classpath:beans.xml") к нашему классу помеченному @SpringBootApplication (либо @Configuration).
Но стоит отметить, что XML-конфигурация почти изжила себя и мало используется.
▫️Annotation-based конфигурация:
При помощи аннотаций @Component, @Service, @Repository, @Controller мы можем указывать Spring'у какие бины нужно создавать в контексте, а связь между ними задать через @Autowired:
@Repository
public class UserRepository {
//...
}
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
//...
}
▫️Java-based конфигурация:
Позволяет определять бины и их зависимости непосредственно в Java-коде с использованием аннотаций @Configuration и @Bean:
@Configuration
public class AppConfig {
@Bean
public UserService userService(UserRepository userRepository) {
return new UserService(userRepository);
}
@Bean
public UserRepository userRepository() {
return new UserRepository();
}
}
В каждом примере мы определили два бина - UserService и UserRepository, а так же связь между ними (инжект userRepository в userService). Выбор способа конфигурации зависит от ваших предпочтений и требований вашего проекта.
Справедливости ради - есть еще groovy конфигурация, но в своей практике я ее не встречал. Напишите в комментах, если работали с groovy и в каких кейсах это было полезно.
🫡 Секреты Java
#spring7 991
Познакомьтесь с основами востребованного языка программирования Java на бесплатном мини-курсе Skillbox! Узнайте, как Java-разработчики работают в офисе, на фрилансе, удалёнке и что нужно для старта карьеры.
Бессрочный доступ за пару кликов: 👉 https://epic.st/EfUVh?erid=2VtzqwJwzVA
Сразу после регистрации пришлём гайд по профессии Java-разработчика 😉
Что вас ждёт:
✔️ Полезная теория
За 4 занятия изучите основы профессии и языка Java по видеоматериалам. Узнаете о перспективах языка и получите советы для старта карьеры.
✔️ Интересная практика
Напишете первые проекты: Telegram-бота, программу для обработки файлов и чат на Spring. Опыт и знания в IT не нужны для их выполнения — будут подробные инструкции от спикера.
✔️ Живой эфир с экспертом по Java
В финале в прямом эфире пообщаетесь с Даниилом Пилипенко, который более 19 лет работает в сфере Java и веб-разработки. Он ответит на вопросы о профессии, пройденном материале и практических работах.
🎁 За время обучения вы получите 5 полезных материалов в подарок, сертификат на скидку 10 000 рублей на любой курс, персональную карьерную консультацию и доступ к изучению английского языка в Skillbox на год.
До встречи на мини-курсе. Старт после регистрации!
Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880
7 991
Совершенство в разработке достигается не тогда, когда нечего добавить, а тогда когда нечего убрать. Если ваш код становится одновременно и лучше и проще, вы поступаете правильно.© Эрик С. Рэймонд 🫡 Секреты Java #quotes
7 991
Java Developer — мастхев для любого джависта
За ручку проведём тебя к первому офферу, расскажем о сложных вещах простыми словами и научим смеяться с айтишных мемов.
👉🏻 Подписывайся и прокачивай свои навыки
7 991
♨️ Прокачивай свои навыки вместе с Java | Фишки и трюки
Ежедневные порции Java-фишек, полезные советы и трюки от опытных разработчиков.
👉🏼 Присоединиться
7 991
✅ Использование JOIN FETCH для решения проблемы N+1 запроса в Hibernate
Одним из решений проблемы N+1 запроса в Hibernate является использование оператора
JOIN FETCH в запросе HQL (Hibernate Query Language). Этот оператор позволяет загрузить связанные сущности вместе с основными сущностями в одном запросе, уменьшая избыточное количество запросов к базе данных.
Использование JOIN FETCH на примере из поста про проблему N+1 запроса:
List<Author> authors = entityManager.createQuery(
"SELECT a FROM Author a JOIN FETCH a.books",
Author.class)
.getResultList();
for (Author author : authors) {
List<Book> books = author.getBooks();
}
Причем независимо от типа FetchType в аннотации @OneToMany в классе Author, будет выполнен один запрос:
select a1_0.id,b1_0.author_id,b1_0.id,b1_0.title,a1_0.name from authors a1_0 join books b1_0 on a1_0.id=b1_0.author_id
В этом примере используется оператор JOIN FETCH для загрузки списка книг для каждого автора в одном запросе. Это позволяет избежать дополнительных запросов к базе данных и улучшить производительность выполнения Hibernate-запросов.
🫡 Секреты Java
#hibernate #jpa #nplus17 991
Совет на 2024 год: углубитесь в изучение Java.
Тот, кто разбирается в тонкостях Java — сможет что угодно и сорвёт куш.
А если вы не хотите терять последние недели лета на бесполезные материалы и гайды — читайте канал: @javatg
Там просто и доступно объясняют какие готовые скрипты заставят ваш код летать, почему следует избегать исключений с потоками, какие фишки Java Serialization API не знают 90% разработчиков.
Ещё мы собрали маст-хэв мл-папку для Java разработчиков: https://t.me/addlist/ZM3J6oFNAnRlNWU6
Подписывайтесь, потом сами себе спасибо скажете: @javatg
