MiddleJava Developer > Java Core > JPA и Hibernate
Короткий ответ SessionFactory — «тяжёлая» потокобезопасная фабрика: она создаётся один раз на всё приложение на основе конфигурации, хранит метаданные маппингов и кэш второго уровня и порождает объекты Session. Session — основной интерфейс работы с базой: единица работы (unit of work) с методами CRUD, управления транзакциями, кэшем первого уровня и ленивой загрузкой. В JPA роли совпадают: EntityManagerFactory — аналог SessionFactory, а EntityManager — аналог Session. Как это работает подробнее Session не потокобезопасна: каждый поток или единица работы должна использовать собственную Session, полученную через openSession() или getCurrentSession() для сессии, привязанной к текущей транзакции. Поскольку Hibernate реализует спецификацию JPA, его Session и SessionFactory реализуют стандартные интерфейсы EntityManager и EntityManagerFactory. SessionFactory: создаётся один раз (например, из hibernate.cfg.xml), дорога в создании, потокобезопасна, общая для всех сессий. Session: открывается на единицу работы, предост
entitymanagerhibernate
SeniorJava Developer > Java Core > Spring
Короткий ответ Spring AOP (Aspect Oriented Programming) — парадигма, дополняющая ООП: сквозные задачи — логирование, безопасность, управление транзакциями, аудит — выносятся из бизнес-логики в отдельные модули. Если в ООП основная единица — класс, то в AOP это аспект. Как это работает подробнее По моменту выполнения советы делятся на before (до метода), after returning (после успешного завершения), after throwing (если метод бросил исключение), after (finally) — в любом случае, и around, который выполняется и до, и после метода и может управлять его выполнением. Основные применения AOP: логирование, безопасность и аутентификация, декларативные транзакции, обработка исключений, сбор метрик API. Код аспектов собирается в одном месте, переиспользуется, а бизнес-код остаётся чистым. Aspect (аспект) — класс, который реализует сквозную функциональность, затрагивающую сразу несколько классов, например логирование или проверку прав. Join Point (точка соединения) — место в ходе выполнения программы, в котором может бы
adviceaop
MiddleJava Developer > Java Core > Spring
Короткий ответ Spring Bean — это обычный Java-объект (POJO), который создаётся, настраивается и управляется IoC-контейнером Spring. В отличие от объекта, созданного через new, бин получает автоматически внедрённые зависимости, а его жизненным циклом от создания до уничтожения управляет контейнер. Как это работает подробнее Бины регистрируются в контексте приложения через стереотипные аннотации — @Component, @Service, @Repository, @Controller — либо декларацией @Bean внутри @Configuration-класса. Далее контейнер использует их для автоматического внедрения в другие компоненты. Этапы цикла: запуск контейнера и загрузка конфигурации, создание экземпляра бина, внедрение зависимостей, инициализация бина (например, @PostConstruct или init-method), выполнение бизнес-методов, затем вызов метода уничтожения (@PreDestroy или destroy-method) при остановке контейнера. Зачем это нужно: централизованное управление объектами и зависимостями упрощает сопровождение и тестирование, а ресурсы — соединения с БД, сокеты, файлы — г
beancontainer
JuniorJava Developer > Java Core > Spring
Короткий ответ Spring Boot Starters — предварительно сконфигурированные наборы зависимостей: вместо ручного добавления и согласования версий десятков JAR достаточно подключить один стартер, и нужные библиотеки подтянутся автоматически. Это устраняет конфликты версий и сокращает конфигурацию сборки. Как это работает подробнее Стартер — это один артефакт, который включает все библиотеки для конкретной функциональности или типа приложения. Присутствие стартеров в classpath во многом определяет, какие авто-конфигурации применит Spring Boot. Совместимость версий транзитивных зависимостей обеспечивают родительский POM spring-boot-starter-parent и BOM spring-boot-dependencies. spring-boot-starter-web — веб-приложения и REST API: Spring MVC и встроенный Tomcat. spring-boot-starter-data-jpa — работа с базой данных через JPA и Hibernate. spring-boot-starter-security — аутентификация и авторизация. spring-boot-starter-test — тестирование: JUnit, Mockito и Spring Test. spring-boot-starter-actuator — мониторинг и health-п
dependenciesjava
MiddleJava Developer > Java Core > Spring
Короткий ответ Spring Boot — фреймворк, построенный поверх Spring Framework и упрощающий разработку автономных (stand-alone) приложений, готовых к продакшену. Его ключевые механизмы — авто-конфигурация, стартовые зависимости (starters) и встроенный веб-сервер. Как это работает подробнее Spring — это общий фреймворк: контейнер IoC/DI, AOP, Spring MVC, управление транзакциями; он требует довольно большой ручной настройки и, как правило, внешнего сервера. Spring Boot — расширение, которое работает «поверх» Spring и использует те же Spring Core, Spring AOP и Spring MVC, но сильно упрощает их применение. Авто-конфигурация: убирает большую часть шаблонной ручной конфигурации, в первую очередь XML-настройку. Стартеры: берут на себя управление зависимостями — не нужно вручную подбирать версии библиотек. Встроенный сервер: Tomcat, Jetty или Undertow позволяют запускать приложение как обычный исполняемый JAR без внешнего сервера. Production-возможности: например, Actuator для мониторинга; Boot удобен для облачных прило
autoconfigurationjava
MiddleJava Developer > Java Core > Spring
Короткий ответ Spring Data JPA — модуль Spring Framework, работающий поверх спецификации JPA (внутри по умолчанию Hibernate): достаточно объявить интерфейс-репозиторий, и Spring Data сам предоставит его реализацию с готовыми CRUD-операциями — без написания SQL и DAO-классов. Как это работает подробнее Центральный интерфейс — JpaRepository, расширяющий CrudRepository и PagingAndSortingRepository. Особенность Spring Data JPA — производные методы запросов (derived query methods): по имени метода, то есть по префиксам findBy, countBy, existsBy, deleteBy и именам полей сущности, Spring Data парсит имя и генерирует нужный JPQL или SQL-запрос. Готовые методы: save(), findById(), findAll(), deleteById(), flush(), а также пагинация через Pageable и сортировка через Sort. Derived-метод: findByName(String name) превращается в поиск по полю name, а findByDepartmentName строит запрос через связанную сущность. @Query: для сложных запросов запрос задаётся вручную на JPQL или нативном SQL при nativeQuery = true, параметры св
javajpa
MiddleJava Developer > Java Core > Java 8+
Короткий ответ Stream в Java 8 — это абстракция для декларативной обработки последовательностей данных: вы описываете, что нужно сделать с элементами (отфильтровать, преобразовать, агрегировать), а не как это сделать с помощью циклов. java.util.stream.Stream не хранит данные и не является коллекцией — это конвейер операций над источником (коллекцией, массивом, файлом, генератором), который обрабатывает элементы лениво и при необходимости параллельно. Как это работает подробнее Пайплайн стрима состоит из трёх частей: источник, промежуточные операции и терминальная операция. Промежуточные операции (filter, map, flatMap, sorted, limit, distinct, peek) ленивы: они не выполняются, пока к пайплайну не применена терминальная операция, и каждая возвращает новый стрим. Терминальные операции (collect, forEach, reduce, count, anyMatch) запускают обработку и производят результат; после терминальной операции стрим использовать нельзя. Исходная коллекция при работе стрима не изменяется. map() преобразует каждый элемент оди
collectorsfunctional-interface
JuniorJava Developer > Java Core > Строки
Короткий ответ String Pool (пул строк) — специальная область памяти в куче, где JVM хранит строковые литералы, чтобы одинаковые строки не дублировались. Когда код встречает литерал "java", JVM проверяет пул: если такая строка уже есть, переменная получает ссылку на существующий объект, если нет — строка создаётся и помещается в пул. Поэтому сравнение == двух одинаковых литералов даёт true. Как это работает подробнее Создание через new String("java") работает иначе: конструктор всегда создаёт новый объект в обычной части кучи, даже если такая строка уже есть в пуле, поэтому new String("java") == "java" даёт false. Переместить строку в пул можно вручную методом intern(), который возвращает канонический объект из пула. До Java 7 пул находился в PermGen, с Java 7 его перенесли в обычную кучу — теперь сборщик мусора может удалять неиспользуемые интернированные строки. Интернирование литералов — одинаковые литералы по всей программе разделяют один объект и экономят память. new String(...) — всегда отдельный объект
internjava
SeniorJava Developer > Java Core > Core Java
Четыре типа ссылок определяют, при каких условиях сборщик мусора может освободить объект.
Управление памятью
MiddleJava Developer > Java Core > Исключения
Короткий ответ Try-with-resources — форма оператора try из Java 7: ресурсы объявляются в круглых скобках после try и автоматически закрываются по завершении блока — нормальном или с исключением — вызовом close() в порядке, обратном их объявлению. Это работает для любого объекта, реализующего AutoCloseable (или его наследника Closeable). Как это работает подробнее Ресурс объявляется в круглых скобках после try — это может быть любой объект, реализующий java.lang.AutoCloseable (метод close()). Интерфейс java.io.Closeable расширяет AutoCloseable: его метод close() объявлен с throws IOException. В старом стиле try-catch-finally ресурсы закрывались вручную, и при исключениях и в теле try, и в close() они могли «потечь», а исходное исключение — затеряться. В try-with-resources наружу уходит исключение из тела try, а исключения из close() добавляются как подавленные (suppressed) — их можно получить через Throwable.getSuppressed(). Закрытие выполняется в порядке, обратном порядку объявления ресурсов. После блока try-
autocloseableexceptions