Внимание! В данной статье содержится зашкаливающее количество волшебства, а также отсутствует логика и здравый смысл. По окончанию прочтения данной статьи вам будет присвоен титул Великого Шамана. Добро пожаловать под кат, юный хобитс… Для начала создадим проект Spring Boot + Vaadin.

Vaadin 7.5 + Spring Boot + компилирование WidgetSet (Maven)

Внимание! В данной статье содержится зашкаливающее количество волшебства, а также отсутствует логика и здравый смысл. По окончанию прочтения данной статьи вам будет присвоен титул Великого Шамана. Добро пожаловать под кат, юный хобитс… Для начала создадим проект Spring Boot + Vaadin.
Рабочий плагин Spring Boot для Gradle

Этот код нужно добавить в build.gradle:
1 2 3 4 5 6 7 8 9 10 11 |
buildscript { repositories { mavenLocal() mavenCentral() maven { url 'http://repo.spring.io/libs-release' } } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.1.8.RELEASE' } } apply plugin: org.springframework.boot.gradle.SpringBootPlugin |
HTTP Invoker в Spring Boot

Для того, чтобы объявить HTTP invoker в Spring Boot необходимо просто создать бин HttpInvokerServiceExporter в конфигурации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@Configuration public class ServletConfig { @Autowired ContactService contactService; @Bean(name = "/remote/ContactService") public HttpInvokerServiceExporter contactExporter() { HttpInvokerServiceExporter serviceExporter = new HttpInvokerServiceExporter(); serviceExporter.setService(contactService); serviceExporter.setServiceInterface(ContactService.class); return serviceExporter; } } |
Vaadin. Обновление UI в потоке

Для того, чтобы форма UI обновлялась автоматически, нужно в init просписать интервал обновления UI.getCurrent().setPollInterval(500);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
@Theme("mytheme") @SuppressWarnings("serial") public class MyVaadinUI extends UI implements Runnable{ private ApplicationContext context; private MeasurementRepository measurementRepository; private VerticalLayout layout; @WebServlet(value = "/*", asyncSupported = true) @VaadinServletConfiguration(productionMode = false, ui = MyVaadinUI.class, widgetset = "ru.test.AppWidgetSet") public static class Servlet extends VaadinServlet { } @Override protected void init(VaadinRequest request) { context = new AnnotationConfigApplicationContext(Config.class); measurementRepository = context.getBean(MeasurementRepository.class); layout = new VerticalLayout(); layout.setMargin(true); setContent(layout); UI.getCurrent().setPollInterval(500); new Thread(this).start(); } @Override public void run() { while(true){ ArrayList<measurement> measurements = Lists.newArrayList(measurementRepository.findAll()); for (Measurement measurement : measurements) { layout.addComponent(new Label(measurement.toString())); } try { Thread.sleep(1000); } catch (final InterruptedException e) { e.printStackTrace(); } } } } |
JMS + Spring. Обмен сообщениями

JMS – это стандарт промежуточного ПО для рассылки сообщений между клиентами. В этом примере будет рассматриваться ActiveMQ JMS сервер. Сделаем простой месседжер. Сначала скачаем и установим сервер: http://activemq.apache.org/activemq-5111-release.html (на момент написания статьи самая свежая версия 5.11.1) Распаковываем и запускаем winXX/activemq.bat.
Простой Spring MVC + Spring Data JPA без XML

В этой статье содержится инструкция по созданию простого web- приложения. Используются технологии: Java 8 Gradle Spring MVC 4.1.6 (Java Config) Spring Data JPA 1.8.1 Hibernate 5 Javax Servlet API 3.1.0 (Java Config) Итоговая структура проекта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
apply plugin: 'java' apply plugin: 'war' repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' compile 'org.springframework:spring-context:4.1.6.RELEASE' compile 'org.springframework:spring-webmvc:4.1.6.RELEASE' compile 'org.springframework.data:spring-data-jpa:1.8.1.RELEASE' compile 'mysql:mysql-connector-java:5.1.36' compile 'org.hibernate:hibernate-core:5.0.0.CR1' compile 'org.hibernate:hibernate-entitymanager:5.0.0.CR1' compile 'com.google.guava:guava:18.0' compile 'javax.servlet:javax.servlet-api:3.1.0' compile 'javax.servlet:jstl:1.2' } |
Начинаем с конфигурации развертывания
Установка AspectJ и интеграция с IntelliJ IDEA и Spring

Инструкция по установке AspectJ от Eclipse в Windows 7,8 с последующей интеграцией в среду разработки IntelliJ IDEA и использовании в проектах Spring Качаем AspectJ с сайта Eclipse http://eclipse.org/aspectj/downloads.php (на момент написания статьи последняя версия 1.8.5, Released 28 Jan 2015) Скаченный
Паттерн Абстрактная Фабрика

Описание: Паттерн Абстрактная фабрика предназначен для создания групп объектов, связанных между собой по смыслу. Например, каждая из реализаций Абстрактной фабрики может быть предназначена для определенной операционной системы. В качестве такой фабрики можно представить модель данных, реализации компонент которой могут меняться.
Паттерн Фабричный метод
Описание: Паттерн Фабричный метод необходим для ликвидирования зависимости кода от создания конкретных объектов. Создание экземпляра объекта выделяется в абстрактный метод фабрики, который реализуется потомком этой фабрики. В основу паттерна заложен принцип наследования. Пример:
1 2 3 4 5 6 |
public class Main { public static void main(String[] args){ ChineseFactory chineseFactory = new ChineseFactory(); chineseFactory.displayUnit(); } } |
1 2 3 4 |
Name: Chinese -_- /|\=|--- / \ |
Коды классов:
1 2 3 4 5 |
public interface Unit { String getName(); String getFace(); String getWeapon(); } |
1 2 3 4 5 6 7 8 9 10 |
public abstract class UnitFactory { public void displayUnit(){ Unit unit = getUnit(); System.out.println("Name: "+unit.getName()); System.out.println(unit.getFace()); System.out.println("/|\\"+unit.getWeapon()); System.out.println("/ \\"); } abstract Unit getUnit(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class ChineseFactory extends UnitFactory { @Override Unit getUnit() { return new Unit() { @Override public String getName() { return "Chinese"; } @Override public String getFace() { return "-_-"; } @Override public String getWeapon() { return "=|---"; } }; } } |