Spring АйО
7.67K subscribers
262 photos
152 videos
338 links
Русскоязычное сообщество Spring-разработчиков.

Habr: bit.ly/433IK46
YouTube: bit.ly/4h3Ci0x
VK: bit.ly/4hF0OG8
Rutube: bit.ly/4b4UeX6
Яндекс Музыка: bit.ly/3EIizWy

Канал для общения: @spring_aio_chat
Download Telegram
Channel created
Знаете ли вы, что большинство Java разработчиков активно используют Spring Boot в своей работе? Можно ли утверждать, что Java разработчик == Spring Boot разработчик? Вероятно, да!

Всем привет! Это канал русскоязычного сообщества Spring Boot - Spring АйО.

Здесь вы найдете новости и контент про Spring, Java и всему, с чем так или иначе соприкасается Spring Boot разработчик. Материалы будут не всегда на русском, но всегда полезные и актуальные.

Добро пожаловать и присоединяйтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
21 вопрос на собеседование по Maven.

Вопрос №1: А почему не Gradle? 🤔

А если серьезно, каждая из билд систем имеет свои преимущества. Тем не менее, start.spring.io по умолчанию выбирает Gradle, и что интересно, на Groovy.

🔗 https://www.java67.com/2024/04/top-21-maven-interview-questions.html

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring AI

Во всём мире сейчас наблюдается ажиотаж вокруг темы искусственного интеллекта и разработки приложений с его использованием. Многие стремятся внедрить искусственный интеллект в свои продукты и воспользоваться всеми его преимуществами. Поэтому сообщество Spring создало модуль 'Spring AI' для упрощения интеграции AI API в приложения Spring. Spring AI — это молодой проект, призванный упростить для разработчиков интеграцию функций искусственного интеллекта в приложения Spring. И он достигает этой цели, предлагая набор абстракций и инструментов, которые упрощают взаимодействие с такими ИИ-моделями, как OpenAI и Azure OpenAI.


🔗 https://habr.com/ru/companies/otus/articles/814713/

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
IntelliJ IDEA

IntelliJ IDEA 2024.1 приносит множество новых функций, среди которых особенно выделяются навигация к логгеру и inline breakpoints. Теперь вы можете быстро переходить к соответствующему логгеру из лог-сообщения, что значительно упрощает отладку и анализ логов. Inline breakpoints позволяют устанавливать точки останова прямо в редакторе, что делает процесс отладки более интуитивным и удобным. Эти обновления делают IntelliJ IDEA еще более мощным инструментом для разработчиков. Также доступно в Community Edition.

#IntelliJ #IDE

🔗 https://blog.jetbrains.com/idea/2024/02/intellij-idea-2024-1-eap-6

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышел Spring Boot 3.3.0. В обновлении представлены следующие нововведения:

🚀 Поддержка CDS для ускорения времени запуска.
🔍 Улучшение Observability.
🔐 Новые возможности Spring Security.
🧵 Поддержка виртуальных потоков для вебсокетов.
Обновление зависимостей и многое другое.

#Spring #SpringBoot

🔗 https://spring.io/blog/2024/05/23/spring-boot-3-3-0-available-now

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
А тем временем, вышел Kotlin 2.0!

Основные изменения включают стабилизацию нового компилятора Kotlin K2, улучшение работы с многоплатформенными проектами, поддержку новых плагинов и улучшения производительности компилятора. В новой версии также прокачали smart-cast, а также ускорили работу IDE.

Несколько странно выглядит smart-cast для операций decrement и increment, меняющих тип объекта 🤯


interface Rho {
operator fun inc(): Sigma = TODO()
}

var unknownObject: Rho = TODO()

++unknownObject // после этого unknownObject: Sigma 🤪 но Kotlin знает об этом)


#Kotlin

🔗 https://kotlinlang.org/docs/whatsnew20.html

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Когда меня просят стартануть проект не на Spring Boot 😂
Иногда полезно освежить в памяти базовые принципы фреймворка. В Spring Framework центральное место занимает Bean. В своем видео Джош Лонг рассказывает об истории Bean и его жизненном цикле.

#SpringTips #SpringBoot

📱 https://www.youtube.com/watch?v=Z5hxolai4Tk

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
Hibernate — очень мощный и функциональный ORM (Object-Relational Mapping) фреймворк. Он связывает базы данных с помощью объектно-ориентированных языков программирования. Однако многие, начиная с ним работать, натыкаются на проблемы производительности или отсутствия нужной функциональности. Многие из этих проблем появляются просто из-за того, что разработчики не умеют его «готовить».

🔗 https://habr.com/ru/companies/magnit/articles/814573/

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
Когда ИИ захватит мир, он будет заставлять разработчиков писать код, чтобы давать ему все больше данных для обучения. Хотя... постойте 🤔
Классная новость для всех Spring Boot разработчиков! Spring Academy дает бесплатный доступ ко всем своим обучающим материалам. 9 курсов и 12 гайдов по Spring Boot.

P.S. Есть сложности в регистрации из РФ.

🔗 https://spring.academy/

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳 Идеальный Dockerfile для Spring Boot приложения

Контейнеризовать Spring Boot приложение можно так:

FROM gradle:8.5.0-jdk21
WORKDIR /
COPY / .
RUN ./gradlew installDist
CMD ./build/install/app/bin/app


И так:

FROM bellsoft/liberica-openjdk-alpine:21 AS builder
WORKDIR /application
COPY . .
RUN --mount=type=cache,target=/root/.gradle chmod +x gradlew && ./gradlew clean build -x test

FROM bellsoft/liberica-openjre-alpine:21 AS layers
WORKDIR /application
COPY --from=builder /application/build/libs/*.jar app.jar
RUN java -Djarmode=layertools -jar app.jar extract

FROM bellsoft/liberica-openjre-alpine:21
VOLUME /tmp
RUN adduser -S spring-user
USER spring-user
COPY --from=layers /application/dependencies/ ./
COPY --from=layers /application/spring-boot-loader/ ./
COPY --from=layers /application/snapshot-dependencies/ ./
COPY --from=layers /application/application/ ./

ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]


Второй вариант с одной стороны намного сложнее реализовать, но с другой стороны он даёт множество преимуществ, среди которых можно отметить:

меньший размер финального образа (из-за исключения инструментов сборки и использования JRE вместо JDK);
🛡️ более безопасный подход к работе с файловой системой (за счёт создания и использования пользователя с ограниченными правами);
🚀 ускоренный процесс сборки (благодаря кэшированию зависимостей).

🔗 Подробнее о том, как написать идеальный Dockerfile тут: https://spring.io/guides/topicals/spring-boot-docker

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Стартер Недели

Как сделать CRUD за 5 минут? Создаем модель данных, репозиторий, контроллер с 5-8 методами и, возможно, несколько dto. Если печатать со скоростью 600 символов в минуту, то можно успеть 🙈

Или берем Spring Data Rest, и получаем круды для своих репозиториев из коробки. И не только круды. Можно выставить наружу любой метод доступа к данным, прикрутить пагинацию и сортировку.

Однако, быстрый старт в начале может обернуться болью в процессе кастомизации или добавлении сложной (и не очень) логики. Тем не менее, выглядит как вполне себе хорошее решение для небольших REST сервисов, почти что Low Code 🙃.

Больше информации о данном стартере можно получить из доклада Рустама Курамшина на JPoint 2023.

📱 https://www.youtube.com/watch?v=roaGUHaWPxw

🔗 https://spring.io/projects/spring-data-rest

#SpringStarter #SpringBoot

Подписывайтесь:
😌@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Не то чтобы, нас сильно интересовал Python, но анимация очень интересная.

Жизненный цикл кода от IDE до рабочей программы.
В Kotlin 2.1 анонсировали новую интересную функцию под названием "when guards", которая расширяет возможности конструкции when. Guard'ы позволяют добавлять дополнительные проверки с помощью ключевого слова if.


fun printAnimalInfo(animal: Animal) {
when (animal) {
is Animal.Dog if animal.isFriendly -> {
println("This is a friendly dog named ${animal.name}.")
}
is Animal.Dog -> {
println("This is a dog named ${animal.name}.")
}
is Animal.Cat if animal.isLazy -> {
println("This is a lazy cat named ${animal.name}.")
}
is Animal.Cat -> {
println("This is a cat named ${animal.name}.")
}
}
}

sealed class Animal {
class Dog(val name: String, val isFriendly: Boolean) : Animal()
class Cat(val name: String, val isLazy: Boolean) : Animal()
}


Что интересно, это, кажется, первая фича языка, которую Kotlin взял из Java.


record Point(int x, int y) {
}

class Cartesian {
static void printQuadrant(Point p) {
switch (p) {
case Point(var x, var y) when x > 0 && y > 0 -> {
System.out.println("first");
}
default ->
System.out.println("other");
}
}
}


Какой вариант вам кажется более предпочтительным?

👍 - Kotlin, ❤️ - Java
🕐 Тонкое управление Scheduled задачами в Spring

Какими способами можно настроить время и условие запуска Scheduled задач в Spring?

Первый способ - через @Profile над сервисом, в котором объявлена задача, чтобы указать профили, в которых она должна (или не должна) запускаться.


java
@Profile("test,!prod")
class Teapot {
@Scheduled(cron = "0 15 10 15 * ?")
void makeTea() {
log.info("I'am a teapot.");
}
}


Но в таком варианте, мы управляем только условием запуска, но не можем настроить переодичность.

Другой вариант, это объявление cron expression в пропертях:


#application-test.properties
teapot.make_tea.cron=0 15 10 15 * ?



@Scheduled(cron = "${teapot.make_tea.cron}")
void makeTea() {
log.info("I'am a teapot.");
}


Но как тогда в таком случае отключить джобу? В качестве cron expression можно использовать дефис(-), что означает, что джобу запускать не нужно вовсе. И тогда мы обходимся без явного перечисления профилей в @Profile.


#application-prod.properties
teapot.make_tea.cron=-


Такой подход особо полезен при использовании spring-cloud-config, тогда нет необходимости делать передеплой приложения, чтобы выключить, или донастроить джобу. Нужно только не забыть повесить @RefreshScope на класс.

#SpringBoot #SpringTips