Skip to content

События в Spring

Синопсис

События в спринге реализуются очень просто. Любой бин может прослушивать события если он реализует интерфейс ApplicationListener. Само событие это класс производный от ApplicationEvent а сам этот класс не обязан быть бином. Публикуются события с помощью метода publishEvent() класса реализующего интерфейс ApplicationEventPublisher который наследует интерфейс ApplicationContext.

Готовый проект можно взять с gitHub: https://github.com/dev-blogs/spring подпроект event-handler
Continue reading

Как переключаться между java-машинами в Mac OS X

Способ 1

Для того чтобы на Mac OS X переключаться между несколькими установленными виртуальными java-машинами нужно поменять переменную окружения JAVA_HOME, но сначала проверим сколько в системе установлено java-машин командой usr/libexec/java_home:
Continue reading

Как связать Spring и WebSocket

Синопсис

В этом посте рассмотрим пример доступа к спринговому бину из из двух разнородных конекстов, спрингового и вебсокета, другими словами необходимо чтобы спринговый компонент шарился между собственно спрингом и веб сокетом. Чтобы лучше понять задачу, то представим такую ситуацию. Допустим у нас есть обычное спринговое приложение которое поднимает бины в которых хранинтся какая-то дата. Затем к этому приложению добавляется требование обмениваться этими данными, которые хранятся в бине, с другим приложением через веб сокет. Так как спринг и вебсокет поднимаются в разных контекстах, то получить вебсокету данные из спрингового бина чтобы их передать не получиться, в этом случае надо два контекста как-то объединить, другими словами надо настроить между ними мостик, чтобы контекст вебсокета имел доступ к спринговому контексту и передавать данные вытащенные из спринга. В этом посте рассмотрим как создавать этот мост между спрингом и вебсокетом.

Continue reading

Простой Spring MVC

Синопсис

Так как Spring MVC проект сам по себе является сервлетом, то прежде чем разбираться как устроен Spring MVC надо сначала разобраться с простым сервлетом. Простой сервлет описан здесь, а в этом посте возьмём простой сервлет и обвешаем его Spring MVC, JPA, моделями, вьюшаками, контролером и пр. чтобы получилось простое веб приложение как того требует паттерн MVC и в котором запрашивается информация о поставщиках из базы данных и эта информация должна отображаться в представлении. Это самый минимум необходимый для понимания как создается проект Spring MVC. Для того, чтобы продемонстрировать саму суть Spring MVC нет смысла перегружать веб приложение всякими логинпйэджами, юзерами, интернационализацией, темами, стилями, менюшками, заголовками, всё это очень интересно и оно придало бы веб приложению законченный вид, но чтобы добавить только одну поддержку, например, css стилей требуется добавить много кода разбросанных по разным файлам, а для поддержки этого кода нужны свои либы, так что нужно ещё добавить зависимости, а это не упросит задачу разобраться в сути построения спрингового веб приложения, так что в этом посте будет только отображение информации и всё, но будут наглядно продемонстрированы все этапы прохождения данных от запроса в браузере до запроса в базе данных и от извлечения данных из базы до вывода на веб странице.
Continue reading

Аудит и отслеживание версий для сущностных классов в Spring

Синопсис

Аудит и отслеживание версий бизнес данных применяется в более или менее серьёзных корпоративных приложениях. Так как такие сущности как поставщик, склад и продукция являются основными бизнес объектами манипулирования в нашем приложении, то может возникнуть потребность за ними наблюдать, другими словами может потребоваться иметь информацию о том кто изменил состояние объекта (это называется аудит) а также какое состояние этот объект имел до этого изменения или какое состояние у этого объекта было несколько изменений назад (это называется версионированием), то есть мы хотим держать всю систему под колпаком. В этом посте мы рассмотрим два этих аспекта (аудит и версионирование сущностных классов) на пример нашего приложения по работе со складской базой данных Warehouse.
Continue reading

JPA и Spring

Синопсис

В прошлом посте мы рассматривали доступ к данным через JPA. В этом посте мы будем делать все тоже самое, только JPA приложение будет подниматься на спринге. Подробно об JPA было описано в прошлом посте, в этом посте только укажу на отличие обычного JPA проекта от спрингового.
Continue reading

Основы JPA

Синопсис

В прошлых постах посвященных хибернэйту Hibernate (конфигурация в стиле аннотации) и Hibernate (конфигурация spring) мы рассмотрели как поднять простое приложение которое обращается к базе данных через хибернэйт. В этом посте речь пойдет о доступе к данным через JPA. JPA можно рассматривать как следующий этап эволюции, сначала к базе данных обращались через JDBC, потом через ORM-фрэймоворки и вот теперь через JPA. В этом посте мы шаг за шагом создадим простое JPA приложение, подобное тем, которые мы создавали в предыдущих постах когда мы рассматривали хибернейт.
Continue reading

Hibernate (конфигурация spring)

Синопсис

В этом посте создадим простое приложение подобное тому, которое было в двух предыдущих постах Hibernate (конфигурация в стиле xml) и Hibernate (конфигурация в стиле аннотации), только теперь хибернейт конфигурироваться будет спрингом. В этом случае у нас сразу уйдут два класса, это HibernateUtil.java так как теперь хибернейтовская сессия будет подниматься спрингом, и фэктори класс Factory.java, так как все dao-классы у нас становятся бинами и, соответственно, мэнэджеться будут спрингом. Описывать проект я здесь не буду, он такой же как в посте Работа с базой данных через JDBC

Проект можно взять с гитхаба: https://github.com/dev-blogs/spring-hibernate
Continue reading

Hibernate (конфигурация в стиле аннотаций)

В прошлом посте мы создали простое приложение которое работает с базой данных через фреймворк hibernate. В этом посте создаваемая нами программа будет делать все тоже самое, только для конфигурирования сущностных классов будем использовать не xml файлы с расширением hbm.xml, а добавим конфигурацию в сами сущностные классы в виде аннотаций. Так же в этом посте для сборки приложения мы воспользуемся мавеном, так как сборка проекта из терминала хорошо описана в предыдущем посте.
Continue reading

Hibernate (конфигурация в стиле xml)

Синопсис

В этом посте создадим простое приложение, которое будет работать с базой данных через фреймворк hibernate и выводить все имеющиеся данные которые хранятся в базе данных. Суть приложения точно такая же как я описывал в посте Работа с базой данных через JDBC, только вместо JDBC теперь будем использовать фреймворк hibernate. Hibernate — это средство доступа к данным, его идея заключается в том, что программа оперирует не записями и полями, а объектами. То есть мы работаем с базой данных в стиле ООП, когда из базы данных мы вытаскиваем уже готовые объекты, а если таблицы в базе данных связаны между собой, то объекты будут содержать в себе массивы ассоциированных с ним объектов, то есть если мы достаем объект склад, то hibernate сформирует запрос и свяжет таблицу склады с таблицей товары и выдаст нам объект Склад который будет содержать в себе массив объектов Товар, потому что в базе данных таблицы Склады и Товары связаны по внешнему ключу.
Конфигурировать hibernate будем старым способом, то есть используя xml файлы с расширением .hbm.xml, а в следующем посте мы переделаем на конфигурации в стиле аннотаций.
Continue reading

Работа с базой данных через Spring

Синопсис

В предыдущем посте Работа с базой данных через JDBC шаг за шагом создали приложение взаимодействующее с базой данных на уровне JDBC. В этом посте напишем подобное приложение, но взаимодействие с базой данных будет осуществляться через платформу Spring, в частности в этом приложении управление источником данных переложим на Spring.
Continue reading

Работа со встроенной базой данных H2

Синопсис

В прошлом посте Работа с базой данных через JDBC мы прошли шаг за шагом по реализации приложения которое взаимодействует с базой данных. Для хранения данных была выбрана СУБД MySQL. В этом посте мы создадим такое же приложение, но в качестве базы данных будет использоваться дефолтовая база данных H2. Дефолтовая, потому что она используется только на этапе разработки приложения, пока еще мы не определились с конкретной базой данных. Это делается для того, чтобы не приходилось настраивать полный энвайронмент для запуска приложения, который к тому же может поменяться.
Continue reading

Работа с базой данных через JDBC

Синопсис

JDBC предоставляет java-приложениям стандартный способ доступа к данным, хранящимся в базе данных. Для того, чтобы инфраструктура JDBC могла работать с базой данных, нужен специфичный для конкретной базы данных драйвер.
Сначала этот драйвер загружается в память, затем он регистрируется с помощью класса java.sql.DriverManager. Класс java.sql.DriverManager управляет списком драйверов и предоставляет статические методы для установления подключения к базе данных.
Статический метод getConnection() класса java.sql.DriverManager возвращает интерфейс java.sql.Connection реализация которого предоставляется драйвером. Этот интерфейс позволяет запускать SQL-операторы для любой базы данных (в данном случае для той, для которой зарегистрирован драйвер).
В этом посте рассмотрим взаимодействие с базой данных через чистый JDBC. Так как подключение к базе данных через JDBC является затратным, кроме того для каждого запроса к базе данных будет создаваться новое подключение, то вариант работы приложения с базой данных приведенный в этом посте не является правильным решением, смысл тут в том, чтобы по работать с базой данных через чистый JDBC чтобы иметь представление о том, какие действия предпринимаются для управления подключением JDBC, потому что в обычных проектах работать с JDBC на прямую не придется, а в следующем посте рассмотрим более правильные способы, например, через пул подключений.
Continue reading

Разделяемый бин JSR-330 для разных контейнеров IoC

Синопсис

Иногда очень часто бины выполняют достаточно общие операции, это может быть обращение к базе данных или вывод чего-нибудь куда-нибудь, в общем в разных бинах приходится реализовывать схожую логику. В этом случае, если в разных приложениях, запускаемые в разных контейнерах, будет схожий функционал, то нам придется переписывать одинаковый код для разных бинов в разных приложениях. Поэтому хорошим решением будет написать некий общий бин, который будет использоваться во всех приложениях один раз и везде, где он будет требоваться просто подключать к этому приложению библиотеку с этим бином. В этом подходе есть только один недостаток, если бин аннотирован спринговыми аннотациями, а приложение, которому требуется логика из этого бина построено с использованием контейнера Google Guice, то такой бин становится не совместимым с этим приложением. Такой проблемы не будет, если этот бин будет старого типа, то есть POJO класс. В этом случае достаточно прописать этот бин в конфигурационном файле или в конфигурационном классе. Но если этот бин с аннотациями то его можно использовать только в том контейнере, который эти аннотации поддерживает. Чтобы было возможно использовать аннотированный бин в разных контейнерах, то его аннотации должны соответствовать аннотациям, которые поддерживаются всеми контейнерами. Одним из таких стандартов можно называть JSR-330 который мы рассмотрим в этом посте.
Continue reading

Как настроить sudo юзера во FreeBSD

Синопсис

Во фре пользователь если входит в группу wheel (если конечно при установке он был включен в группу wheel), не ознает, что если нам нужно сделать что-то с правами суперпользователя, например создать другого юзера, то мы можем написать как-то так:

sudo adduser

Continue reading

Настройка графического окружения во FreeBSD

Синопсис

После того как freeBSD установлена и запущена, то первое, что мы увидим это командную строку. Работать в командной строке не то чтобы не удобно, потому что очень даже удобно, а скорее не по используешь машину как развлекательный медиа центр, и то можно из командной строки слушать музыку, короче говоря, зачем нужна во freeBSD графическая среда каждый решает для себя сам, а в этом посте мы пройдем по шагам как превратить командную строку в графическую среду.
Continue reading

Установка gradle плагина в eclipse

Синопсис

В посте Установка maven плагина для Eclipse мы прошли по шагам установку мавен плагина для эклипса. Теперь пришло время установить поддержку инструмента gradle в эклипсе. Начем пост с установки плагина gradle, а в конце поста импортнем в эклипс градловский проект из этого поста и собирем проект с помощью установленного плагина gradle.
Continue reading

Шифрование методом Диффи-Хеллмана

Синопсис

Метод Диффи-Хеллмана используется для шифрования сообщения передаваемого через незащищенный канал связи. То есть если в кратце то есть среда передачи данных между узлами А и Б, и между ними засел шпион. Этот метод применим только тогда, когда этот шпион может только снимать сигнал из незащищенной среды, но не может выдавать себя за отправителя сообщения А для получателя Б или за отправителя Б для получателя А, в этом случае метод Диффи-Хеллмана не годится, далее будет понятно почему. То есть мы рассматриваем случай, когда шпион вклинивается в канал передачи сообщения и хочет подслушать о чем переговариваются А и Б.
Continue reading

JNI в Windows

Синопсис

В этом посте поговорим о вызовах функции библиотеки c++ из java класса. Это довольно интересная тема, я достаточно много времени потратил чтобы понять как осуществляется взаимодействие кода выполняющегося в виртуальной машине джава с нативным кодом.
В этом посте, тестировать взаимодействие будем на платформе Windows, а в следующем сделаем тоже самое, но только в Linux.
Continue reading

REST колы и web сокеты на Jetty сервере (часть 3)

Синопсис

В этом посте продолжается серия постов про Jetty сервер. В первом посте данной серии мы создали простой Jetty сервер и запустили его. Во втором посте мы подвесили на наш jetty сервер веб сокеты, тем самым мы превратили его из просто jetty сервера в jetty сервер с веб сокетами. И наконец в этом посте мы еще довашаем на jetty сервер REST колы. Таким образом у нас должен получиться Jetty сервер с веб сокетами и REST колами. В принципе мы уже поднимали REST колы на Jetty сервере, это было в посте Как поднять CXF Servlet, но в этот раз мы сделаем немного по другому. Если тогда, мы создавали обычное веб приложение в виде стандартного варника, который мы затем деплоили в каталог webapp контейнера сервлетов и за тем запускали контейнер сервлетов, то в этот раз, мы обойдемся без контейнера сервлетов. Мы создадим некий гибрид который будет одновременно и веб и исполняемым приложением. То есть для того чтобы заработали наши REST колы, нужно чтобы варник поднялся Jetyy сервером. Для этого можно пойти двумя путями, либо закинуть варник в webapp каталог контейнера как мы это уже делали, либо запустить собственный jetty сервер из под этого варника, в этом случае он становится еще и java приложением. Мы запускаем Jetty сервер который поднимает REST колы находящиеся в нем же.
Continue reading

Embedded jetty server (часть 1)

Синопсис

В этом посте мы создадим небольшое приложение, которое будет поднимать jetty веб-сервер. Приложение будет из себя представлять простой джарник с main методом, в котором будет запускаться jetty сервер. В дальнейшем (это уже будет другой пост) мы до вешаем на наш веб сервер веб сокеты и REST колы. Специально для REST колов мы переделаем джарник в варник с сохранением функции запускаемого приложения, почему так будет понятно позже. А сейчас приступим к созданию простого приложения, которое поднимает jetty сервер, а сейчас это будет jar-архив, который будет запускаться как обычное java-приложение, а позже, когда мы переделаем его в war-архив, он так же будет запускаться как обычное java приложение, несмотря на то, что это будет варник, и так же будет одновременно еще и вэб прилжением, который можно будет положить в контейнер сервлетов.
Continue reading

Сборка и настройка tomcat

Синопсис

В сегодняшнем посте рассмотрим весь процесс компиляции tomcat из исходников, а затем его настроим и запустим. Эксперимент будем проводить на linux ubuntu на примере tomcat 7.
Первый вопрос который может появится, что тут сложного? А второй, зачем вообще его компилировать из исходников, если можно взять уже готовый бинарный дистрибутив? Ну во-первых это вообще интересно как этот tomcat собирать из исходников, а во-вторых все кто когда-либо имел дело с установкой tomcat, вся его установка сводилась к скачиванию бинарного дистрибутива и его запуском, то есть выполнением скрипта ./startup.sh, а в виндовс мире так там вообще все еще проще, там инсталятор создает ярлыки запуск в меню start. Тут же мы пройдем через все шаги от скачивания исходников, до более или менее тонкой настройки tomcat.
Continue reading

Spring в двух словах

Синопсис

В прошлых двух постах Простое spring приложение (собрано shell скриптом) и Простое Spring приложение с использованием аннотации @Autowired мы обсудили что такое Spring, но при этом мы слишком глубоко погрузились в детали, поэтому эти посты получились слишком длинные. В этом посте я хочу максимально кратко в двух словах рассказать, что такое Spring и напишем небольшое спринговое приложение и избежим всех этих тонкостей со сборкой и запуском приложения из командной строки, поэтому воспользуемся мавеном.
Continue reading

Простое Spring приложение с использованием аннотации @Autowired

Синопсис

В прошлом посте когда мы создавали простое spring приложение, для связывания компонентов мы использовали конфигурационный xml файл. Но этот подход с xml файлом основан на old style Spring то есть на спринге до аннатационных времен. В этом посте поднимем такое же приложение, только для связывания бинов будем использовать аннтоации, точнее аннотацию @Autowired. Всю вводную теорию по спрингу как смог раскрыл в прошлом посте, в этом буду указывать только на отличия от подхода создания спрингового приложения которое связывается с помощью конфигурационного xml файла от спрингового приложения, которое связывается аннотацией @Autowired.

Так как в этом посте я подробно рассказываю про спринг, поэтому он получился немножко длинный, кто хочет описание по короче и перейти сразу к делу, то может заглянуть в пост Spring в двух словах
Continue reading

Простое spring приложение (собрано shell скриптом)

Синопсис

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

Так как в этом посте я подробно рассказываю про спринг, поэтому он получился немножко длинный, кто хочет описание по короче и перейти сразу к делу, то может заглянуть в пост Spring в двух словах
Continue reading

Web service JAX-WS

Синопсис

В этом посте рассмотрим пример создания веб сервиса спецификации JAX-WS.
Начну с того, что вообще означает это словосочетание «спецификация JAX-WS». Вообще это означает, что есть некий стандарт называемый JAX-WS или если полностью Java API for XML Web Services который задает некие правила или контракт, которого надо придерживаться при его реализации. Так вот в этой статье мы не будем его реализовывать, в смысле контракт, мы будем этим контрактом пользоваться. А точнее, мы будем пользоваться конкретной реализацией спецификации JAX-WS. В мире есть несколько реализаций спецификации JAX-WS, ну например Apache Axis2. Continue reading

Установка maven плагина для Eclipse

Синопсис

Мавен это удобный сборщик проектов, который берет на себя всю работу по разрешению зависимостей. То есть допустим мы собираем проект, для компиляции и сборки которого необходима библиотека A. Для того, чтобы проект собрался с зависимостью на библиотеку A, достаточно (предварительно где-то его взяв) после ключа -cp утилиты javac прописать путь к джарнику (в эклипсе это свойства проекта->Java Build Path->вкладка Libraries->Add External JARs…), который представляет библиотеку A. Но что делать если библиотека A зависит от библиотеки B, которая зависит от библиотеки C? Искать по интернету все эти зависимости, занятие, мягко говоря, бесперспективное. Вот для этого мавен и нужен, мы лишь только указываем ему, что для компиляции и сборки проекта нам нужна либа A и все, а если либа A сама зависит от других либ, то об этих зависимостях мавен позаботиться сам, какими бы глубокоуровневыми они не были. Continue reading

Установка WTP плагина для Eclipse

Синопсис

Eclipse довольно таки удобный инструмент, но часто требуется от него те возможности, которых в стандартной версии classic нету. Для расширения его функциональности существуют плагины. Один из полезных плагинов, который мы рассмотрим в этом посте, называется WTP. WTP (Web Tools Platform) удобный плагин, с помощью которого можно разворачивать вэб приложение прямо в среде разработки эклипс, там же его можно собрать и запустить на вэб сервере. Конечно, более простой способ скачать версию эклипса который уже идет со всеми необходимыми плагинами, как например Eclipse IDE for Java EE Developers, но если версия classic вполне устраивает, и для полного удобства не хватает только одного, двух плагинов, то быстрее будет установить соответствующий плагин через Install New Software. Continue reading

cxf-maven проект на Eclipse

Синопсис

В продолжении поста о том, как поднимать CXF Servlet используя командную строку, сегодня поговорим о том как делать тоже самое, только используя maven+Eclipse.
Для этого примера нам потребуется:

  1. Среда разработки Eclipse
  2. Установленный плагин m2eclipse-wtp который поддерживает работу с maven приложениями в eclipse. Как этот плагин установить подробно описано в посте Установка maven плагина для Eclipse
  3. Установленные плагины Web Tools Platform (WTP) 3.2.5 и Web Tools Platform SDK (WTP SDK) 3.2.5 которые поддерживают запуск вэб приложения из эклипса. Как эти плагины установить подробно описано в посте Установка WTP плагина для Eclipse

Continue reading

Backup и restore в MySQL

1. Создание бэкапа

Чтобы создать backup базы данных MySQL создайте какой-нибудь каталог, например backup и затем создайте в нем shell скрипт командой

touch backup_db_mysql.sh

Continue reading

Как поднять CXF Servlet

Сегодня будем поднимать простое CXF приложение, которае выводит в браузере простое сообщение test Servlet.

Для этого нам потребуется:

  1. JDK
  2. Tomcat
  3. Библиотеки поддерживающие cxf. Скачайте архив, распакуйте его и просто закиньте каталог lib в корень проекта, ссылку найдете чуть ниже
  4. Командная строка, где мы будем запускать shell скрипт, который мы напишем сами

Continue reading