Библиотека Java разработчика
10.8K subscribers
1.14K photos
564 videos
58 files
1.44K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
Как приложению ограничить доступ к файлу?

В целях безопасности, весь доступ приложения к определенным частям кода и ресурсам может быть ограничен. Решения о доступе к, например, Reflection API, или к файлу принимаются менеджером безопасности.

Внутри менеджера представлен набор методов check*(), которые делегируют выполнение основному методу checkPermission(). Сам доступ, права на который нужно проверить, представляется классом java.security.Permission. Так, доступ к файлу на чтение проверяет метод checkRead. Он передает в checkPermission объект FilePermission с указанным именем файла.

Экземпляр класса SecurityManager, который реализует нужную логику ограничения доступа, можно установить программно методом System.setSecurityManager, или на старте приложения флагом -Djava.security.manager. По умолчанию менеджер не установлен.

Менеджер безопасности изначально был нужен для ограничения апплетов – они выполнялись в браузере пользователя и не должны были получить доступ к локальным пользовательским данным. Сейчас технология апплетов устарела, но SecurityManager остается всё таким же актуальным.

👉@BookJava
👍5🙉1
На что способны виртуальные потоки Java в обработке файлов

Начнем с того,что я не специалист по Java и у меня нет коммерческого опыта на этом языке. Я просто обычный кодер, который по вечерам пилит проекты на Java, а основной мой стек состоит из PHP и смеси Python + Go. В данной статье хочу с вами поделиться опытом с использованием виртуальных потоках (Virtual Threads) в обработке файлов.

https://habr.com/ru/articles/803955/

👉@BookJava
👍5
25 расширений Docker для Java-разработчика

Знакомство с миром Docker подобно исследованию огромной игровой площадки компьютерной магии. Каждый раз, когда мы пишем код или настраиваем что-то, мы понимаем, насколько потрясающей может быть контейнеризация. Как разработчики, мы всегда ищем способы сделать нашу работу более плавной и быстрой. Именно здесь на помощь приходят расширения Docker.

https://digma.ai/top-docker-extensions-for-developers/

👉@BookJava
👍4
Spring Framework в деталях

SimpleJdbcInsert - Spring Framework JDBC
АОП в Spring Framework
XML-конфигурация АОП в Spring Framework
Транзакции - Spring Framework в деталях

источник

👉@BookJava
👍9
Что хранится в файле манифеста?

В JAR архиве можно найти файл META-INF/MANIFEST.MF. Это манифест архива – хранилище его метаинформации. Манифест обычно добавляется той же утилитой, которой собирается jar-файл: maven-jar-plugin, команда JDK jar.

Манифест – текстовый файл, который состоит из заголовков, строчек вида ключ: значение. Заголовки разделены на секции. Файл начинается с главной секции, описывающей метаинформацию всего архива. Следом, отделенные пустыми строками, идут секции для отдельных пакетов и файлов. В них могут переопределяться общие заголовки. JVM игнорирует неизвестные ей заголовки, что позволяет сторонним утилитам хранить в манифесте свою специфичную метаинформацию.

Вот некоторые из часто используемых заголовков:
• Информация об архиве: Manifest-Version, Created-By, Multi-Release, Built-By
• Main-class – точка входа приложения
• Classpath приложения
• Информация об экстеншне (Specification и Implementation, deprecated)
• Заголовки OSGI бандла
• Типы и хэши файлов архива (особенно применимо в Android приложениях)

Полный список стандартных заголовков можно почитать в документации.

👉@BookJava
👍7
Трассировка в Spring Boot3

Вспоминая свои первые годы работы, я несколько удивляюсь тому, как я устранял проблемы, связанные с продакшеном. Я работал над проектом, в котором занимался всем - от взаимодействия с клиентами до кода, развертывания и, естественно, решения проблем. Когда возникала проблема и у меня не было четкого решения, я брал дамп базы данных продакшена, запускал приложение на своей машине с этой базой данных, затем звонил заказчику и пытался повторить его действия, используя необходимые отладочные указатели и операторы печати, чтобы точно определить проблему. В то время этот метод оказался для меня эффективным. Приложение было небольшим, с ограниченной базой пользователей, и с ним вполне мог справиться один разработчик. Однако я еще не понимал важности протоколирования.

https://medium.com/javarevisited/tracing-in-spring-boot3-097205dc08f4

👉@BookJava
👍3😁2
Media is too big
VIEW IN TELEGRAM
Java 23: Восстановление баланса с помощью примитивных паттернов

Постоянное внедрение сопоставления шаблонов в Java привело к тому, что некоторые функции языка оказались более значимыми, чем другие, и разбалансировали язык. В Java 23 примитивные паттерны исправят эту ситуацию в отношении примитивных типов в instanceof и switch. В этом эпизоде также рассматриваются другие грядущие паттерны ('deconstruction', 'static', 'instance' и 'constant') и показывается, как они будут развивать сопоставление паттернов в Java.

0:00 Intro
1:02 Existing Patterns
1:23 Type Patterns
1:32 Guarded Patterns
1:53 Record Patterns
2:09 Unnamed Patterns
2:29 Nested Patterns
2:50 Summary of Existing Patterns
3:38 Primitive Patterns in instanceof
5:17 Primitive Patterns in switch
6:30 Primitive Patterns when Nested
7:33 Upcoming Patterns
7:59 Deconstruction Patterns
8:40 Static Patterns
9:09 Instance Patterns
9:54 Constant Patterns
10:37 Try JDK 23 EA!

источник

👉@BookJava
👍3
Советы по использованию Spring Framework 🚀

Используйте аспектно-ориентированное программирование (AOP) в SpringFramework для решения сквозных задач. Реализуйте протоколирование, безопасность и кэширование с помощью @Aspect
и pointcuts. 🔥

👉@BookJava
👍3🥴2
Дмитрий Тучс — The art of JUnit extensions

В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную инфраструктуру для работы с тестовыми данными, авторизацией и другим, используя JUnit Extensions. Только практические навыки, которые будут полезны большинству автоматизаторов на Java.

https://www.youtube.com/watch?v=NFHdzKcU5OU

👉@BookJava
👍3
Совет по Java 🚀

Если вам нужно работать с API, требующим List<String>, но вы хотите работать с текстовыми блоками Java 14, вы можете легко преобразовать их в List. В Java 17 вы можете сначала вызвать lines() для String, который возвращает Stream, а затем непосредственно toList(), который выдает List.

👉@BookJava
👍5
Как прочитать криптографический ключ?

Для чтения криптографического ключа необходимо использовать классы Java Cryptography Architecture (JCA). Пример кода для чтения криптографического ключа из файла вида PKCS#8 с помощью этих классов может выглядеть следующим образом:

// Загружаем публичный ключ из файла
FileInputStream fis = new FileInputStream("public.pem");
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
byte[] keyBytes = new byte[dis.available()];
dis.readFully(keyBytes);
dis.close();

// Преобразуем байты в объект PublicKey
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(spec);


// Используем ключ для выполнения криптографических операций

👉@BookJava
👍3
Сравните репозитории Spring Data

Основная часть работы в Spring Data строится вокруг интерфейса Repository. Это маркерный интерфейс. От него наследуются интерфейсы-специализации, которые уже содержат методы для работы с сущностями базы данных. Все эти интерфейсы параметризуются двумя типами: самой сущности и её идентификатора.

CrudRepository – базовый набор операций над сущностями: создание, чтение, изменение и удаление (CRUD).

PagingAndSortingRepository – добавляет к CRUD возможность постраничной загрузки данных с определенной сортировкой.

JpaRepository – расширение PagingAndSortingRepository, полноценно реализующее Java Persistence API. Добавляет ряд методов, таких как например flush и deleteInBatch.

MongoRepository – расширение PagingAndSortingRepository, специфичное для MongoDB.

Вспомогательные методы, специфичные для конкретной модели данных, добавляются в пользовательские интерфейсы-наследники. Основываясь на именах добавляемых методов, фреймворк сам создаёт их реализацию.

👉@BookJava
👍9
Регулярные выражения в Java

В Java регулярные выражения или Regex (сокращенно), можно использовать для поиска, манипулирования и редактирования строк в Java. Проверка электронной почты и паролей - вот несколько областей строк, где Regex широко используется для определения ограничений. Регулярные выражения в Java представлены в пакете java.util.regex. Он состоит из 3 классов и 1 интерфейса. Пакет java.util.regex в основном состоит из следующих трех классов, как показано ниже в табличной форме:

Pattern Class
Matcher Class
PatternSyntaxException Class
MatchResult Interface

https://www.geeksforgeeks.org/regular-expressions-in-java/

👉@BookJava
👍4
В Java 21 появилось множество новых функций и методов, которые помогут нам писать код более качественно. Но их легко не заметить или пропустить их использование, поскольку это относительно новая версия.

https://foojay.io/today/ensuring-the-right-usage-of-java-21-new-features/

👉@BookJava
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
🧠 Если у вас есть конфликты при мерже, не волнуйтесь!

Воспользуйтесь волшебной палочкой, чтобы разрешить простые конфликты. Убрав их, вы сможете сосредоточиться на разрешении остальных. #IntelliJIDEATips

👉@BookJava
👍4
Когда используется StampedLock?

StampedLock – примитив синхронизации, добавленный в Java с версии 8. Общий принцип его работы точно такой же, как у ReadWriteLock: захват неэксклюзивной блокировки (на чтение), и эксклюзивной (на запись). Но есть у этих классов ряд различий в деталях.

Во-первых, если блокировка ReadWriteLock возвращает объекты типа Lock, то StampedLock возвращает числа типа long, которые и называется «штампами». Штамп служит идентификатором лока, он передается параметром в методы по работе с ранее захваченной блокировкой чтения или записи. Специальный штамп 0 означает неудавшийся захват.

StampedLock в отличие от ReentrantReadWriteLock – не реентрант. Это накладывает бóльшую ответственность на программиста: можно устроить дедлок на одном потоке.

В StampedLock расширена функциональность. Новые методы с префиксом try* не висят в ожидании. Методы tryOptimistic* реализуют оптимистичную блокировку. Методы tryConvert* дают возможность изменять «уровень» заблокированности: можно попытаться превратить readLock во writeLock, и наоборот.

Не смотря на похожесть, StampedLock не наследуется от ReadWriteLock. Но для совместимости в нём предусмотрены методы-адаптеры asReadWriteLock, asReadLock и asWriteLock.

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

👉@BookJava
👍3
Еще раз о перформансе стримов в Java

Время от времени я наблюдаю или даже бываю втянутым в спор о перформансе стримов в джаве. Общеизвестно, что стримы это компромисс между перформансом и удобством. Однако я не нашел вменяемого набора бенчмарков, которые бы показали, насколько именно медленны (или быстры) стримы. Поэтому я решил написать эти бенчмарки сам.

https://medium.com/@daniel.las/speed-of-java-stream-1cc3a94b44c2

👉@BookJava
🤡8👍1