Spring + Vaadin шаблоны проектирования интеграции - PullRequest
3 голосов
/ 15 ноября 2011

Какие шаблоны проектирования используются при интеграции пружины с vaadin / gwt? В нашем приложении мы используем spring с hibernate, каждый dao - это bean-компонент. Вопрос в том, как лучше всего использовать их на стороне Ваадина?

Опции, которые мы нашли на данный момент:

  • создание всех элементов управления vaadin для весенних бобов (иногда это может быть трудно ..., используя прототип scope etcc)
  • с использованием ткачества времени компиляции - однако очень неприятно запускать maven install после каждого изменения, когда компиляция занимает несколько минут
  • Плетение времени загрузки конфликтует с atomikos
  • создание какого-то bean-менеджера, который автоматически связал все необходимые daos и вернул свой экземпляр, как в одиночном

Ответы [ 5 ]

2 голосов
/ 26 октября 2013

Я бы порекомендовал использовать механизм Vaadin UIProvider . Таким образом, автоматическое подключение в пользовательском интерфейсе полностью прозрачно.

Вы можете взглянуть на действительно простой пример, который использует это решение на github: spring-vaadin-example

2 голосов
/ 30 января 2012

Попробуйте мой Spring Stuff Дополнение Vaadin, в котором есть несколько полезных классов для интеграции Vaadin и Spring.

На GitHub есть демонстрация , которая показывает, как она работает.

1 голос
/ 06 августа 2012

Какие шаблоны дизайна используются при интеграции пружины с vaadin / gwt?

Небольшое изменение того, что было предоставлено выше.Он работает для меня и очень прост, поэтому я публикую его здесь.

Я добавил следующее в web.xml и использовал точную ссылку на путь к классу для Spring-контекста зависимости (измените путь в соответствии с вашими потребностями):

<!-- Spring context loader -->
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>      
</listener>
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:com/company/appserv/spring/spring-context.xml</param-value>
 </context-param>

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

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>${org.springframework.version}</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>2.5</version>
</dependency>

Теперь создайте следующий класс:

import com.vaadin.Application;
import com.vaadin.terminal.gwt.server.WebApplicationContext;
import javax.servlet.ServletContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SpringContextHelper {

private ApplicationContext context;

private static Logger logger = LoggerFactory.getLogger(SpringContextHelper.class);

public SpringContextHelper(Application application) {
    ServletContext servletContext = ((WebApplicationContext) application.getContext()).getHttpSession().getServletContext();
    context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
    logger.debug("Number of beans: {}",context.getBeanDefinitionCount());
}

public Object getBean(final String beanRef) {
    return context.getBean(beanRef);
}    
}

И теперь создайте свой класс DAOкак предложено в предыдущем посте):

import com.company.appserv.dbo.DatabaseHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vaadin.Application;

public class DAO {

private static DatabaseHelper databaseHelper;

private static Logger logger = LoggerFactory.getLogger(DAO.class);

public static final void initialize(Application application) {
    logger.debug("DAO initializing...");
    if (databaseHelper == null) {
        logger.debug("Creating databaseHelper...");
        SpringContextHelper helper = new SpringContextHelper(application);
        databaseHelper = (DatabaseHelper)helper.getBean("databaseHelper");
    }
}

public static DatabaseHelper getDatabaseHelper() {
    return databaseHelper;
}
}

Наконец, обязательно инициализируйте ваш DAO, который вы теперь будете использовать в различных классах представлений.Эта инициализация будет происходить в любом классе, который вы расширили Application, как показано ниже:

import com.vaadin.Application;
import com.vaadin.ui.Window;

/**
 * The Application's "main" class
 * 
 * Vaadin framework associates requests with sessions so that 
 * an application class instance is really a session object.
 */
@SuppressWarnings("serial")
public class VoucherTool extends Application
{
  private Window mainWindow;

  @Override
  public void init() {
    mainWindow = new Window("Application");
    setMainWindow(mainWindow);

    // Needed because composites are full size
    mainWindow.getContent().setSizeFull();

    LoginView myComposite = new LoginView();
    mainWindow.addComponent(myComposite);
    setTheme("applicationtheme");

DAO.initialize(this);
 }
}
1 голос
/ 16 декабря 2011

Немного поиграв с Vaadin и Spring, мы решили использовать бины Spring только для классов DAO, где внедрение PersistenceContext действительно очень удобно. Все остальные классы, включая, но не ограничиваясь, элементы управления Vaadin, являются «обычными» классами без контроля Spring над ними.

После этого решения актуальным становится вопрос: «Как получить DAO с поддержкой Spring в коде, не связанном со Spring?» Мы выбираем быстрое и грязное решение, которое «просто работает» с минимальными хлопотами.

0) Добавлены два слушателя Spring и фильтр в web.xml:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<filter>
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
    <servlet-name>BlahBlah Application</servlet-name>
</filter-mapping>

1) Создайте местозаполнитель приложения для всех компонентов службы, управляемых Spring:

public class DAO {
    private static Logger log = Logger.getLogger(DAO.class);

    private static BlahBlahService blahBlahService;
    private static AnotherService anotherService;

    public static final void initialize(ApplicationContext context) {
        log.info("DAO initializing...");
        blahBlahService = context.getBean( BlahBlahService.class );
        anotherService = context.getBean( AnotherService.class );
    }

    public static BlahBlahService getBlahBlahService() {
        return blahBlahService;
    }
    public static AnotherService getAnotherService() {
        return anotherService;
    }
}

2) Обычно объявляйте классы Spring-service с помощью аннотации стереотипа @Service.

3) Сервлету приложения Vaadin разрешена загрузка при запуске. Фактический метод init () выполняет следующие действия:

@Override
public void init( ServletConfig config ) throws ServletException {
    Logger.getLogger( InitServlet.class ).info( "init()..." );

    super.init( config );

    WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext( config.getServletContext() );

    DAO.initialize( wac );
}

4) Код приложения должен вызывать DAO.getThisOrThatService () и работать с ним нормально.

0 голосов
/ 14 ноября 2016

В наши дни де-факто используется официальная библиотека интеграции Vaadin Spring . Это делает классы пользовательского интерфейса Spring управляемыми bean-компонентами и предоставляет удобные области, связанные с Vaadin. Затем вы можете решить, основываясь на ваших требованиях, сколько ваших вспомогательных классов в коде пользовательского интерфейса вы хотите сделать бинами Spring. По крайней мере, подумайте о создании, например, все виды Spring удалось.

Сервис start.spring.io содержит возможность добавить соответствующие зависимости Vaadin Spring, а затем просто создать класс пользовательского интерфейса и добавить к нему аннотацию @SpringUI. Нет необходимости создавать VaadinServlet отдельно.

...